将逗号作为小数点转换为float

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密集程度最低的方式,而且即使你使用一些奇特的功能来做这件事,这也就是它在幕后所做的事情.

  • @Jeff 尝试编写尽可能少的代码行是正确的,但我认为代码可读性是开发的必要条件,甚至比编写更少的代码更重要。 (3认同)
  • 嗯,是的,我似乎忽略了“替换顺序陷阱”,使用 mysql 的 `replace` 不会发生这种情况。所以正确的行是 `$number = str_replace( ['.',','], ['','.'], $string_number )*1.0;` (3认同)
  • 或只是$ number = str_replace([',','。'],['。'],$ string_number)* 1.0;` (2认同)
  • @ manuman94,我认为消除不必要的函数调用不会降低可读性。 (2认同)

Bjö*_*örn 16

如果您使用的是PHP5.3或更高版本,则可以使用numfmt_parse执行"反向number_format".如果你不是,你坚持用preg_replace/str_replace替换出现的问题.

  • “你还需要 PECL intl >= 1.0.0” 不,它说你要么需要 PHP 5.3 > 要么你需要通过 PECL intl 包 1.0.0 安装它。PHP 5.3+ 内置了支持。 (2认同)

Gum*_*mbo 11

您可以将NumberFormatter与其parse方法一起使用.

  • 仅适用于5.3或以上版本,仅作为免责声明.;-) (4认同)

小智 11

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

function floatvalue($val){
            $val = str_replace(",",".",$val);
            $val = preg_replace('/\.(?=.*\.)/', '', $val);
            return floatval($val);
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,它并不完美,发送“1,500”将转换为 1.5 而不是 1500 (5认同)

Pau*_*man 7

假设它们位于文件或数组中,只需将批量替换为批处理(即一次性完成):

$input = str_replace(array('.', ','), array('', '.'), $input); 
Run Code Online (Sandbox Code Playgroud)

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


Adr*_*ota 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);
}
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)