2013-11-22 253 views
1

我想挑選出兩位以上的小數(小數點後兩位以上的數字)。我cant't弄清楚爲什麼這不起作用:PHP:如何檢查一個數是否有兩位以上的小數

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

爲什麼數32.45挑選出來,而32.44是不是

+0

小數的數字的字符串表示的屬性,而不是數字本身 – Eric

+3

請問你對'32.560000'爲雙位數或不是? –

+0

如果選擇32.560000或者不選,那並不重要。 – user3021737

回答

2

你可以使用正則表達式之間:

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

謝謝!它仍然不適用於大量數字。但是表達式'/。\。\ d {3,} /'似乎工作正常。 – user3021737

+0

你的意思是「它仍然不適用於大數目」? – Babblo

+0

@ user3021737請注意,'.'在正則表達式中表示「任何字符」。 '\ .'的意思是「文字」。「字符」。本質上這個答案會匹配'1234',因爲它與'* [digit] [digit] [digit]' – h2ooooooo

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

至少跟隨零不合格。 –

+0

@AlmaDo你說得對 - 現在已經修復了,儘管拖尾的零不會存在於浮動類型中。 – h2ooooooo

+0

我可能是正確的。 OP沒有提到 - 所以我只是注意到 –

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.

相關問題