我有一个价格列表,逗号带有小数点,点是千位分隔符。
一些例子:
12,30
116,10
1.563,14
这些来自第三方。我想将它们转换为浮点数并将它们添加在一起。
做这个的最好方式是什么?number_format似乎不适用于此格式,str_replace似乎有点过头了,因为我必须对每个数字进行多次操作。
有更好的办法吗?谢谢。
Answers:
使用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最少的方法,而且即使您使用一些高级功能来执行此操作,也很可能是在后台执行的操作。
$number = str_replace( [',','.'], ['.'], $string_number )*1.0;
replace
。所以正确的线是$number = str_replace( ['.',','], ['','.'], $string_number )*1.0;
此功能兼容点或逗号为小数的数字
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进行“反向数字格式”。如果不是这样,您就不得不用preg_replace / str_replace替换出现。
intl
启用了扩展。它不是内置的,必须显式编译或作为单独的扩展安装。并非所有主机提供商都使用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);
}
输出:
.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