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

时间:2010-12-01 14:29:15

标签: php parsing floating-point

我有一个价格列表,其中包含小数点的逗号和千位分隔符的点数。

一些例子:

12,30
116,10
1.563,14

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

最好的方法是什么? number_format 似乎无法使用此格式,而 str_replace 似乎有点矫枉过正,因为我必须在每个数字上多做一次。

有更好的方法吗?感谢。

9 个答案:

答案 0 :(得分:95)

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

答案 1 :(得分:16)

如果您使用的是PHP5.3或更高版本,则可以使用numfmt_parse执行“反向number_format”。如果你不是,你就不得不用preg_replace / str_replace替换出现的事件。

答案 2 :(得分:11)

您可以将NumberFormatter classparse method一起使用。

答案 3 :(得分:7)

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

function floatvalue($val){
            $val = str_replace(",",".",$val);
            $val = preg_replace('/\.(?=.*\.)/', '', $val);
            return floatval($val);
}
$number = "1.325.125,54";
echo floatvalue($number); // The output is 1325125.54
$number = "1,325,125.54"; 
echo floatvalue($number); // The output is 1325125.54

答案 4 :(得分:6)

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

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

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

答案 5 :(得分:4)

可能看起来过多,但会转换任何给定的格式,而不是区域设置:

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

答案 6 :(得分:1)

来自PHP手册:

  

str_replace - 替换所有出现的内容   搜索字符串的   替换字符串

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

答案 7 :(得分:0)

对于那些想要 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;

当然,您的语言环境可能非常。

不知道为什么有人会选择程序版本。

请注意,NumberFormatstr_replace 类型解决方案之间的一个主要区别是 NumberFormatter 对您放置千位和十进制字符的位置很敏感;使用 1,2345.00 不起作用。

答案 8 :(得分:0)

您可以使用 filter_var

$floatNumber = (float) filter_var($string, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);