【问题标题】:how to validate decimal numbers in PHP如何在 PHP 中验证十进制数
【发布时间】:2010-11-12 16:29:40
【问题描述】:

如何在 PHP 中验证十进制数。我查看了 is_numeric() 但这对我不起作用:

bool is_numeric(混合变量)

判断给定变量是否为 数字。数字字符串由 可选符号,任意位数, 可选小数部分和可选 指数部分。因此 +0123.45e6 是 有效数值。 十六进制 也允许使用符号 (0xFF) 但是 只有没有符号、小数和 指数部分。

我不想要指数部分或十六进制表示法。 用户将输入简单的十进制值,我不想要恰好是有效指数或十六进制值滑过去。我只是希望“传统”十进制数字被认为是有效的。

编辑这里是一个简单的(蛮力)页面,其中包含更完整的测试数据(什么应该和不应该被视为数值)。

<html><head></head>
<body>

<?php

function TestFunction($s_value) {
    //
    //  your code here
    //
    return; //true or false;
}

print '<b>these are valid numbers and should return "true"</b><br>';
print '<pre>';
    $s_value='123';     print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='+1';      print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='-1';      print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='  1';     print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='1  ';     print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='  1  ';   print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='1';       print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='12345.1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='6789.01'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='-1.1';    print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='+1.1';    print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='0';       print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='00001.1'; print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='.1';      print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='.0000001';print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='5.';      print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
print '</pre>';

print '<br><b>these are NOT valid numbers and should return "false"</b><br>';
print '<pre>';

    $s_value='--------------------------------';print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value=null;      print "\n".'$s_value=null, TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='.';       print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='';        print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value=' ';       print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='  ';      print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='1abc';    print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='$1';      print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='1@';      print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='1.2.1';   print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='abc';     print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='1.45e6';  print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='0xFF';    print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='++1';     print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='--1';     print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='1+';      print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='1-';      print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='a1';      print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='#1';      print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='10.e5';   print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='0x1';     print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
    $s_value='0x';      print "\n".'$s_value="'.$s_value.'", TestFunction()='.(TestFunction($s_value)?'true':'false');
print '</pre>';

?>

</body>
</html>

【问题讨论】:

  • 只是为了争论,你不应该对--1++1这样的东西宽容吗?
  • @Jason McCreary,数据被一些对--1++1等不宽容的东西使用
  • 是否应该将.5 视为有效(如0.5)?

标签: php validation


【解决方案1】:

更新了您的测试数据。

function TestFunction($s_value) {
    $regex = '/^\s*[+\-]?(?:\d+(?:\.\d*)?|\.\d+)\s*$/';
    return preg_match($regex, $s_value); 
}

$valid = TestFunction($input);

或者先修剪输入

function TestFunction($s_value) {
    $regex = '/^[+\-]?(?:\d+(?:\.\d*)?|\.\d+)$/';
    return preg_match($regex, $s_value); 
}

$input = trim($input);
$valid = TestFunction($input);

【讨论】:

    【解决方案2】:
    $decimal = preg_match('/^[+\-]?\d+(\.\d+)?$/', $value) ? (float)$value : 0.0;
    

    【讨论】:

    • 这不会匹配包含单个数字的值,我相信 /^[+\-]?\d+(?:\.\d+)?$/ 可能有效
    • @rr:它匹配单个数字很好。我不是正则表达式专家,所以我将其插入文件;但据我所知,单位数的可能性是()? 周围的\.\d+ 的用途。
    • 我最初发表评论时括号不存在:)
    • 我忘记在我的示例值中包含这个,但.5 不适用于此代码。
    【解决方案3】:
    $number = preg_match($number, '/\\A\\s*[+\\-]?\\d*(\\.\\d+)?\\s*\\Z/') ? 
              trim($number) :
              'INVALID';
    if ($number === '') { $number = '0'; }
    if ($number === 'INVALID') {
        // handle
    }
    

    【讨论】:

      【解决方案4】:

      正则表达式呢? preg_match(/[+\-]?\d*(\.\d+)?([eE][+\-]?d+)?/,$var); [eE] 位和之后允许人们输入 2.3e2 以获得非常大或非常小的数字,所以如果您不想要它,请忽略它。这整件事将允许:

      2
      0.3
      .3
      2.2
      +2.2
      -2.2
      2.3e3
      2.3E-3
      

      【讨论】:

        【解决方案5】:

        正则表达式看起来像

        [me@home ~]$ cat test.php
        <?php
        
        $regex = "/^([+-]{1})?[0-9]+(\.[0-9]+)?$/";
        
        $numbers = array("1", "12345.1", "6789.01", "-1.1", "+1.1", "0", "00001.1");
        
        foreach($numbers as $number) {
        
                print preg_match($regex, $number)."\n";
        
        }
        [me@home ~]$ php -e test.php
        1
        1
        1
        1
        1
        1
        1
        

        【讨论】:

        • 我忘记将其包含在我的示例值中,但 .5 不适用于此代码。
        【解决方案6】:
        $value = (float)$value;
        

        【讨论】:

          猜你喜欢
          • 2011-01-14
          • 1970-01-01
          • 1970-01-01
          • 2021-05-25
          • 2010-09-06
          • 2011-01-30
          相关资源
          最近更新 更多