Ain*_*ine 59 php floating-point parsing
我有一个价格列表,其中包含一个小数点的逗号和一个点作为千位分隔符.
一些例子:
12,30
116,10
1.563,14
这些来自第三方.我想将它们转换为浮点数并将它们加在一起.
做这个的最好方式是什么?number_format似乎不适用于这种格式,str_replace似乎有点矫枉过正,因为我必须在每个数字上多做一次.
有更好的方法吗?谢谢.
Tee*_*kin 99
使用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密集程度最低的方式,而且即使你使用一些奇特的功能来做这件事,这也就是它在幕后所做的事情.
Bjö*_*örn 16
如果您使用的是PHP5.3或更高版本,则可以使用numfmt_parse执行"反向number_format".如果你不是,你坚持用preg_replace/str_replace替换出现的问题.
小智 11
此功能兼容带点或逗号作为小数的数字
function floatvalue($val){
$val = str_replace(",",".",$val);
$val = preg_replace('/\.(?=.*\.)/', '', $val);
return floatval($val);
}
Run Code Online (Sandbox Code Playgroud)
假设它们位于文件或数组中,只需将批量替换为批处理(即一次性完成):
$input = str_replace(array('.', ','), array('', '.'), $input);
Run Code Online (Sandbox Code Playgroud)
然后从那里处理数字,充分利用PHP的松散类型性质.
可能看起来过多,但会在没有语言环境的情况下转换任何给定的格式:
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);
}
Run Code Online (Sandbox Code Playgroud)
输出:
.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
Run Code Online (Sandbox Code Playgroud)