2013-11-22 2 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

Decimals является собственностью строкового представления чисел, а не сами цифры – 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 Обратите внимание: '.' в regex означает« любой символ ». '\ .' означает« буквальный символ. ». По существу этот ответ будет соответствовать «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

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).
  • $ - строка должна закончиться здесь - ничего не может быть между нашим последним матчем и в конце строки
+0

Ошибка с завершающими нулями. –

+0

@AlmaDo Вы правы - это исправлено сейчас, хотя конечные нули никогда не будут существовать в плавающем типе. – h2ooooooo

+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.

Смежные вопросы