如何将number_format的输出转换回PHP中的数字?

时间:2010-05-29 17:05:57

标签: php

PHP无法识别1,200.00(由number_format生成)但仅识别1200.00

这个问题的一般解决方案是什么?

11 个答案:

答案 0 :(得分:26)

您可以删除任何非数字或小数点的字符,并使用floatval解析该字符:

$number = 1200.00;
$parsed = floatval(preg_replace('/[^\d.]/', '', number_format($number)));
var_dump($number === $parsed);  // bool(true)

如果数字不是.小数点:

function parse_number($number, $dec_point=null) {
    if (empty($dec_point)) {
        $locale = localeconv();
        $dec_point = $locale['decimal_point'];
    }
    return floatval(str_replace($dec_point, '.', preg_replace('/[^\d'.preg_quote($dec_point).']/', '', $number)));
}

答案 1 :(得分:18)

如果您使用5.3或更高版本(感谢ircmaxell),请使用numfmt_parse

答案 2 :(得分:5)

更好的方法是使用number_format函数本身的选项 格式是 number_format(float $ number,int $ decimals = 0,string $ dec_point ='。',string $ thousands_sep =',')

即如果你不需要格式化字符串中的','就像是

$ NUM = 23.33333

echo number_format($ num,2,'。','');

如果你需要那个浮动然后类型转换相同浮动 $ floatnum =(float)number_format($ num,2,'。','');

希望这有帮助

由于 希亚姆 高级PHP开发人员 TunerLabs

答案 3 :(得分:5)

您可以使用filter_var。 e.g。

$num = '1,200,998';
$real_integer = filter_var($num, FILTER_SANITIZE_NUMBER_INT);
echo $real_integer;

将输出:

1200998

答案 4 :(得分:5)

使用; Sanitize filters

$ number1 =' $ 1,989.34';

    $number2 = filter_var($number, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);//1989.34
    $number2 = filter_var($number, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_THOUSAND);//1,98934

答案 5 :(得分:2)

你可以做$num = (float) str_replace(',', '', $num);基本上,只需删除逗号,然后将其转换为数字类型(float或int)。

答案 6 :(得分:1)

我使用以下代码:

function remove_non_numerics($str)
{ 
    $temp       = trim($str);
    $result  = "";
    $pattern    = '/[^0-9]*/';
    $result     = preg_replace($pattern, '', $temp);

    return $result;
}

答案 7 :(得分:0)

在这种情况下,可以使用PHP round方法,例如:round (12.000000, 2);

答案 8 :(得分:0)

我找不到可以在 php 中将任何类型的格式化数字转换回正常数字的有效解决方案。 我需要它来处理任何类型的数字。

所以花了一段时间,但我写了。

如果数字最多有 2 个小数,它就可以工作,但我认为这已经足够了。

它还将删除任何货币符号,并且只允许传递数字、点和逗号。

function unformatNumber($number){

  // works with 2 decimals max

  $number = trim((string)$number);
          $number = preg_replace('/&.*?;/', '', $number);
  $number_b="";
  $number_ar_prep=str_split($number);
  $number_ar=array();
  $separators_amount=0;
  $numbers_after_separator=array();
  $chars_after_last_separator=0;
  $last_decimals=array();
  $last_decimal="";

  foreach ($number_ar_prep as $char) {
        if((is_numeric($char) || $char=="," || $char==".")){
          if(is_numeric($char)){

            $number_ar[]=(float)$char;
          }else{

            $number_ar[]=$char;
          }
        }
  }

  foreach ($number_ar as $char) {

    $char=trim($char);
    $sep_increase=false;
    if($char=="."){
      $separators_amount++;
      $sep_increase=true;

    }elseif($char==","){
      $separators_amount++;
      $sep_increase=true;

    }

    $number_b.=$char;

    if($separators_amount>0){

      if($sep_increase){
        $chars_after_last_separator=0;
        $last_decimal="";
      }else{
        $chars_after_last_separator++;
        $last_decimal.=$char;
      }

      $numbers_after_separator[$separators_amount]=$chars_after_last_separator;

      $last_decimals[$separators_amount]=$last_decimal;

    }

  }


  $has_decimals=0;
  if(isset($numbers_after_separator[$separators_amount])){
    if($numbers_after_separator[$separators_amount]<3){
      $has_decimals=1;
    }
  }

  if(!$has_decimals){
    $clean_number = str_replace(",","",$number_b);
    $clean_number = str_replace(".","",$clean_number);
  }else{

    $decimals = $last_decimals[$separators_amount];
    $num_without_decimals = preg_replace('/'.$decimals.'$/', '', $number_b);
    $clean_num_without_dec = str_replace(",","",$num_without_decimals);
    $clean_num_without_dec = str_replace(".","",$clean_num_without_dec);

    $clean_number = $clean_num_without_dec.'.'.$decimals;

  }

  return (float)$clean_number;


}

示例输出:

(original > unformatted)
1   1
2   2
2.00    2
2,00    2
2,31    2.31
2.31    2.31
24  24
24.00   24
24,00   24
24,31   24.31
25.31   25.31
244 244
244.00  244
244,00  244
244,31  244.31
255.31  255.31
2000    2000
2000.31 2000.31
2000,31 2000.31
2.000   2000
2,000   2000
2.000,31    2000.31
2,000.31    2000.31
20000   20000
20.000  20000
20,000  20000
20.000,31   20000.31
20,000.31   20000.31
200000  200000
200.000 200000
200,000 200000
200.000,15  200000.15
204,000.31  204000.31
2000000 2000000
2.000.000   2000000
2.050,000   2050000
2.500.000,51    2500000.51
2.000,000.31    2000000.31
24,30 €     24.3

答案 9 :(得分:0)

感谢@ircmaxell,我想出了这个:

$t_sep = localeconv()['thousands_sep'];
$num = (float) str_replace($t_sep? $t_sep : ',', '', $numStr);

答案 10 :(得分:-2)

使用“ [^ 0-9。] +”正则表达式。

$formattedVal = '$9,99,999.99';
$unformattedVal = (float)preg_replace("/[^0-9.]+/", "", $formattedVal);
var_dump($unformattedVal);

为我工作。