PHP:如何检查数字是否超过两位小数

问题描述 投票:2回答:4

我试图挑选超过两位小数的数字(小数点分隔符后面的两位数以上)。我无法弄清楚为什么这不起作用:

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

为什么选择32.45,而32.44不是?

php
4个回答
4
投票

你可以使用正则表达式:

$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
}

1
投票

您可以使用正则表达式来确定它是否有超过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

DEMO

正则表达式尸检(/\.[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结尾)。
  • $ - 字符串必须在这里结束 - 我们的最后一个匹配和字符串结尾之间没有任何其他内容

0
投票

您可以使用以下功能(也可以使用负数):

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

Demo.


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.