PHP:如何检查一个数字是否有两个以上的小数


PHP: How to check if a number has more than two decimals

我正在尝试挑选两个以上小数(小数分隔符后两位数以上)的数字。我不明白为什么这不起作用:

if ($num * 100 != floor($num * 100)) {
  echo "The number you entered has more than two decimals";
}

为什么32.45这个数字被选中,而32.44却没有

您可以使用正则表达式:

$number = 1.12; //Don't match
$number = 1.123; //Match
$number = 1.1234; //Match
$number = 1.123; //Match
if (preg_match('/'.'d{3,}/', $number)) {
    # Successful match
} else {
    # Match attempt failed
}

您可以使用正则表达式来判断它是否有2个以上的小数:

<?php
    function doesNumberHaveMoreThan2Decimals($number) {
        return (preg_match('/'.[0-9]{2,}[1-9][0-9]*$/', (string)$number) > 0);
    }
    $numbers = array(123.456, 123.450, '123.450', 123.45000001, 123, 123.4);
    foreach ($numbers as $number) {
        echo $number . ': ' . (doesNumberHaveMoreThan2Decimals($number) ? 'Y' : 'N') . PHP_EOL;
    }
?>

输出:

123.456:      Y
123.45:       N
123.450:      N
123.45000001: Y
123:          N
123.4:        N

演示

Regex尸检(/'.[0-9]{2,}[1-9][0-9]*$/):

  • '.-文字.字符
  • [0-9]{2,}-0到9的数字匹配2次或更多次
  • [1-9]-1和9之间的数字匹配一次(以确保忽略后面的零)
  • [0-9]*-0和9之间的数字匹配0到无穷大的次数(以确保我们允许123.4510,即使它以0结束)
  • $-字符串必须在此处结束-在上次匹配和字符串结束之间不能有其他内容

我知道,这是一个老问题,但为什么不这么做呢:

function onlyDecimals($number, $maxDecimalPlaces = 2) {
   return $amount == number_format($amount, $maxDecimalPlaces, ".", "");
}

参见示例和测试:http://sandbox.onlinephpfunctions.com/code/e68143a9ed0b6dfcad9ab294c44fa7e802c39dd0

您可以使用以下函数(也适用于负数):

function decimalCheck($num) {
    $decimals = ( (int) $num != $num ) ? (strlen($num) - strpos($num, '.')) - 1 : 0;
    return $decimals >= 2;
}

测试用例:

$numbers = array(
    32.45,
    32.44,
    123.21,
    21.5454,
    1.545400,
    2.201054,
    0.05445,
    32,
    12.0545400,
    12.64564,
    -454.44,
    -0.5454
);
foreach ($numbers as $number) {
    echo $number. "'t : 't";
    echo (decimalCheck($number)) ? 'true' : 'false';
    echo "<br/>";
}

输出:

32.45    :  true
32.44    :  true
123.21   :  true
21.5454  :  true
1.5454   :  true
2.201054 :  true
0.05445  :  true
32       :  false
12.05454 :  true
12.64564 :  true
-454.44  :  true
-0.5454  :  true

演示