【问题标题】:PHP: If number (with comma), convert it to right number format (with point)PHP:如果数字(带逗号),将其转换为正确的数字格式(带点)
【发布时间】:2013-02-28 01:33:08
【问题描述】:

我有一个混合值数组:

$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.
}

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

谁能提供一个实际的例子?

【问题讨论】:

    标签: php regex number-formatting


    【解决方案1】:

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

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

    例子:

    $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);
    

    我们使用 str_replace() 来替换逗号的点,这样它是一个国际符号浮点数,即使它是在字符串上,这样以后我们可以用 is_numeric() 检查它是否是数字

    我们使用 is_numeric 检查值是整数浮点数还是文本,并使用intval()floatval() 返回对应的值(没有应用替换的值将不会作为有效数字返回,只有在切换后,和 . 它将以数字形式返回 true)。

    我们使用$row = array_map('toNumber', $row); 将更改应用到数组。

    利润xD

    【讨论】:

    • 感谢您的回答。但是如何区分文本值和数值呢?
    • 非常优雅的解决方案!感谢您的努力:它就像一个魅力。
    【解决方案2】:
    $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+

    【讨论】:

    • checkout floatval() 在 php 文档中,如果你在 str_replace() 之后使用 floatval($var1) 它直接获取值。你不需要做以下4个操作
    【解决方案3】:

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

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

    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 ;
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-07
        • 2020-04-21
        相关资源
        最近更新 更多