PHP:如果是数字(用逗号),将其转换为正确的数字格式(带点)

时间:2013-03-12 13:43:23

标签: php regex number-formatting

我有一系列混合值:

$row = array('Unspecified risk','Yes','8','3','2','13','none','-1,49','-2,51','-1,46','-1,54'); -1,94   -1,55

正如您所看到的,它包含文本以及正面和正面的逗号。

我需要将数值转换为正确的数字格式,并保留文本值。

现在我正在循环这些值:

foreach ($row as $value) {
    // If $value is numeric, convert it to the 
    // right number format for use with MySQL (decimal(10,2))
    // If not, leave it be.
}

我调查了两个相关问题,但找不到合适的解决方案。

有人能提供一个实际的例子吗?

4 个答案:

答案 0 :(得分:7)

您不需要使用正则表达式。

使用str_replace(),因为您需要替换','的{​​{1}},然后使用'.'intval()函数来获取数值。您还可以使用floatval()查找strstr()并决定是否使用'.'intval()

示例:

floatval()

我们使用str_replace()替换逗号的点,这样它就是国际符号浮点数,即使它在字符串上也是如此,以后我们可以检查它是否为#s;带$row = array('Unspecified risk', 'Yes', '8', '3', '2', '13', 'none', '-1,49', '-2,51', '-1,46', '-1,54'); function toNumber($target){ $switched = str_replace(',', '.', $target); if(is_numeric($target)){ return intval($target); }elseif(is_numeric($switched)){ return floatval($switched); } else { return $target; } } $row = array_map('toNumber', $row); var_dump($row); 的数字< - 这个函数非常棒,因为它检测到字符串是否为数字,无论是整数还是浮点数等。

我们使用is_numeric检查值是整数float还是text并使用is_numeric()intval()返回相应的值(未应用replace的值不会返回有效数字,仅切换后,和。它将返回true作为数字)。

我们使用floatval()将更改应用于数组。

利润xD

答案 1 :(得分:1)

$row = array('Unspecified risk','Yes','8','3','2','13','none','-1,49','-2,51','-1,46','-1,54');
    foreach($row as $key => $var) {
        if(strstr($var, ",") && !is_numeric($var)) {
            $var1 = str_replace(",","", $var);
            if(is_numeric($var1)) {
                $decimal = strstr($var, ',', TRUE);
                $digits = str_replace($decimal, "", $var1);
                $finalValue =  $digits * pow(10,$decimal);
                $row[$key] = $finalValue;
            }
        }
    }
    echo "<pre>"; print_r($row);

注意:这适用于php 5.3或php 5.3 +

答案 2 :(得分:1)

多年后我才做出回应,因为我认为提供的任何解决方案都不够可靠。

这是一个更严格的测试,如果一个字符串包含一个以逗号作为小数点分隔符的浮点数,如果是,则转换它。如果需要,它还会删除数字周围的空格。它并没有真正测试格式错误的数字。

if( preg_match('/^\s*[0-9\.]*,\d*\s*$/', $str)) 
    return (float)str_replace(",",".",str_replace(".","",trim($str)));  
else
    return $str ;

如果你知道一个数值总是有欧洲符号(所以没有逗号的 1.234 也应该被转换为 1234),它应该是:

if( preg_match('/^\s*[0-9\.]*,?\d*\s*$/', $str)) 
    return (float)str_replace(",",".",str_replace(".","",trim($str)));  
else
    return $str ;

如果您想要一个真正严格的测试,没有格式错误的数字(例如以千位分隔符开头),并且在千位分隔符之间仅使用三位数字(但并非所有国家/地区都使用三位数字,例如印度!):

if( preg_match('/^\s*\d{0,3}((?<=\d)\.\d{3})*,?\d*\s*$/', $str)) 
    return (float)str_replace(",",".",str_replace(".","",trim($str)));  
else
    return $str ;

最后,如果您想要更加严格并且不希望数字能够以逗号开头或结尾(“1.234”或“,17”,在某些情况下被认为是正确的),它会变成

if( preg_match('/^\s*\d{1,3}((?<=\d)\.\d{3})*(,\d+)*\s*$/', $str)) 
    return (float)str_replace(",",".",str_replace(".","",trim($str)));  
else
    return $str ;

答案 3 :(得分:0)

使用is_numeric进行测试,number_format进行格式化

foreach ($row as &$value) {
    $number = str_replace(',','.');
    if(is_numeric($number))
        $value = number_format($number, 2, '.', '');
}
unset($value);