PHP无法识别1,200.00
(由number_format
生成)但仅识别1200.00
,
这个问题的一般解决方案是什么?
答案 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);
为我工作。