我正在处理一个处理monetairy数量的PHP脚本,因此需要精确到2位小数。为此,我将用户输入转换为数字乘以100,然后将其转换为int。这很好用,直到我最近发现一个在转换为int时增加1的数字。
故障代码:
$number = (int)(str_replace(',','.',$_POST["input"])*100);
给出问题的数字是2509,22(我住在荷兰,因此我们使用逗号来表示小数,因此上面代码行中的str_replace)。 此值创建整数$ number 250921,显然为1太低。 我知道int有限制,但据我所知,这个数字完全在这些限制之内...
答案 0 :(得分:1)
当您将字符串乘以100
时,您会获得float
,并且其表示形式并不总是您所期望的,在本例中为250921.99999999997
。见:
echo serialize(str_replace(',','.','2509,22')*100);
然后你施放到一个integer
,它将分数归为250921
。请参阅Is floating point math broken?。
解决方法是删除逗号并按原样使用,并可选择强制转换为integer
:
$number = (int)str_replace(',', '', '2509,22');
对于输入太多小数的用户问题,您应该使用两个输入,一个用于整数,一个用于分数和/或限制/验证输入是否格式正确。但是,您可以先格式化数字:
echo $number = (number_format(str_replace(',', '.', '2509,22'), 2, '.', '')*100);
答案 1 :(得分:0)
您可以使用正则表达式匹配int和零 - 两位小数 这不会进行任何转换,也不会增加或投放任何内容 它将被视为一个字符串,没有任何变化,但小数点。
$input = "2509,2222222";
// Regex number comma number (zero - two)
Preg_match("/(\d+),*(\d{0,2})/", $input, $m);
Unset($m[0]); // remove full match
Echo implode("", $m); // implode parts