[英]Converting a number with comma as decimal point to float
我有一个价格列表,用逗号作为小数点,用点作为千位分隔符。
一些例子:
12,30
116,10
1.563,14
这些来自第三方的这种格式。 我想将它们转换为浮点数并将它们加在一起。
做这个的最好方式是什么? number_format似乎不适用于这种格式,而str_replace似乎有点矫枉过正,因为我必须对每个数字多做一次。
有没有更好的办法? 谢谢。
使用str_replace()
删除点并不过分。
$string_number = '1.512.523,55';
// NOTE: You don't really have to use floatval() here, it's just to prove that it's a legitimate float value.
$number = floatval(str_replace(',', '.', str_replace('.', '', $string_number)));
// At this point, $number is a "natural" float.
print $number;
这几乎可以肯定是您可以执行此操作的 CPU 密集程度最低的方法,并且很可能即使您使用一些奇特的函数来执行此操作,这也是它在幕后所做的事情。
此功能兼容以点或逗号为小数的数字
function floatvalue($val){
$val = str_replace(",",".",$val);
$val = preg_replace('/\.(?=.*\.)/', '', $val);
return floatval($val);
}
这适用于所有类型的输入(美式或欧式)
echo floatvalue('1.325.125,54'); // The output is 1325125.54
echo floatvalue('1,325,125.54'); // The output is 1325125.54
echo floatvalue('59,95'); // The output is 59.95
echo floatvalue('12.000,30'); // The output is 12000.30
echo floatvalue('12,000.30'); // The output is 12000.30
如果您使用的是 PHP5.3 或更高版本,则可以使用numfmt_parse来执行“反转 number_format”。 如果你不是,你就坚持用 preg_replace/str_replace 替换出现的次数。
您可以使用NumberFormatter类及其parse
方法。
可能看起来过多,但无论语言环境如何,都会转换任何给定的格式:
function normalizeDecimal($val, int $precision = 4): string
{
$input = str_replace(' ', '', $val);
$number = str_replace(',', '.', $input);
if (strpos($number, '.')) {
$groups = explode('.', str_replace(',', '.', $number));
$lastGroup = array_pop($groups);
$number = implode('', $groups) . '.' . $lastGroup;
}
return bcadd($number, 0, $precision);
}
输出:
.12 -> 0.1200
123 -> 123.0000
123.91 -> 12345678.9100
123 456 78.91 -> 12345678.9100
123,456,78.91 -> 12345678.9100
123.456.78,91 -> 12345678.9100
123 456 78,91 -> 12345678.9100
假设它们在文件或数组中,只需将替换作为批处理(即一次全部执行):
$input = str_replace(array('.', ','), array('', '.'), $input);
然后从那里处理数字,充分利用 PHP 的松散类型特性。
对于那些想要NumberFormatter
示例的人:
$test='2,345.67';
// OOP Version
$numberFormatter=new NumberFormatter('en-AU',NumberFormatter::DECIMAL);
$number=$numberFormatter->parse($test);
print $number;
// Procedural Version
$numberFormatter=numfmt_create('en_AU',NumberFormatter::DECIMAL);
$number=numfmt_parse($numberFormatter,$test);
print $number;
当然你的语言环境可能非常。
不知道为什么有人会选择程序版本。
请注意, NumberFormat
和str_replace
类型解决方案之间的一个主要区别是NumberFormatter
对您放置千位和十进制字符的位置很敏感; 使用1,2345.00
不起作用。
您可以使用filter_var
。
$floatNumber = (float) filter_var($string, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.