【问题标题】:Validate decimal number in (known) national format以(已知)国家格式验证十进制数
【发布时间】:2010-05-31 09:40:38
【问题描述】:

PHP 有许多内置函数来验证数字,但它们都希望以 computer 格式输入:1234.56。我需要验证 1,234.56(英语)或 1.234,56(西班牙语)之类的内容,以及一些典型属性(可接受的范围、最大小数位数等)。

我开始编写自己的函数,但很快就迷路了。 读取用户输入到浮点变量中很容易,但我希望能够检测具有无效格式的数字,例如 1,23456.71..25

你对这个主题有什么建议吗?

(事先知道十进制和千位字符,可以将数字组硬编码为三个,无需覆盖Indian number format。)

【问题讨论】:

    标签: php validation


    【解决方案1】:

    查看NumberFormatter::parse。您可以使用它解析许多语言环境中的数字。整个 intl 扩展很有用,尽管它还没有完全“存在”。

    【讨论】:

    • 不幸的是,只能在 PHP 5.3+ 中工作,但无论如何都很好的解决方案,不知道。
    【解决方案2】:

    我在 php 手册的评论中发现了一个有趣的函数:http://fr2.php.net/manual/en/language.types.float.php#92885 看看吧。

    【讨论】:

    • 虽然没有直接应用于我的问题,但这是一种机智的方法。太糟糕了,在遇到 Windows 实现中的一些错误后,我对 setlocale() 感到害怕。
    【解决方案3】:

    您可以使用正则表达式来验证数字:

    $ds = '.'; // Decimal separator
    $ts = ','; // Thousand separator
    
    $isValidFloat = preg_match(
        '/^
    
             # Integer part, one of the two allowed formats:
             # 1) with thousand separator, grouped by 3 digits
             # 2) without thousand separator
             (\d{1,3}(' . preg_quote($ts) . '\d{3})* | \d+)
    
             # Optional decimal part
             (' . preg_quote($ds) . '\d+)?
    
        $/x', $string);
    

    然后将它转换成这样的浮点数:

    $float = (float) strtr($string, array($ts => '', $ds => '.'));
    

    【讨论】:

      【解决方案4】:

      除了给定的解决方案之外,我建议使用PEAR Validation package 来验证数字。

      这是他们网站上的一个例子:

      <?php
      require_once 'Validate.php';
      
      $number = '-8,1';
      if (Validate::number($number,
          array('decimal' => '.,', 'min' => -9, 'max' => -7 ))) {
          echo 'Valid';
      } else {
          echo 'Invalid';
      }
      

      如果您想对格式更严格,那么您可以将其解析为浮点数(您已经这样做了),然后使用number_format 将浮点数输出为您接受的格式,并尝试匹配原始格式针对您生成的任何一个。

      【讨论】:

      • 我去看看。 (最好不要这么严格:对我来说,1000.51,000.50 一样有效。)
      【解决方案5】:

      您执行所有计算,对于结果变量,您可以使用内置函数 number_format 根据您的要求对其进行格式化。

      【讨论】:

      • 我不想从浮点数转换为字符串。我想验证字符串是否包含国家格式的有效数字。 12.345 是一个有效数字,但我不能将它存储在 DECIMAL(4,2) 列中。 1000 是有效号码,但不是有效折扣。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      相关资源
      最近更新 更多