It's a Hoot Charm Pack Pillow

ตัวหนังสือปนตัวเลข ก็คือแบบนี้

เป็นเงิน 10 บาท
เงินสด 1,000

ส่วนตัวเลขปนตัวหนังสือ คืออย่างนี้

10 บาท
120 องศา

ในกรณีเราต้องการแปลงตัวเลขเป็นตัวหนังสือให้ได้มาเฉพาะตัวเลขอย่างเดียว เราสามารถใช้ฟังก์ชั่น intval() แปลง

$string = "10 บาท";
$integer = intval( $string );
// ผลลัพธ์ที่ได้คือ 10

หรือใช้ Casttype ก็ได้

$string = "10 บาท";
$integer = (int)( $string );
// ผลลัพธ์ที่ได้คือ 10

แต่ถ้าเราต้องการจะแปลงตัวหนังสือปนตัวเลขให้ได้เฉพาะตัวเลข เราใช้สองวิธีดังกล่่าวมา ไม่ได้ เพราะมันจะคืนค่ากลับมาเป็น 0 เสมอ อย่าเชื่อผม ขอให้ทดสอบด้วยตัวเอง

สาเหตุที่เป็นเช่นนั้นเพราะ สองคำสั่งนั้นมันจะมองไล่ตัวอักษรไปทีละตัว ถ้าตัวแรกไม่ใช่ตัวเลขเสียแล้ว มัีนก็คืนค่าเป็น 0 มาทันที ไม่มองตัวต่อไปแล้ว

ทีนี้ทำไง?

หลักคิด

เราจะใช้ฟังก์ชั่น PHP ไล่หาตัวอักษรไปทีละตัว ดูว่ามันเป็นตัวเลขมั้ย ถ้าไม่ใช่ แทนที่มันด้วยตัวอักษรว่าง (มันก็เหมือนลบทิ้ง) ถ้ามันเป็นตัวเลข เก็บไว้ หาตัวต่อไป จนสุดข้อความ สิ่งที่ได้ออกมาก็จะมีเฉพาะตัวอักษรที่เป็นตัวเลข จากนั้นจึงใช้ฟังก์ชั่นแปลงสิ่งที่ได้ ให้เป็นตัวเลขที่แท้จริงอีกที

ดูคำสั่ง ผมขี้เกียจเขียนยาว จะใช้ Rexgular Expression เป็นตัวดำเนินการหลักคิดของเรา

$input = "เงินสด 1,000";
$output  = ereg_replace("[^[:digit:]]","", $input ) ;

อธิบาย

ให้แทนที่ตัวอักษรที่ไม่ใช่ตัวเลขด้วยค่าว่าง ตัวอักษรนะท่านไม่ใช่ข้อความ อ่านให้ดี

^ มีความหมายว่าไม่ใช่

[:digit:] ตัวอักษรที่เป็นตัวเลข ก็คือ 0-9

เมื่อรวมกัน ^[:digit:] มีความหมายตรงตัวว่า ตัวอักษรที่ไม่ใช่ตัวเลข

ereg_replace ค้นหาและแทนที่ (ใช้ Regular Expression) นะ

$input = "เงินสด 1,000";
$output  = ereg_replace("[^[:digit:]]","", $input ) ;

ค้นหาและแทนที่คำว่า “เงินสด 1,000” ตัวอักษรที่ไม่ใช่ตัวเลข ด้วยค่าว่าง

ถ้าอยากเขียนเป็นฟังก์ชั่นไว้ใช้งานสะดวกๆ เขียนเป็นฟังก์ชั่นก็ได้

function string_to_num( $input )
{
 $output = 0 ;
 $output  = ereg_replace("[^[:digit:]]","", $input ) ;
 
 return $output + 0 ;
}

อ่านเพิ่มเติม
intval()
ereg_replace