Проверьте, является ли число десятичным - PullRequest
36 голосов
/ 21 июля 2011

Мне нужно проверить в PHP, если пользователь ввел десятичное число (по-американски, с десятичной точкой: X.XXX)

Есть ли надежный способ сделать это?

Ответы [ 15 ]

86 голосов
/ 21 июля 2011

Вы можете получить большую часть того, что вы хотите, от is_float , но если вам действительно нужно знать, есть ли в нем десятичная дробь, ваша функция не так уж и далеко ( хотя и не на том языке):

function is_decimal( $val )
{
    return is_numeric( $val ) && floor( $val ) != $val;
}
22 голосов
/ 24 января 2012

Если все, что вам нужно знать, это то, существует ли десятичная точка в переменной, тогда это выполнит работу ...

function containsDecimal( $value ) {
    if ( strpos( $value, "." ) !== false ) {
        return true;
    }
    return false;
}

Это не очень элегантное решение, но оно работает со строкамии плавает.

Обязательно используйте! ==, а не! = в тесте strpos, иначе вы получите неправильные результаты.

16 голосов
/ 06 ноября 2014

если вы хотите, чтобы "10.00" вернул true, проверьте ответ Night Owl

Если вы хотите узнать, имеет ли десятичное число значение, вы можете использовать этот ответ.

Работает со всеми видами типов (int, float, string)

if(fmod($val, 1) !== 0.00){
    // your code if its decimals has a value
} else {
    // your code if the decimals are .00, or is an integer
}

Примеры:

(fmod(1.00,    1) !== 0.00)    // returns false
(fmod(2,       1) !== 0.00)    // returns false
(fmod(3.01,    1) !== 0.00)    // returns true
(fmod(4.33333, 1) !== 0.00)    // returns true
(fmod(5.00000, 1) !== 0.00)    // returns false
(fmod('6.50',  1) !== 0.00)    // returns true

Объяснение:

fmod возвращает остаток с плавающей запятой (по модулю) от деления аргументов (отсюда (! == 0,00))

оператор модуля - почему бы не использовать оператор модуля?Например, ($val % 1 != 0)

Из документов PHP :

Операнды модуля перед обработкой преобразуются в целые числа (путем удаления десятичной части).

Это эффективно разрушает операционные цели, в других языках, таких как javascript, вы можете использовать оператор модуля

11 голосов
/ 21 июля 2011

другой способ решить эту проблему: preg_match('/^\d+\.\d+$/',$number);:)

7 голосов
/ 21 июля 2011

Функция, которую вы опубликовали, просто не PHP.

Посмотрите на is_float [документы] .

Редактировать: Я пропустил часть "введенное пользователем значение".В этом случае вы можете использовать регулярное выражение:

^\d+\.\d+$
5 голосов
/ 13 октября 2011

Мне передали строку, и я хотел узнать, десятичная она или нет.Я закончил с этим:

function isDecimal($value) 
{
     return ((float) $value !== floor($value));
}

Я выполнил кучу тестов, включая десятичные и недесятичные по обе стороны от нуля, и, похоже, это сработало.

1 голос
/ 05 июля 2014

Я использую это:

function is_decimal ($price){
  $value= trim($price); // trim space keys
  $value= is_numeric($value); // validate numeric and numeric string, e.g., 12.00, 1e00, 123; but not -123
  $value= preg_match('/^\d$/', $value); // only allow any digit e.g., 0,1,2,3,4,5,6,7,8,9. This will eliminate the numeric string, e.g., 1e00
  $value= round($value, 2); // to a specified number of decimal places.e.g., 1.12345=> 1.12

  return $value;
}
1 голос
/ 10 сентября 2013

Это более терпимый способ справиться с этим с помощью пользовательского ввода.Это регулярное выражение будет соответствовать как 100, так и 100,1, но не допускает отрицательных чисел.

/^(\d+)(\.\d+)?$/
0 голосов
/ 15 декабря 2017

Если вы работаете с проверкой формы. Затем в этом случае отправьте форму. Я использовал следующий код, чтобы проверить, является ли ввод формы десятичным числом или нет Я надеюсь, что это сработает и для вас.

function is_decimal($input = '') {

    $alphabets = str_split($input);
    $find = array('0','1','2','3','4','5','6','7','8','9','.'); // Please note: All intiger numbers are decimal. If you want to check numbers without point "." then you can remove '.' from array. 

    foreach ($alphabets as $key => $alphabet) {
        if (!in_array($alphabet, $find)) {
            return false;
        }
    }

    // Check if user has enter "." point more then once.
    if (substr_count($input, ".") > 1) {
        return false;
    }

    return true;
}
0 голосов
/ 24 августа 2017

Самое простое решение -

if(is_float(2.3)){

 echo 'true';

}
...