ฉันต้องการที่จะแปลงเหล่านี้ประเภทของค่านิยม'3'
, '2.34'
, '0.234343'
ฯลฯ จำนวน ใน JavaScript เราสามารถใช้Number()
แต่มีวิธีการที่คล้ายกันใน PHP?
Input Output
'2' 2
'2.34' 2.34
'0.3454545' 0.3454545
ฉันต้องการที่จะแปลงเหล่านี้ประเภทของค่านิยม'3'
, '2.34'
, '0.234343'
ฯลฯ จำนวน ใน JavaScript เราสามารถใช้Number()
แต่มีวิธีการที่คล้ายกันใน PHP?
Input Output
'2' 2
'2.34' 2.34
'0.3454545' 0.3454545
คำตอบ:
โดยทั่วไปคุณไม่จำเป็นต้องทำเช่นนี้เนื่องจาก PHP จะบีบบังคับให้คุณพิมพ์ในสถานการณ์ส่วนใหญ่ สำหรับสถานการณ์ที่คุณไม่ต้องการอย่างชัดเจนแปลงชนิดโยนมัน:
$num = "3.14";
$int = (int)$num;
$float = (float)$num;
.
เป็นตัวแยกจุดทศนิยม en.wikipedia.org/wiki/…
มีสองสามวิธีที่จะทำเช่นนั้น:
ส่งสตริงไปยังชนิดข้อมูลดั้งเดิมที่เป็นตัวเลข:
$num = (int) "10";
$num = (double) "10.12"; // same as (float) "10.12";
ดำเนินการทางคณิตศาสตร์กับสตริง:
$num = "10" + 1;
$num = floor("10.1");
ใช้intval()
หรือfloatval()
:
$num = intval("10");
$num = floatval("10.1");
settype()
ใช้
(double)
(float)
$num = "10" + 1
ตัวอย่าง)
intval("9999999999")==2147483647
กล่าวคือ
intval
มีประโยชน์เพราะคุณสามารถใช้ในarray_map('intval', $arrayOfStrings);
การคัดเลือกนักแสดงที่ไม่สามารถทำได้
$num = "10" + 1;
เป็นการดีกว่าที่จะใช้$num = "10" * 1;
เนื่องจากจะไม่เปลี่ยนค่า (องค์ประกอบที่เป็นกลางของการคูณ) นี่คือสิ่งที่ต้องการtoNumber(..)
ตั้งแต่ประเภทสุดท้ายจะถูกกำหนดโดยสิ่งที่จำเป็นในการแปลงสตริง "10" -> (int) 10; "10.1" -> (ลอย) 10.1;
intval($var)
เพื่อหลีกเลี่ยงปัญหาลอง ตัวอย่างบางส่วน:
<?php
echo intval(42); // 42
echo intval(4.2); // 4
echo intval('42'); // 42
echo intval('+42'); // 42
echo intval('-42'); // -42
echo intval(042); // 34 (octal as starts with zero)
echo intval('042'); // 42
echo intval(1e10); // 1410065408
echo intval('1e10'); // 1
echo intval(0x1A); // 26 (hex as starts with 0x)
echo intval(42000000); // 42000000
echo intval(420000000000000000000); // 0
echo intval('420000000000000000000'); // 2147483647
echo intval(42, 8); // 42
echo intval('42', 8); // 34
echo intval(array()); // 0
echo intval(array('foo', 'bar')); // 1
?>
12.7896
?
(int)$my_str
จะไม่ทำงานตั้งแต่ผมจัดการเฉพาะกับสตริง liks 01
และ013
ที่ฉันต้องการที่จะตีความเป็นฐาน 10 ... ดังนั้นผมจึงต้องการวิธีอย่างชัดเจนให้ฐาน
ในภาษาใดก็ตามที่พิมพ์ (แบบหลวม ๆ ) คุณสามารถส่งสตริงไปยังหมายเลขได้เสมอโดยเพิ่มศูนย์ลงไป
อย่างไรก็ตามมีความรู้สึกน้อยมากในเรื่องนี้เพราะ PHP จะทำมันโดยอัตโนมัติในเวลาที่ใช้ตัวแปรนี้และมันจะถูกส่งไปยังสตริงต่อไปในเวลาที่ส่งออก
โปรดทราบว่าคุณอาจต้องการเก็บตัวเลขที่มีจุดเป็นสตริงเนื่องจากหลังจากการชี้ไปที่ลอยมันอาจมีการเปลี่ยนแปลงอย่างไม่แน่นอนเนื่องจากลักษณะของตัวเลขลอยตัว
typeof('123'+0)
ให้'string'
เพราะจะช่วยให้'123'+0
'1230'
0+'123'
เพื่อรับ123
คุณสามารถใช้ได้:
(int)(your value);
หรือคุณสามารถใช้:
intval(string)
is_float
และหากที่ผ่านแล้วโยนไปกับแทน(float)
(int)
หากคุณต้องการได้รับการลอย$value = '0.4'
แต่ int สำหรับ$value = '4'
คุณสามารถเขียน:
$number = ($value == (int) $value) ? (int) $value : (float) $value;
สกปรกเล็กน้อย แต่ใช้งานได้
strpos($val, '.') === false ? intval($val) : floatval($val);
localeconv()['decimal_point']
'.'
ข้อดีอย่างหนึ่งของการstrpos
แก้ปัญหาคือเกือบจะเร็วกว่าการร่ายสองเท่า
2.1e2
มันมีจุดทศนิยม แต่จำนวนผลลัพธ์เป็นจำนวนเต็ม
+
ตัวดำเนินการประจำตัว: var_dump(+'0.4', +'4')
จะช่วยให้คุณลอยและ int php.net/manual/en/language.operators.arithmetic.php
คุณสามารถเพิ่มศูนย์ได้เสมอ!
Input Output
'2' + 0 2 (int)
'2.34' + 0 2.34 (float)
'0.3454545' + 0 0.3454545 (float)
A non well formed numeric value encountered
นี้ ความคิดใด ๆ
แทนที่จะต้องเลือกว่าจะแปลงstring
ไปint
หรือfloat
คุณก็สามารถเพิ่ม0
ให้มันและ PHP อัตโนมัติจะแปลงผลเป็นชนิดที่เป็นตัวเลข
// Being sure the string is actually a number
if (is_numeric($string))
$number = $string + 0;
else // Let the number be 0 if the string is not a number
$number = 0;
ใช่มีวิธีการที่คล้ายกันใน PHP แต่ก็ไม่ค่อยมีใครรู้ว่าคุณจะไม่ค่อยได้ยินเกี่ยวกับมัน มันเป็นตัวดำเนินการทางคณิตศาสตร์ที่เรียกว่า " identity " ตามที่อธิบายไว้ที่นี่:
ในการแปลงสตริงตัวเลขให้เป็นตัวเลขให้ทำดังนี้:
$a = +$a;
is_numeric
ดังนั้นให้มีที่วางโค้ดเพื่อจัดการสตริงที่ไม่สามารถแปลงได้อย่างถูกต้อง)
เพียงเล็กน้อยจากคำตอบที่อาจมีประโยชน์และปลอดภัยกว่าในบางกรณี คุณอาจต้องการตรวจสอบว่าสตริงมีค่าตัวเลขที่ถูกต้องจริงก่อนแล้วจึงแปลงเป็นประเภทตัวเลข (ตัวอย่างเช่นถ้าคุณต้องจัดการข้อมูลที่มาจาก db ที่แปลง ints เป็นสตริง) คุณสามารถใช้is_numeric()
แล้วfloatval()
:
$a = "whatever"; // any variable
if (is_numeric($a))
var_dump(floatval($a)); // type is float
else
var_dump($a); // any type
นี่คือฟังก์ชั่นที่บรรลุสิ่งที่คุณกำลังมองหา ก่อนอื่นเราตรวจสอบว่าค่าสามารถเข้าใจได้เป็นตัวเลขหรือไม่ถ้าใช่เราเปลี่ยนมันเป็น int และทุ่น ถ้า int และ float เหมือนกัน (เช่น 5 == 5.0) เราจะคืนค่า int หาก int และ float ไม่เหมือนกัน (เช่น 5! = 5.3) เราถือว่าคุณต้องการความแม่นยำของการลอยและคืนค่านั้น หากค่าไม่ใช่ตัวเลขเราจะส่งการเตือนและส่งคืน null
function toNumber($val) {
if (is_numeric($val)) {
$int = (int)$val;
$float = (float)$val;
$val = ($int == $float) ? $int : $float;
return $val;
} else {
trigger_error("Cannot cast $val to a number", E_USER_WARNING);
return null;
}
}
ฉันพบว่าใน JavaScript วิธีง่ายๆในการแปลงสตริงเป็นตัวเลขคือการคูณมันด้วย 1 มันช่วยแก้ไขปัญหาการต่อข้อมูลเนื่องจากสัญลักษณ์ "+" มีการใช้งานหลายอย่างใน JavaScript ในขณะที่สัญลักษณ์ "*" ล้วนๆ สำหรับการคูณทางคณิตศาสตร์
จากสิ่งที่ฉันได้เห็นที่นี่เกี่ยวกับ PHP โดยอัตโนมัติยินดีที่จะตีความสตริงที่ประกอบด้วยตัวเลขเป็นตัวเลข (และความคิดเห็นเกี่ยวกับการเพิ่มเนื่องจากใน PHP เครื่องหมาย "+" เป็นเพียงการเพิ่มทางคณิตศาสตร์เท่านั้น) เคล็ดลับการคูณนี้ใช้งานได้ดี สำหรับ PHP ด้วย
ฉันได้ทำการทดสอบแล้วและมันใช้งานได้ ... แม้ว่าจะขึ้นอยู่กับว่าคุณได้รับสตริงมาอย่างไรคุณอาจต้องการใช้ฟังก์ชัน trim () กับมันก่อนที่จะคูณด้วย 1
นี่คือฟังก์ชั่นที่ฉันเขียนเพื่อทำให้สิ่งต่าง ๆ ง่ายขึ้นสำหรับตัวเอง:
นอกจากนี้ยังส่งคืนเวอร์ชันแบบย่อของบูลีน, จำนวนเต็ม, สองเท่าและจริง
function type($mixed, $parseNumeric = false)
{
if ($parseNumeric && is_numeric($mixed)) {
//Set type to relevant numeric format
$mixed += 0;
}
$t = gettype($mixed);
switch($t) {
case 'boolean': return 'bool'; //shorthand
case 'integer': return 'int'; //shorthand
case 'double': case 'real': return 'float'; //equivalent for all intents and purposes
default: return $t;
}
}
ประเภทการโทรพร้อมชุด parseNumeric เป็น true จะแปลงสตริงตัวเลขก่อนตรวจสอบประเภท
ดังนั้น:
type ("5", true) จะคืนค่า int
type ("3.7", true) จะส่งคืน float
type ("500") จะส่งคืนสตริง
เพียงแค่ระวังเนื่องจากนี่เป็นวิธีการตรวจสอบที่ผิดพลาดและตัวแปรที่แท้จริงของคุณจะยังคงเป็นสตริง คุณจะต้องแปลงตัวแปรจริงเป็นประเภทที่ถูกต้องหากจำเป็น ฉันแค่ต้องการมันเพื่อตรวจสอบว่าฐานข้อมูลควรโหลด id ไอเท็มหรือชื่อแทนดังนั้นจึงไม่มีผลกระทบที่ไม่คาดคิดเพราะมันจะถูกวิเคราะห์เป็นสตริงในขณะใช้งาน
แก้ไข
หากคุณต้องการที่จะตรวจสอบว่าวัตถุเป็นฟังก์ชั่นเพิ่มกรณีนี้เพื่อสวิทช์:
case 'object': return is_callable($mixed)?'function':'object';
นอกจากคำตอบของ Boykodevฉันแนะนำสิ่งนี้:
Input Output
'2' * 1 2 (int)
'2.34' * 1 2.34 (float)
'0.3454545' * 1 0.3454545 (float)
$id_cron = (string)date('YmdHi'); $target_id_cron = $id_cron - 1;
แทนที่จะเป็น $ target_id_cron = (int) $ id_cron - 1;
A non well formed numeric value encountered
$num = '12,24' * 1
ข้อเสนอแนะใด ๆ
คุณสามารถเขียนดังนี้:
<?php
$data = ["1","2","3","4","5"];
echo json_encode($data, JSON_NUMERIC_CHECK);
?>
คูณตัวเลขด้วย 1 เท่านั้นเพื่อให้สตริงถูกแปลงเป็นหมายเลขชนิด
//String value
$string = "5.1"
if(is_numeric($string)){
$numeric_string = $string*1;
}
คุณสามารถใช้ได้:
((int) $var) ( but in big number it return 2147483647 :-) )
แต่ทางออกที่ดีที่สุดคือการใช้:
if (is_numeric($var))
$var = (isset($var)) ? $var : 0;
else
$var = 0;
หรือ
if (is_numeric($var))
$var = (trim($var) == '') ? 0 : $var;
else
$var = 0;
คุณสามารถเปลี่ยนประเภทข้อมูลได้ดังนี้
$number = "1.234";
echo gettype ($number) . "\n"; //Returns string
settype($number , "float");
echo gettype ($number) . "\n"; //Returns float
ด้วยเหตุผลทางประวัติศาสตร์ "double" จะถูกส่งกลับในกรณีที่มีการลอย
คำแนะนำทั้งหมดจะสูญเสียประเภทตัวเลข
นี่เป็นแนวทางปฏิบัติที่ดีที่สุดสำหรับฉัน:
function str2num($s){
// Returns a num or FALSE
$return_value = !is_numeric($s) ? false : (intval($s)==floatval($s)) ? intval($s) :floatval($s);
print "\nret=$return_value type=".gettype($return_value)."\n";
}
PHP จะทำเพื่อคุณภายในขอบเขต
<?php
$str = "3.148";
$num = $str;
printf("%f\n", $num);
?>
มีวิธีคือ:
$value = json_decode(json_encode($value, JSON_NUMERIC_CHECK|JSON_PRESERVE_ZERO_FRACTION|JSON_UNESCAPED_SLASHES), true);
การใช้is_*
จะไม่ทำงานตั้งแต่เป็น:variable
string
การใช้การรวมกันของjson_encode()
แล้วjson_decode()
มันจะถูกแปลงเป็นรูปแบบ "ของจริง" ถ้ามันเป็นเรื่องจริงstring
มันจะผิดไปหมด
$num = "Me";
$int = (int)$num;
$float = (float)$num;
var_dump($num, $int, $float);
จะส่งออก: string(2) "Me" int(0) float(0)
ฉันได้รับคำถาม "บอกว่าคุณกำลังเขียนฟังก์ชั่นบิวท์อินสำหรับหล่อจำนวนเต็มไปยังสตริงใน PHP คุณจะเขียนฟังก์ชันนั้นอย่างไร" ในการสัมภาษณ์การเขียนโปรแกรม นี่คือทางออก
$nums = ["0","1","2","3","4","5","6","7","8","9"];
$int = 15939;
$string = "";
while ($int) {
$string .= $nums[$int % 10];
$int = (int)($int / 10);
}
$result = strrev($string);
ฉันอ่านคำตอบและไม่เห็นใครพูดถึง caveat ที่ยิ่งใหญ่ที่สุดในการแปลงตัวเลขของ PHP
คำตอบที่ upvoted ที่สุดแนะนำให้ทำดังต่อไปนี้:
$str = "3.14"
$intstr = (int)$str // now it's a number equal to 3
นั่นยอดเยี่ยม PHP ทำการคัดเลือกโดยตรง แต่ถ้าเราทำสิ่งต่อไปนี้
$str = "3.14is_trash"
$intstr = (int)$str
PHP พิจารณาว่าการแปลงนั้นถูกต้องหรือไม่?
เห็นได้ชัดว่าใช่
PHP อ่านสตริงจนกระทั่งพบอักขระที่ไม่ใช่ตัวเลขแรกสำหรับประเภทที่ต้องการ ความหมายสำหรับจำนวนเต็มอักขระตัวเลขคือ [0-9] เป็นผลให้มันอ่าน3
ได้เนื่องจากอยู่ในช่วงอักขระ [0-9] จึงอ่านต่อไป อ่าน.
และหยุดที่นั่นเนื่องจากไม่อยู่ในช่วง [0-9]
เหมือนกันจะเกิดขึ้นถ้าคุณถูกโยนให้ลอยหรือสองเท่า PHP จะอ่าน3
จาก.
นั้น1
จึง4
และจะหยุดi
เพราะไม่มีตัวอักษรตัวเลขลอยที่ถูกต้อง
เป็นผลให้การ"million" >= 1000000
ประเมินเป็นเท็จ แต่ประเมิน"1000000million" >= 1000000
true
ดูสิ่งนี้ด้วย:
https://www.php.net/manual/th/language.operators.comparison.phpวิธีการแปลงเสร็จในขณะที่เปรียบเทียบ
https://www.php.net/manual/th/language.types.string.php#language.types.string.conversionวิธีที่สตริงจะถูกแปลงเป็นตัวเลขตามลำดับ
หากคุณไม่ทราบล่วงหน้าหากคุณมีทศนิยมหรือจำนวนเต็ม
และหากสตริงอาจมีอักขระพิเศษ (เช่นช่องว่าง€ ฯลฯ )
และถ้ามันอาจมีมากกว่า 1 จุดหรือเครื่องหมายจุลภาค
คุณสามารถใช้สิ่งนี้ ฟังก์ชั่น:
// This function strip spaces and other characters from a string and return a number.
// It works for integer and float.
// It expect decimal delimiter to be either a '.' or ','
// Note: everything after an eventual 2nd decimal delimiter will be removed.
function stringToNumber($string) {
// return 0 if the string contains no number at all or is not a string:
if (!is_string($string) || !preg_match('/\d/', $string)) {
return 0;
}
// Replace all ',' with '.':
$workingString = str_replace(',', '.', $string);
// Keep only number and '.':
$workingString = preg_replace("/[^0-9.]+/", "", $workingString);
// Split the integer part and the decimal part,
// (and eventually a third part if there are more
// than 1 decimal delimiter in the string):
$explodedString = explode('.', $workingString, 3);
if ($explodedString[0] === '') {
// No number was present before the first decimal delimiter,
// so we assume it was meant to be a 0:
$explodedString[0] = '0';
}
if (sizeof($explodedString) === 1) {
// No decimal delimiter was present in the string,
// create a string representing an integer:
$workingString = $explodedString[0];
} else {
// A decimal delimiter was present,
// create a string representing a float:
$workingString = $explodedString[0] . '.' . $explodedString[1];
}
// Create a number from this now non-ambiguous string:
$number = $workingString * 1;
return $number;
}
วิธีการที่แตกต่าง:
json_encode($your_array, JSON_NUMERIC_CHECK);
เลือกที่จะถอดรหัสกลับ