ฟังก์ชั่นที่ใช้แปลงชนิดข้อมูล

Report
1
• ในบทนีจ้ ะอธิบายการทางานกับเลขจานวน (Numbers)
2
• บรรยายโดยผู้สอนและใช้ เอกสารประกอบการสอนของ
ผู้สอน
• สอนโดยใช้ ส่ือคอมพิวเตอร์ ผ่านเครื่ องฉาย
• อภิปรายในชั้นเรี ยนร่ วมกัน
่ เติมจากตาราและเอกสารทีเ่ กี่ยวข้ อง
• ให้ นิสิตค้ นคว้ าเพิม
• ทาแบบฝึ กหัดท้ ายบท
3
• ประเมินผลจากการตอบคาถามและอภิปรายในชั้นเรี ยน
• ทาแบบฝึ กหัดท้ ายบท
• ทารายงานส่ ง
4
สามารถเขียนค่ าจานวนเต็ม (Integer Literal)ในรู ปฐานสิบ (Decimal),
ฐานสิบหก (Hexadecimal) หรื อฐานแปด (Octal) ก็ได้ การเขียนค่ าในรู ปฐาน
แปดให้ นาหน้ าด้ วย 0 (ศูนย์ ) และการเขียนค่ าในรู ปฐานสิบหกให้ นาหน้ าด้ วย
0x (ศูนย์ เอ็กซ์ ) เช่ น
$a = 1234;
$a = -123;
$a = 0123;
$a = 0x1A;
// ค่าจานวนเต็มในรูปฐานสิบ
// ค่าจานวนเต็มลบในรูปฐานสิบ
// ค่าจานวนเต็มในรูปฐานแปด (มีคา่ เท่ากับ 83 ฐานสิบ)
// ค่าจานวนเต็มในรูปฐานสิบหก (มีค่าเท่ากับ 26 ฐานสิบ)
5
ถ้ าหากระบุค่าจานวนเต็มที่เกินช่ วงค่ าของชนิดข้ อมูล Integer
PHP จะกาหนดเป็ นชนิดข้ อมูล float ให้ แทน และถ้ าดาเนินการใดๆ
ที่ให้ ผลลัพธ์ เป็ นเลขจานวนเต็มที่เกินช่ วงค่ าของชนิดข้ อมูล integer
ผลลัพธ์ นัน้ ก็จะกลายเป็ นชนิด float เช่ นเดียวกัน
6
<?
$number1 = 2147483647;
echo "บรรทัด 1 : ";
var_dump($number1); // แสดงค่าและชนิดข้ อมูลของตัวแปร $number1
echo "<br>";
$number2 = 2147483648;
echo "บรรทัด 2 : ";
var_dump($number2); // แสดงค่าและชนิดข้ อมูลของตัวแปร $number2
echo "<br>";
echo "บรรทัด 3 : " ;
var_dump(0xffffffff); // แสดงค่าและชนิดข้ อมูลของค่า ffffffff ฐานสิบหก
echo "<br>";
$million = 1000000;
$large_number = 50000 * $million ; // กาหนด $large_number มีค่า 5 หมื่นล้ าน
echo "บรรทัด 4 :" ;
var_dump($large_number); // แสดงค่าและชนิดข้ อมูลของตัวแปร $large_number
echo "<br>";
?>
integer_overflow.php
7
ตัวดาเนินการ / (หาร) ในภาษา PHP จะให้ ผลลัพธ์ เป็ น
ค่ าชนิด float เสมอ แม้ ว่าตัวถูกดาเนินการจะเป็ นชนิด
integer ทัง้ คู่กต็ าม อาจแปลงผลหารไปเป็ นชนิด integerโดย
ใช้ ตัวดาเนินการ (int) ซึ่งเศษจะถูกปั ดลง (ตัดทิง้ ) เสมอ หรือ
อาจประมาณค่ าเป็ นเลขจานวนเต็มโดยใช้ ฟังก์ ช่ ัน round ก็
ได้ (แต่ ค่าจานวนเต็มที่ได้ จะเป็ นชนิด float) ซึ่งเศษตัง้ แต่ 0.5
ขึน้ ไปจะถูกปั ดขึน้
8
<?
echo "บรรทัด 1 : ";
var_dump(25/7); // แสดงค่าและชนิดข้ อมูลของนิพจน์ 25/7
echo "<br>";
echo "บรรทัด 2 : ";
var_dump((int)(25/7)); // แสดงค่าและชนิดข้ อมูลของนิพจน์ 25/7 หลังจากแปลงเป็ น
ชนิด integer แล้ ว
echo "<br>";
echo "บรรทัด 3 : ";
var_dump(round(25/7)); // แสดงค่าและชนิดข้ อมูลของนิพจน์ 25/7 หลังจาก
ประมาณค่าเป็ นเลขจานวนเต็มโดยใช้ ฟังก์ชนั่ round แล้ ว
echo "<br>";
?>
integer_division.php
9
การแปลง (convert)ค่ าใดๆ เป็ นชนิด integerให้ ใช้ ตัวดาเนินการ (int) หรือ (integer)
ซึ่งการดาเนินการนีเ้ รียกว่ า Casting อย่ างไรก็ตาม ในกรณีส่วนใหญ่ ไม่ จาเป็ นต้ องทา
Casting เอง เนื่องจาก PHP จะแปลงค่ าเป็ นชนิด integer ให้ โดยอัตโนมัตอิ ยู่แล้ วถ้ าหากตัว
ดาเนินการ ฟั งก์ ช่ ัน หรือคาสั่งนัน้ ต้ องการค่ าชนิด integer ในการทางาน
การแปลงค่ าชนิดต่ างๆ เป็ นชนิด integer มีเงื่อนไขดังต่ อไปนี ้
• ถ้ าแปลงค่ าชนิด Boolean ไปเป็ น integer ค่ า FALSE จะกลายเป็ น 0 และค่ า TRUE จะกลายเป็ น 1
• เมื่อแปลงค่ าชนิด float ไปเป็ น integer ตัวเลขหลังจุดทศนิยมจะถูกตัดทิง้ ไป แต่ ถ้าค่ าชนิด float
นัน้ มีค่าเกินขอบเขตของชนิดข้ อมูล integer ผลลัพธ์ จะไม่ มีการกาหนด (undefined)
10
ค่ าจานวนทศนิยม (Float Literal) สามารถเขียนได้ หลายรู ปแบบ เช่ น
$a = 1.234;
$a = -1.2e3;
$a = 7E-5;
โดยรูปแบบ AeN ( e จะเป็ นตัวเล็กหรือตัวใหญ่ กไ็ ด้ ) จะหมายถึง A x 10N ดังนัน้ -1.2e3 จึง
เท่ ากับ -1.2 x 103 = -1200 และ 7E-5 เท่ ากับ 7 x 10-5 = 0.0007 (เป็ นค่ าบวก เนื่องจาก -5
คือเลขชีก้ าลังของ 10)
หมายเหตุ
ในรูปแบบ Aen หรื อ AEN นั ้น A สามารถเป็ นตัวเลขที่มีจดุ ทศนิยมได้ (เช่นค่าที่กาหนดให้ ตวั แปร $b
ข้ างต้ น) ส่วน N จะต้ องเป็ นจานวนเต็มเท่านั ้น แต่ทั ้ง A และ N อาจมีเครื่ องหมายลบข้ างหน้ าก็ได้
11
เป็ นเรื่องธรรมดาสาหรับชนิดข้ อมูล float ที่บางครัง้ การเก็บเลขจานวนทศนิยมง่ ายๆ
เช่ น 0.1 หรือ 0.7 จะมีการสูญเสียความแม่ นยา (precision) ของข้ อมูลไปบ้ างเล็กน้ อย ซึ่ง
อาจทาให้ ร้ ูสึกแปลกใจกับผลลัพธ์ ท่ ไี ด้ เช่ น
echo (int) ((0.1+0.7)*10)
ดังนัน้ จึงไม่ ควรไว้ ใจผลลัพธ์ ของการคานวณเลขทศนิยมมากเกินไป และไม่ ควร
เปรียบเทียบเลขทศนิยม 2 ค่ าว่ าเท่ ากันหรือไม่ (เพราะมีโอกาสที่มันจะไม่ เท่ ากันทัง้ ๆที่ควร
จะเท่ ากัน) ถ้ าต้ องการความแม่ นยาในการคานวณเลขทศนิยมจริงๆ ให้ ใช้ ฟังก์ ช่ ันในกลุ่ม
GMP หรือกลุ่ม BCMath ซึ่งสามารถกาหนดความแม่ นยาในการคานวณทางคณิตศาสตร์ ได้
เอง
12
convert_string_to_number.php
<?
$num = 1+"10.5"; // บรรทัด 1 : ค่าสตริง "10.5" จะถูกแปลงเป็ นค่า
จานวนทศนิยม 10.5
show_var($num);
$num = 1+"-1.3e3"; // บรรทัด 2 : ค่าสตริง "-1.3e3" จะถูกแปลงเป็ น
ค่าจานวนทศนิยม -1.3 x 10 หรื อ 1300
show_var($num);
$num = 1+"bob-1.3e3"; // บรรทัด 3 : ค่าสตริง "bob-1.3e3" จะถูก
แปลงเป็ นค่าจานวนเต็ม 0
show_var($num);
$num = 1+"bob3"; // บรรทัด 4 : ค่าสตริง "bob3" จะถูกแปลงเป็ นค่า
จานวนเต็ม 0
show_var($num);
$num = 1+"10 Small Pigs"; // บรรทัด 5 : ค่าสตริง "10 Small Pigs"
จะถูกแปลงเป็ นค่าจานวนเต็ม 0
show_var($num);
$num = 1+"10.2 Little Piggies"; // บรรทัด 6 : ค่าสตริง "10.2 Little
Piggies" จะถูกแปลงเป็ นค่าจานวนทศนิยม 10.2
show_var($num);
$num = "10.0 pigs "+ 1; // บรรทัด 7 : ค่าสตริง "10.0 pigs" จะถูก
แปลงเป็ นค่าจานวนทศนิยม 10.0
show_var($num);
$num = "10.0 pigs " + 1.0 ; // บรรทัด 8
show_var($num);
function show_var($var){
static $i = 1 ;
echo "บรรทัด {$i}: ";
var_dump($var);
echo "<br>";
$i++;
}
?>
13
หมายเหตุ
คุณไม่สามารถหารหัสแอสกี ้ (ASCII) ของตัวอักษรโดยใช้ วิธีแปลงตัวอักษรนั ้นไปเป็ น integer
(เหมือนที่ทาได้ ในภาษา C ) การแปลงระหว่างตัวอักษรกับค่าแอสกี ้ ให้ ใช้ ฟังก์ชนั่ ord และ chr โดย
ฟั งก์ชนั่ ord จะให้ ผลลัพธ์ เป็ นค่าแอสกี ้ของตัวอักษรที่กาหนด ส่วนฟั งก์ชนั่ chr จะให้ ผลลัพธ์เป็ นสตริง
ซึง่ บรรจุตวั อักษร 1 ตัวที่มีค่าแอสกี ้ตามที่กาหนด
14
• ฟั งก์ ช่ ัน is_int bool is_int (mixed ตัวแปร)
ใช้ ตรวจสอบตัวแปรหนึ่งๆ ว่ าเป็ นชนิด integer หรือไม่ โดยจะให้ ค่า TRUE ถ้ าใช่
และให้ ค่า FALSE ถ้ าไม่ ใช่
<?
$var1 = "8247";
$var2 = 76;
if(is_int($var1))
echo "\$var1 คือตัวแปรชนิด integer<br>";
else echo "\$var1 ไม่ใช่ตวั แปรชนิด integer<br>";
if (is_int($var2))
echo "\$var2 คือตัวแปรชนิด integer<br>";
else echo "\$var2 ไม่ใช่ตวั แปรชนิด integer<br>";
?>
15
• ฟั งก์ ช่ ัน is_float bool is_float (mixed ตัวแปร)
ใช้ ตรวจสอบตัวแปรว่ าเป็ นชนิด float หรือไม่ โดยให้ ค่า TRUE ถ้ าใช่ และให้ ค่า
FALSE ถ้ าไม่ ใช่
bool is_nummeric (mixed ตัวแปร)
• ฟั งก์ ช่ ัน is_nummeric
ใช้ ตรวจสอบว่ าตัวแปรเป็ นชนิดเลขจานวนหรือเป็ นสตริงตัวเลข (Numeric String)
หรือไม่ โดยจะให้ ค่า TRUE ถ้ าใช่ และให้ ค่า FALSE ถ้ าไม่ ใช่
16
is_numeric.php
<?
$var1 = "8247";
$var2 = "0-2619-0070";
if(is_numeric($var1))
echo "\$var1 คือเลขจานวนหรื อสตริงที่มีรูปแบบเป็ นเลขจานวน integer<br>";
else echo "\$var1 ไม่ใช่เลขจานวนหรื อสตริงที่มีรูปแบบเป็ นเลขจานวน integer<br>";
if (is_numeric($var2))
echo "\$var2 คือเลขจานวนหรื อสตริงที่มีรูปแบบเป็ นเลขจานวน integer";
else echo "\$var2 ไม่ใช่เลขจานวนหรื อสตริงที่มีรูปแบบเป็ นเลขจานวน integer";
?>
17
• ฟั งก์ ช่ ัน intval
int intval (mixed ตัวแปร)
ใช้ แปลงค่ าของตัวแปรที่ระบุไปเป็ นค่ าจานวนเต็ม แต่ ถ้าฟั งก์ ช่ ันทางานล้ มเหลว จะ
ให้ ค่า 0 การใช้ ฟังก์ ช่ ันนีก้ ับอาร์ เรย์ ไม่ มีสมาชิก (อาร์ เรย์ ว่าง) จะได้ ค่า 0 เสมอ แต่ ถ้าใช้ กับ
อาร์ เรย์ ท่ มี ีสมาชิกจะได้ ค่า 1 เสมอ
18
<?
echo "บรรทัด 1 : " . intval(42) . "<br>";
echo "บรรทัด 2 : " . intval(4.2) . "<br>";
echo "บรรทัด 3 : " . intval('42') . "<br>";
echo "บรรทัด 4 : " . intval('+42') . "<br>";
echo "บรรทัด 5 : " . intval('-42') . "<br>";
echo "บรรทัด 6 : " . intval(042) . "<br>";
echo "บรรทัด 7 : " . intval('042') . "<br>";
echo "บรรทัด 8 : " . intval(1e10) . "<br>";
echo "บรรทัด 9 : " . intval('1e10') . "<br>";
echo "บรรทัด 10 : " . intval(0x1A) . "<br>";
?>
intval.php
19
• ฟั งก์ ช่ ัน intval
int floatvar (mixed ตัวแปร)
ใช้ แปลงค่ าของตัวแปรที่ระบุไปเป็ นค่ าจานวนทศนิยม ในคู่มือ PHP
บอกว่ าฟั งก์ ช่ ันนีใ้ ช้ กับ อาร์ เรย์ ไม่ ได้ แต่ ผ้ ูเขียนทดลองแล้ วพบว่ าใช้ ได้ โดยจะ
ให้ ผลลัพธ์ เช่ นเดียวกับฟั งก์ ช่ ัน intval คือถ้ าอาร์ เรย์ ไม่ มีสมาชิกจะได้ ค่า 0
(ชนิด float) เสมอ แต่ ถ้าอาร์ เรย์ มีสมาชิกจะได้ ค่า 1 (ชนิด float) เสมอ
20
• ฟั งก์ ช่ ัน round float round (float เลขจานวน [, int ความแม่นยา])
หาค่ าประมาณของเลขจานวนโดยให้ มีความแม่ นยาตามที่กาหนด ความแม่ นยาจะหมายถึง
ตาแหน่ งของตัวเลขหลังจุดทศนิยมกรณีกาหนดความแม่ นยาเป็ นค่ าบวก สามารถกาหนดความแม่ นยาเป็ นค่ า
ศูนย์ หรื อค่ าลบได้ ด้วย (ดีฟอลต์ คือศูนย์ ) ซึ่งจะหมายถึงตาแหน่ ง ของตัวเลขข้ างหน้ าจุดทศนิยม (0 = หลัก
หน่ วย , -1= หลักสิบ ฯลฯ)
<?
echo "บรรทัด 1 : " . round(3.4) . "<br>";
echo "บรรทัด 2 : " . round(3.5) . "<br>";
echo "บรรทัด 3 : " . round(3.6) . "<br>";
echo "บรรทัด 4 : " . round(3.6,0) . "<br>";
echo "บรรทัด 5 : " . round(1.9583,2) . "<br>";
echo "บรรทัด 6 : " . round(1241757,-3) . "<br>";
echo "บรรทัด 7 : " . round(5.045,2) . "<br>";
echo "บรรทัด 8 : " . round(5.045,2) . "<br>";
?>
21
• ฟั งก์ ช่ ัน ceil
float ceil (float เลขจานวน )
ให้ ค่าเป็ นเลขจานวนเต็มโดยการปั ดเศษขึน้ ถึงแม้ ว่าผลลัพธ์ จะเป็ นเลขจานวนเต็ม
ศูนย์ แต่ ชนิดข้ อมูลของมันจะเป็ น float
• ฟั งก์ ช่ ัน floor float floor (float เลขจานวน )
ให้ ค่าเป็ นเลขจานวนเต็มโดยการปั ดเศษลง ถึงแม้ ว่าผลลัพธ์ จะเป็ นเลขจานวนเต็ม
แต่ ชนิดข้ อมูลของมันจะเป็ น float
22
ตัวอย่ างแสดงการใช้ ฟังก์ ช่ ัน ceil และ floor (ให้ สังเกตการปั ดเศษค่ าลบ)
<?
echo "บรรทัด 1 : " . ceil(4.3) . "<br>";
echo "บรรทัด 2 : " . ceil(9.99) . "<br>";
echo "บรรทัด 3 : " . ceil(-4.3) . "<br>";
echo "บรรทัด 4 : " . ceil(-9.99) . "<br>";
echo "บรรทัด 5 : " . floor(4.3) . "<br>";
echo "บรรทัด 6 : " . floor(9.99) . "<br>";
echo "บรรทัด 7 : " . floor(-4.3) . "<br>";
echo "บรรทัด 8 : " . floor(-9.99) . "<br>";
?>
ceil_floor.php
23
• ฟั งก์ ช่ ัน min
mixed min (mixed เลขจานวน1, mixed เลขจานวน2, [, mixed เลขจานวน3 ...])
หรื อ
mixed min (array อาร์ เรย์ที่บรรจุเลขจานวนต่างๆ ไว้ )
ใช้ หาค่ าต่าสุด โดยสามารถระบุอาร์ กวิ เมนต์ เป็ นเลขจานวนตัง้ แต่ 2 ค่ าขึน้ ไป หรือ
ระบุอาร์ กวิ เมนต์ ท่ บี รรจุเลขจานวนต่ างๆไว้ กไ็ ด้ ฟังก์ ช่ ันนีจ้ ะประเมินสตริงที่ไม่ ใช่ สตริง
ตัวเลข (Non-Numeric Srting) เป็ นค่ า 0 และจะให้ ผลลัพธ์ เป็ นสตริงนัน้ ถ้ าหากมันมีค่าต่า
ที่สุด
24
<?
echo "บรรทัด 1 : " . min(2,3,1,6,7) . "<br>";
$arr = array(2,4,5);
echo "บรรทัด 2 : " . min($arr ) . "<br>";
echo "บรรทัด 3 : " . min(0,'สวัสดี') . "<br>";
echo "บรรทัด 4 : " . min('สวัสดี',0) . "<br>";
echo "บรรทัด 5ฟ : " . min('สวัสดี',-1) . "<br>";
?>
min.php
25
• ฟั งก์ ช่ ัน max
mixed max (mixed เลขจานวน1, mixed เลขจานวน2, [, mixed เลขจานวน3 ...])
หรื อ
mixed max (array อาร์ เรย์ที่บรรจุเลขจานวนต่างๆ ไว้ )
ใช้ หาค่ าสูงสุด การใช้ งานจะเหมือนกับฟั งก์ ช่ ัน min
26
• ฟั งก์ ช่ น
ั number_format
string number_format (float เลขจานวน [, int จานวนตัวเลขหลังจุดทศนิยม
[, string dec_point , string thousands_sep]])
ให้ ค่าสตริงที่เกิดจากการนาเลขจานวนมาจัดรูปแบบ ฟั งก์ ช่ ันนีต้ ้ องการอาร์ กวิ เมนต์ 1,2
หรือ 4 ตัว แต่ จะขออธิบายเฉพาะกรณีระบุอาร์ กวิ เมนต์ 1 หรือ 2 ตัว
• ถ้ าระบุอาร์ กิวเมนต์ ตัวเดียวจะจัดรู ปแบบเป็ นตัวเลขจานวนเต็ม (โดยไม่ มีจุดทศนิยม) โดยมี
commaคั่นตัวเลขทุก 3 หลักนับจากหลักหน่ วยขึน้ ไป
• ถ้ าระบุอาร์ กิวเมนต์ 2 ตัว จะจัดรู ปแบบเป็ นทศนิยมที่มีจานวนตัวเลขหลังจุดทศนิยมตามที่
กาหนด และมี comma คั่นตัวเลขข้ างหน้ าจุดทศนิยมทุก 3 หลักนับจากหลักหน่ วยขึน้ ไป
27
<?
$number = 1234.56;
echo number_format($number) . "<br>";
echo number_format($number,1) . "<br>";
?>
number_format.php
28
• การเขียนค่ าจานวนเต็ม (Integer Literal) อาจเขียนในรู ปของเลขฐานสิบ ฐานแปด หรื อฐานสิบหกก็ได้
• เมื่อต้ องการแปลงค่ าใดๆ เป็ นชนิด integer ให้ ใช้ ตัวดาเนินการ (int) หรื อ (integer) หรื อใช้ ฟังก์ ช่ น
ั intval
• การเขียนค่ าจานวนทศนิยม (Float Literal) อาจเขียนในรู ปแบบที่ใช้ กันทั่วไป หรื อในรู ปแบบวิทยาศาสตร์
คือ AeN ก็ได้ ซึ่งหมายถึง A x 10N ( A คูณสิบ ยกกาลัง N) โดย A เป็ นตัวเลขที่มีจุดทศนิยมได้ แต่ N ต้ อง
เป็ นเลขจานวนเต็มเท่ านัน้
• เมื่อต้ องการแปลงค่ าใดๆ เป็ นชนิด float ให้ ใช้ ตัวดาเนินการ (float) หรื อ (double) หรื อใช้ ฟังก์ ช่ ัน floatval
• ในการแปลงค่ าสตริงเป็ นค่ าจานวน ถ้ าหากส่ วนต้ นหรื อทัง้ หมดของสตริงมีรูปแบบเป็ นเลขจานวน ก็จะได้
ผลลัพธ์ เป็ นเลขจานวนนัน้ (ซึ่งเป็ นชนิดข้ อมูล integer หรื อ float ขึน้ อยู่กับรู ปแบบของเลขจานวน) แต่ ถ้า
หากส่ วนต้ นของสตริงไม่ ได้ มีรูปแบบเป็ นเลขจานวน แม้ ว่าส่ วนที่ตามหลังมาจะมีรูปแบบเป็ นเลขจานวนก็
ตาม จะได้ ผลลัพธ์ เป็ นศูนย์
• ถ้ าต้ องการตรวจสอบค่ าและชนิดข้ อมูลของนิพจน์ หนึ่งๆ ในโปรแกรม ให้ ใช้ ฟังก์ ช่ น
ั var_dumpa
29
30

similar documents