2011-09-29 363 views
4

我有这样的PHP代码:PHP - floatval在小数点后的位置切割?

<?php 
    $float = "1,99"; 
    echo "<p>$float<br>"; 
    $float = floatval($float); // Without this line number_format throws a notice "A non well formed numeric value encountered"/(float) $float leads to the same output 
    $val = number_format($float, 2,'.', ','); 
    echo "$float</p>"; 
?> 

为什么它返回1?不要那样。

和:是的,有在转换到1.99 1.99 ;-)

谢谢提醒感...

+0

BTW:它是变成1,99比1没有这一行,我得到一个警告,但我希望它1 floatval() 99 ... – Hein

回答

2

floatval将逗号(,)识别为字符而不是数字,因此它会切断它后面的所有内容。在这种情况下,这是99.请使用点(。)而不是逗号(,),它可能会工作。

例floatval(来源:http://php.net/manual/en/function.floatval.php):

<?php 
$var = '122.34343The'; 
$float_value_of_var = floatval($var); 
echo $float_value_of_var; // 122.34343 
?> 
+0

感谢您的反馈。不幸的是,对于德国人来说,1,99是一个有效的价格,而1.99是一个字符串;-)所以我恐怕不得不str_replace()逗号。谢谢。 – Hein

+0

我知道这个问题。我是荷兰人,所以它是一样的。只要你总是用一个点代替逗号,你会没事的。只要注意数字如:2,000.99。 – Bob

6

的问题是,PHP不承认作为小数点分隔符的,1,99。所述float类型被定义为具有以下formal definition

LNUM   [0-9]+ 
DNUM   ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*) 
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM}) 

这意味着它会只接受.作为小数分隔。这实际上与number_format对无效数据类型抛出警告的原因相同,因为它无法在内部将1,99转换为float

下面应该工作:

$float = "1,99"; 
echo "<p>$float<br>"; 
$val = number_format(str_replace(',', '.', $float), 2,'.', ','); 
echo "$float</p>"; 
+0

我真的希望我不必使用类似str_replace的东西。这是唯一的还是“官方”的方式?认为floatval()将足够聪明,看到它只是,防止1,99是一个浮动...谢谢 – Hein

1

1,99是不是一个有效的PHP浮动。问题是你的逗号(,)。在PHP中,你必须使用点(。)作为浮点分隔符。

<?php 
    $float = "1.99"; 
    echo "<p>$float<br>"; 
    $float = (float)$float; 
    $val = number_format($float, 2,'.', ','); 
    echo "$float</p>"; 
?>