将以逗号为小数点的数字转换为浮点数


70

我有一个价格列表,逗号带有小数点,点是千位分隔符。

一些例子:

12,30
116,10
1.563,14

这些来自第三方。我想将它们转换为浮点数并将它们添加在一起。

做这个的最好方式是什么?number_format似乎不适用于此格式,str_replace似乎有点过头了,因为我必须对每个数字进行多次操作。

有更好的办法吗?谢谢。


您可以挤出点,然后将逗号换成点并解析为float。只有2个替换。除非您要一次拍摄成千上万的记录,否则这不是可怕的
DampeS8N 2010年

Answers:


117

使用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最少的方法,而且即使您使用一些高级功能来执行此操作,也很可能是在后台执行的操作。


3
或者只是$number = str_replace( [',','.'], ['.'], $string_number )*1.0;
Jeff

3
@Jeff尝试编写尽可能少的代码行是正确的,但是我认为代码可读性是开发中必须的,甚至比编写更少代码更重要。
manuman94 '18

1
嗯,是的,我似乎忽略了使用mysql不会发生的“替换订单陷阱” replace。所以正确的线是$number = str_replace( ['.',','], ['','.'], $string_number )*1.0;
Jeff

3
@ manuman94,我认为消除不必要的函数调用不会降低可读性。
杰夫

1
@杰夫我确实是哈哈,但这是我的看法。感谢您为社区提供的帮助,这只是我的观点。问候!
manuman94 '19

26

此功能兼容点或逗号为小数的数字

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

这是天才!
亚当

21

如果您使用的是PHP5.3或更高版本,则可以使用numfmt_parse进行“反向数字格式”。如果不是这样,您就不得不用preg_replace / str_replace替换出现。


1
您还需要PECL intl> = 1.0.0
riotera 2012年

2
“您还需要PECL intl> = 1.0.0”否,它表示您需要PHP 5.3>,或者需要通过PECL intl软件包1.0.0安装它。PHP 5.3+有内置的支持。
迈克尔·瑞安Soileau

1
您确实需要检查是否intl启用了扩展。它不是内置的,必须显式编译或作为单独的扩展安装。并非所有主机提供商都使用PHP安装它。
cronfy


7

假设它们在文件或数组中,则只需批量替换即可(即一次全部替换):

$input = str_replace(array('.', ','), array('', '.'), $input); 

然后从那里处理数字,以充分利用PHP的松散类型性质。


我也会像这样将类型float转换为$ v =(float)str_replace(['。',','],['','。'],$ v);
弗朗西斯科·卢兹

6

可能看起来过多,但会在没有语言环境的情况下转换任何给定的格式:

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

1

从PHP手册:

str_replace —用替换字符串替换所有出现的搜索字符串

我会沿着那条路线走,然后从字符串转换为float- floatval

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.