MySQL数据imoprt mongo数据库。
price float(15,2) in mysql, mongo is not float(15,2).
我想确定var $price
有两个小数位。
例如。 100.00是对的,100或100.0是错误的。
eg.1
$price = 100.00;
$price
有两位小数,它是对的。
eg.2
$price = 100.0;
$price
没有两位小数,这是错误的。
答案 0 :(得分:5)
我喜欢使用正则表达式来做这些事情
function validateTwoDecimals($number)
{
if(preg_match('/^[0-9]+\.[0-9]{2}$/', $number))
return true;
else
return false;
}
(感谢Fred-ii-进行更正)
答案 1 :(得分:2)
为了使其正常工作,数字需要用引号括起来。
使用我测试过的许多脚本,使用不带引号的$price = 100.00;
无法正常工作,而$price = 100.10;
则不行,所以这是最好的。
<?php
$number = '100.00';
echo $number.'<br>';
$count = explode('.',$number);
echo 'The number of digits after the decimal point is: ' . strlen($count[1]);
if(strlen($count[1]) == 2){
echo "<br>";
echo "There is 2 decimal points.";
}
else{
echo "<br>";
echo "There is not 2 decimal points.";
}
答案 2 :(得分:2)
每个人都在围绕浮点数在其内部表示中没有多个小数位的事实。即在浮点数100 == 100.0 == 100.00 == 100.000并且都用相同的数字表示,实际上是100并以这种方式存储。
此示例中的小数位数仅在数字表示为字符串时具有上下文。在这种情况下,可以使用任何计算尾随小数点的位数的字符串函数来检查。
答案 3 :(得分:0)
格式化值后,您只需将值拆分为2个部分即可检查,例如爆炸...
$ex=explode('.',$in,2); if (strlen($ex[1])==2)
{
// true
}
else
{
// false
}
但是再次,正如我已经评论过的那样,如果你真的有浮动输入,这不是一种可靠的方式,因为浮动数字没有设置小数位,即使它们出现如此,因为浮点数的舍入= &gt;字符串转换
如果您确实拥有浮动数字且希望拥有xxx.yy格式数字,您可以做什么:
1)使用round($ x,2)将float转换为字符串,因此它将舍入到2位小数。 2)按照我的描述爆炸数字,和执行以下操作:
while (strlen($ex[1]<2)) {$ex[1].='0';}
$number=implode('.',$ex);
答案 4 :(得分:0)
我会使用以下函数:
function isFloatWith2Decimals($number) {
return (bool) preg_match('/^(?:[1-9]{1}\d*|0)\.\d{2}$/', $number);
}
这也会检查您是否只有一个前导0,因此010.23
之类的号码将被视为无效,而0.23
之类的号码将被视为有效。
如果你不关心领先0,你可以使用更简单的方法:
function isFloatWith2Decimals($number) {
return (bool) preg_match('/^\d+\.\d{2}$/', $number);
}
当然,数字需要作为字符串传递 - 如果你传递100.00
将不被视为真,而'100.00'
将
答案 5 :(得分:0)
number_format($price, $numberOfDecimalDigits) === $price;
或
strrpos($price, '.') === strlen($price) - 1 - $numberOfDecimalDigits;
琐事:$price
不应被称为&#34;浮点变量&#34;。这是一个恰好代表浮点值的字符串。 100.00
作为一个浮点数为零十进制数字,100.00 === 100
为浮点数:
$price = 100.00;
echo $price; // output: 100
$price2 = (float)100;
echo $price === $price2; // ouput: 1