PHP String เพื่อลอย


120

ฉันไม่คุ้นเคยกับ PHP เลยและมีคำถามสั้น ๆ

ฉันมี 2 ตัวแปรpricePerUnitและInvoicedUnits. นี่คือรหัสที่ตั้งค่าเหล่านี้เป็นค่า:

$InvoicedUnits = ((string) $InvoiceLineItem->InvoicedUnits);
$pricePerUnit = ((string) $InvoiceLineItem->PricePerUnit);

ถ้าฉันส่งออกสิ่งนี้ฉันจะได้ค่าที่ถูกต้อง ให้บอก5000หน่วยที่ออกใบแจ้งหนี้และ1.00ราคา

ตอนนี้ฉันต้องแสดงจำนวนเงินทั้งหมดที่ใช้ไป เมื่อฉันคูณสองสิ่งนี้เข้าด้วยกันมันไม่ได้ผล (ตามที่คาดไว้นี่คือสตริง)

แต่ฉันไม่รู้วิธีแยกวิเคราะห์ / โยน / แปลงตัวแปรใน PHP

ฉันควรทำอย่างไรดี?

คำตอบ:


202
$rootbeer = (float) $InvoicedUnits;

ควรทำเพื่อคุณ. ตรวจสอบประเภทการเล่นกล คุณควรอ่านการแปลงสตริงเป็นตัวเลขด้วย


เป็นวิธีที่ง่ายที่สุด .. แต่บางครั้งฉันก็ประสบปัญหาในการทำเช่นนี้กับการกำหนดค่าฐานข้อมูลบางอย่างและVARCHAR>11ความยาว .. ยังไม่ได้ จำกัด ให้แคบลงอย่างแน่นอน
Talvi Watia

2
^ น่าสังเกตว่า (float) ลบ 0 ออกจากสตริงถ้าเป็นตัวเลขตัวแรก

โปรดทราบว่า "11,000.00" จะแสดงผล 11 แทนที่จะเป็น 11000.00 น.
CodeJunkie

65

คุณต้องการฟังก์ชันที่ไม่ทราบตำแหน่งที่ตั้งfloatval :

float floatval (ผสม $ var) - รับค่า float ของสตริง

ตัวอย่าง:

$string = '122.34343The';
$float  = floatval($string);
echo $float; // 122.34343

4
ความรุ่งโรจน์สำหรับการกล่าวถึงการรับรู้สถานที่ ฉันเพิ่งใช้เวลา 1,5 ชั่วโมงในการติดตามปัญหาที่เกิดจากภาษาที่แตกต่างกันทำให้เกิด(float)การแปลงบนเซิร์ฟเวอร์แรกเป็น "," และในเซิร์ฟเวอร์ที่สองเป็น ","
Dr. Gianluigi Zane Zanettini

23

ถ้าผู้ใช้เขียน 1,00,000 แล้ว floatvar จะแสดงข้อผิดพลาด ดังนั้น -

floatval(preg_replace("/[^-0-9\.]/","",$input));

นี่น่าเชื่อถือกว่ามาก

การใช้งาน:

$input = '1,03,24,23,434,500.6798633 this';
echo floatval(preg_replace("/[^-0-9\.]/","",$input));

7
แทนที่จะใช้eregใช้preg $string=preg_replace("/[^0-9\.\-]/","",$string);
ontananza

4
ใช่แล้วฟังก์ชันนี้ถูกเลิกใช้งานแล้ว เลยต้องใช้ preg แทน ereg :)
HADI

9

การจัดการกับมาร์กอัปในโฟลตเป็นงานที่ไม่สำคัญ ในสัญกรณ์ภาษาอังกฤษ / อเมริกันคุณจัดรูปแบบหนึ่งพันบวก46*10-2:

1,000.46

แต่ในเยอรมนีคุณจะเปลี่ยนลูกน้ำและชี้:

1.000,46


สิ่งนี้ทำให้คาดเดาหมายเลขที่ถูกต้องได้ยากในแอปพลิเคชันหลายภาษา
ฉันขอแนะนำอย่างยิ่งให้ใช้Zend_MeasureZend Framework สำหรับงานนี้ คอมโพเนนต์นี้จะแยกวิเคราะห์สตริงให้ลอยตามภาษาของผู้ใช้


3
ปัจจุบัน (+3 ปี) สามารถใช้NumberFormatterใน PHP 5.3 พร้อมกับintlส่วนขยาย
zamnuts

1
PHP 5.3 มีให้ใช้งานเมื่อฉันตอบคำถาม แต่จนกว่าความคิดเห็นของคุณฉันไม่ทราบถึงฟังก์ชันเดียวนี้เนื่องจากมีห้องสมุดหลายสิบแห่งที่ทำสิ่งที่คล้ายกัน แต่จะไม่มีพื้นที่ครอบคลุมที่ดีอย่างที่ส่วนขยาย intl มี ขอบคุณฉันจะพยายามจำมัน
โทเบียสพี

1

ใช้ฟังก์ชันนี้เพื่อโยนค่าลอยจากรูปแบบข้อความประเภทใดก็ได้:

function parseFloat($value) {
    return floatval(preg_replace('#^([-]*[0-9\.,\' ]+?)((\.|,){1}([0-9-]{1,3}))*$#e', "str_replace(array('.', ',', \"'\", ' '), '', '\\1') . '.\\4'", $value));
}

โซลูชันนี้ไม่ขึ้นอยู่กับการตั้งค่าโลแคลใด ๆ ดังนั้นสำหรับผู้ใช้อินพุตผู้ใช้สามารถพิมพ์ค่าลอยในแบบที่ต้องการได้ สิ่งนี้มีประโยชน์มากเช่นเมื่อคุณมีโครงการที่เป็นภาษาอังกฤษเท่านั้น แต่ผู้คนทั่วโลกกำลังใช้มันและอาจไม่ทราบว่าโครงการต้องการจุดแทนเครื่องหมายจุลภาคสำหรับค่าลอย คุณสามารถโยนจาวาสคริปต์ในการผสมผสานและดึงการตั้งค่าเริ่มต้นของเบราว์เซอร์ได้ แต่หลายคนยังคงตั้งค่าเหล่านี้เป็นภาษาอังกฤษ แต่ยังคงพิมพ์ 1,25 แทน 1.25 (โดยเฉพาะ แต่ไม่ จำกัด เฉพาะอุตสาหกรรมการแปลการวิจัยและไอที)


มีความคิดเห็นว่าทำไมถึงไม่ดี / ล้มเหลวตรงไหน?
Hafenkranich

หรือมีวิธีที่ยืดหยุ่นเช่นเดียวกันซึ่งเร็วกว่า?
Hafenkranich

1
ใช้แฟล็ก e ซึ่ง "ไม่รองรับอีกต่อไป" นั่นคือการคาดเดาของฉัน
Leif

0

ฉันพบปัญหาเกี่ยวกับวิธีมาตรฐานในการดำเนินการนี้:

$string = "one";

$float = (float)$string;

echo $float; : ( Prints 0 )

หากไม่มีตัวเลขที่ถูกต้องตัวแยกวิเคราะห์ไม่ควรส่งคืนตัวเลขซึ่งควรทำให้เกิดข้อผิดพลาด (นี่คือเงื่อนไขที่ฉันพยายามจับรหัสของฉัน YMMV)

ในการแก้ไขปัญหานี้ฉันได้ทำสิ่งต่อไปนี้:

$string = "one";

$float = is_numeric($string) ? (float)$string : null;

echo $float; : ( Prints nothing )

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


0

หากคุณต้องการจัดการกับค่าที่ไม่สามารถแปลงแยกกันได้คุณสามารถใช้วิธีนี้:

try {
    $valueToUse = trim($stringThatMightBeNumeric) + 0;
} catch (\Throwable $th) {
    // bail here if you need to
}

0

คุณสามารถไปที่ลิงค์นี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับวิธีการแปลงสตริง / ตัวเลขเป็นตัวเลข / ลอย / ทศนิยมใน PHP นี่คือสิ่งที่ลิงค์นี้กล่าว ...

วิธีที่ 1: การใช้ฟังก์ชัน number_format () ฟังก์ชัน number_format () ใช้เพื่อแปลงสตริงเป็นตัวเลข จะส่งคืนหมายเลขที่จัดรูปแบบเมื่อสำเร็จมิฉะนั้นจะให้ E_WARNING เมื่อล้มเหลว

$num = "1000.314"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num), "\n"; 

//Convert string in number using  
//number_format(), function 
echo number_format($num, 2); 

วิธีที่ 2: การใช้การหล่อประเภท: การพิมพ์ดีดสามารถแปลงสตริงให้เป็นแบบดั้งเดิมแบบโฟลตคู่หรือจำนวนเต็มได้โดยตรง นี่เป็นวิธีที่ดีที่สุดในการแปลงสตริงเป็นตัวเลขโดยไม่มีฟังก์ชันใด ๆ

// Number in string format 
$num = "1000.314"; 

// Type cast using int 
echo (int)$num, "\n"; 

// Type cast using float 
echo (float)$num, "\n"; 

// Type cast using double 
echo (double)$num; 

วิธีที่ 3: การใช้ฟังก์ชัน intval () และ floatval () นอกจากนี้ยังสามารถใช้ฟังก์ชัน intval () และ floatval () เพื่อแปลงสตริงเป็นจำนวนเต็มและค่าทศนิยมที่สอดคล้องกันตามลำดับ

// Number in string format 
$num = "1000.314"; 

// intval() function to convert  
// string into integer 
echo intval($num), "\n"; 

// floatval() function to convert 
// string to float 
echo floatval($num); 

วิธีที่ 4: โดยการเพิ่ม 0 หรือดำเนินการทางคณิตศาสตร์ หมายเลขสตริงยังสามารถแปลงเป็นจำนวนเต็มหรือทศนิยมได้โดยการเพิ่ม 0 ด้วยสตริง ใน PHP การดำเนินการทางคณิตศาสตร์สตริงจะถูกแปลงเป็นจำนวนเต็มหรือลอยโดยปริยาย

// Number into string format 
$num = "1000.314"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.0, "\n"; 

// Performing mathematical operation  
// to implicitly type conversion 
echo $num + 0.1;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.