2011-07-21 2 views
27

мне нужно проверить в PHP, если пользователь ввел десятичное число (США путь, с десятичной точкой: x.xxx)Проверьте число десятичного

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

+3

Это не определение функции PHP. –

+0

Это ActionScript, а не PHP. – Ikke

+0

Это не PHP. – red

ответ

70

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

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

Как работает '$ val% 1'? –

+0

@ Феликс Хау ... Наверное, это не так. В Python и ECMAScript это лучший способ справиться с этим. Я поменял его на что-то более универсальное. – cwallenpoole

+0

Я просто этого не видел раньше, но он всегда возвращался «0» для меня (в PHP). +1 для обновленного :) –

7

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

Посмотрите на is_float[docs].

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

^\d+\.\d+$ 
+0

Это проверяет только тип номера, а не содержимое. Поэтому 'is_float ('1.14')' возвращает false. – Ikke

+0

@Ikke: О, я могу поклясться, что это было просто тестирование номера ... –

+0

Ну, он говорит о введенном пользователем номере, что, скорее всего, является строкой. Поэтому его сначала нужно преобразовать в число. – Ikke

9

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

+0

, что соответствует 'abc1.23ef' – rabudde

+0

@rabudde, спасибо! отредактированный – k102

4

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

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

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

+1

этот метод неверно возвращает false, когда у вас есть float, например, 0.0000 – 10us

+0

$ value = '23 .43fg '; ???? –

13

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

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

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

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

-3

Может быть, поищите в этом, а

!is_int()

0

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

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

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

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

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

1
$lat = '-25.3654'; 

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

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

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

это потрясающе спасибо. – cartalot

0
// 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 
8

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

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

Работает со всеми видами типов (целое, с плавающей точкой, строки)

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))

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

От PHP docs:

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

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

0

Всего 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 
} 
0

решение Простейшие является

if(is_float(2.3)){ 

echo 'true'; 

} 
0

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

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; 
} 
Смежные вопросы