Проверьте, является ли число десятичным

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

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

15 ответов


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

function is_decimal( $val )
{
    return is_numeric( $val ) && floor( $val ) != $val;
}

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

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

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

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


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


если вы хотите" 10.00", чтобы вернуть истинную проверку ответ совы

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

работает со всеми видами типов (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 docs:

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

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


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

посмотреть is_float [docs].

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

^\d+\.\d+$

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

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

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


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

/^(\d+)(\.\d+)?$/

$lat = '-25.3654';

if(preg_match('/./',$lat)) {
    echo "\nYes its a decimal value\n";
}
else{
    echo 'No its not a decimal value';
}

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

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

is_numeric возвращает true для десятичных и целых чисел. Поэтому, если ваш пользователь лениво вводит 1 вместо 1.00 он все равно вернется true:

echo is_numeric(1); // true
echo is_numeric(1.00); // true

вы можете преобразовать целое число в десятичное с помощью PHP или позволить вашей базе данных сделать это за вас.


   // if numeric 

if (is_numeric($field)) {
        $whole = floor($field);
        $fraction = $field - $whole;

        // if decimal            
        if ($fraction > 0)
            // do sth
        else
        // if integer
            // do sth 
}
else

   // if non-numeric
   // do sth

общий cludge.. но эй, это работает !

$numpart = explode(".", $sumnum); 

if ((exists($numpart[1]) && ($numpart[1] > 0 )){
//    it's a decimal that is greater than zero
} else {
// its not a decimal, or the decimal is zero
}

простое решение

if(is_float(2.3)){

 echo 'true';

}

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

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

может быть, попробуйте посмотреть на это, а также

!is_int()