检查数字是否为小数

时间:2011-07-21 07:22:08

标签: php function decimal

如果用户输入了十进制数字(美国方式,带小数点:X.XXX),我需要检查PHP

有任何可行的方法吗?

17 个答案:

答案 0 :(得分:86)

你可以从is_float获得你想要的大部分内容,但如果真的需要知道它是否有小数,那么你上面的函数就不是很远了(尽管如此)错误的语言):

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

答案 1 :(得分:22)

如果你需要知道的是变量中是否存在小数点,那么这将完成工作......

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

这不是一个非常优雅的解决方案,但它适用于字符串和浮点数。

确保在strpos测试中使用!==而不是!=否则您将得到不正确的结果。

答案 2 :(得分:13)

如果你想要“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返回参数除法的浮点余数(modulo),(因此(!== 0.00))

模数运算符 - 为什么不使用模数运算符?例如。 ($val % 1 != 0)

来自PHP docs

  

在处理之前,模数的操作数被转换为整数(通过去除小数部分)。

哪个会有效地破坏op目的,在javascript这样的其他语言中你可以使用模数运算符

答案 3 :(得分:11)

解决此问题的另一种方法:preg_match('/^\d+\.\d+$/',$number);:)

答案 4 :(得分:7)

您发布的功能不是PHP。

查看is_float [docs]

修改:我错过了“用户输入值”部分。在这种情况下,您实际上可以使用正则表达式:

^\d+\.\d+$

答案 5 :(得分:4)

我传递了一个字符串,想知道它是否是小数。我最终得到了这个:

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

我在零的两边运行了一堆测试,包括小数和非小数,它似乎有效。

答案 6 :(得分:1)

这是一种更容忍的方式来处理用户输入。这个正则表达式将匹配" 100"或" 100.1"但不允许负数。

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

答案 7 :(得分: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;
}

答案 8 :(得分:0)

$lat = '-25.3654';

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

答案 9 :(得分:0)

查找任何一个过帐值的简单方法是整数和浮点数,这样对您有帮助

$postedValue = $this->input->post('value');
if(is_numeric( $postedValue ) && floor( $postedValue ))
{
    echo 'success';
}
else
{
   echo 'unsuccess';
}

如果您给出10或10.5或10.0,则如果您定义任何不带点的字符或特殊字符,结果将是成功的

答案 10 :(得分: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;
}

答案 11 :(得分:0)

最简单的解决方案是

if(is_float(2.3)){

 echo 'true';

}

答案 12 :(得分:0)

一个完全的淤泥......但是嘿它有效!

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

答案 13 :(得分: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

答案 14 :(得分:0)

is_numeric返回true的小数和整数。因此,如果您的用户懒洋洋地输入1而不是1.00,它仍会返回true

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

您可能希望使用PHP将整数转换为小数,或者让数据库为您执行此操作。

答案 15 :(得分:-1)

function is_decimal_value( $a ) {
    $d=0; $i=0;
    $b= str_split(trim($a.""));
    foreach ( $b as $c ) {
        if ( $i==0 && strpos($c,"-") ) continue;
        $i++;
        if ( is_numeric($c) ) continue;
        if ( stripos($c,".") === 0 ) {
            $d++;
            if ( $d > 1 ) return FALSE;
            else continue;
        } else
        return FALSE;
    }
    return TRUE;
}

上述功能的已知问题:

1)不支持“科学符号”(1.23E-123),财政(领先的$或其他)或“交易f”(C ++样式的浮动货币)或“交易货币”(USD,GBP等)

2)对与小数点匹配的字符串文件名误判:请注意,例如“ 10.0”作为文件名不能与小数点区分开,因此,如果您尝试仅从字符串和文件名中检测类型,匹配十进制名称,并且不包含路径,因此无法辨别。

答案 16 :(得分:-3)

也许尝试一下这个

!is_int()