【问题标题】:How to check if an entered value is currency如何检查输入的值是否为货币
【发布时间】:2011-02-13 03:38:27
【问题描述】:

如何检查输入的值是否为货币。最好通过正则表达式或php函数。

1550.501500100.75 等值)

【问题讨论】:

    标签: php regex


    【解决方案1】:

    我猜你真正想要的是一种从数字中区分任何数字的方法,这是有意义的作为货币价值。所以1.04e-7 可能不应该匹配,1.23412.3 也不应该匹配,即使它们当然都是数字。

    最后,您必须期待像 1,234.56 这样的数千个分隔符(与小数点一样,它也可能因语言环境而异)。因此,假设您只想使用点作为小数分隔符和逗号作为可选的千位分隔符来检查货币值,试试这个:

    /\b\d{1,3}(?:,?\d{3})*(?:\.\d{2})?\b/
    

    说明:

    \b      # word boundary assertion
    \d{1,3} # 1-3 digits
    (?:     # followed by this group...
     ,?     # an optional comma
     \d{3}  # exactly three digits
    )*      # ...any number of times
    (?:     # followed by this group...
     \.     # a literal dot
     \d{2}  # exactly two digits
    )?      # ...zero or one times
    \b      # word boundary assertion
    

    【讨论】:

    • 我第一次看到有人解释他们的正则表达式。 A+ 给你。
    • 救命稻草。如果您想确保整个字符串而不是一个单词都适合这个,请以 ^ 开头而不是 \b 并以 $ 结尾而不是 \b。
    • 感谢威尔的提示。我发现 Tim 发布的正则表达式在使用 \b 时不起作用。
    【解决方案2】:

    基于上面 Tim Pietzcker 的精彩回答,我创建了:

    /* Sample usage:
     * ============
     *  echo '<ol>';
     *  echo '<li>', (isCurrency('10.36') ? "TRUE" : "FALSE"), '</li>'; // 1 - TRUE
     *  echo '<li>', (isCurrency('10.3') ? "TRUE" : "FALSE"), '</li>';  // 2 - TRUE
     *  echo '<li>', (isCurrency('10.') ? "TRUE" : "FALSE"), '</li>';   // 3 - TRUE
     *  echo '<li>', (isCurrency('10') ? "TRUE" : "FALSE"), '</li>';    // 4 - TRUE
     *  echo '<li>', (isCurrency('1,088,888,888,888') ? "TRUE" : "FALSE"), '</li>'; // 5 - TRUE
     *  echo '<li>', (isCurrency('1,088888,888,888') ? "TRUE" : "FALSE"), '</li>';  // 6 - I'm not sure if this should return TRUE or FALSE. For now going with TRUE as we can still interpret the desired value regardless whether the commas are correct.
     *  echo '<li>', (isCurrency('$10') ? "TRUE" : "FALSE"), '</li>';   // 7 - TRUE
     *  echo '<li>', (isCurrency('-10') ? "TRUE" : "FALSE"), '</li>';   // 8 - TRUE
     *  echo '<li>', (isCurrency('$-10') ? "TRUE" : "FALSE"), '</li>';  // 9 - TRUE
     *  echo '<li>', (isCurrency('-$10') ? "TRUE" : "FALSE"), '</li>';  // 10 - TRUE
     *  echo '<li>', (isCurrency('--$10') ? "TRUE" : "FALSE"), '</li>'; // 11 - FALSE
     *  echo '<li>', (isCurrency('-$$10') ? "TRUE" : "FALSE"), '</li>'; // 12 - FALSE
     *  echo '<li>', (isCurrency('10x') ? "TRUE" : "FALSE"), '</li>';   // 13 - FALSE
     *  echo '<li>', (isCurrency('x10') ? "TRUE" : "FALSE"), '</li>';   // 14 - FALSE
     *  echo '</ol>'; */
        function isCurrency (string $currencyToTest): bool
        {
        $regExpPattern = '/^[$-]{0,2}\d{1,3}(?:,?\d{3})*(?:\.\d{0,2})?$/';
    
    /*      $regExpPattern explanation
                /^          # string must begin with
                [$-](0,2)   # optional $ and/or -
                \d{1,3}     # 1-3 digits
                (?:         # followed by this group...
                 ,?         # an optional comma
                 \d{3}      # exactly three digits
                )*          # ...any number of times
                (?:         # followed by this group...
                 \.         # a literal dot
                 \d{2}      # exactly two digits
                )?          # ...zero or one times 
                $/          # must end with
    */
            $currencyToTest = trim ($currencyToTest);
            
            return preg_match ($regExpPattern, $currencyToTest);
        }
    

    添加:

    • 能够以 $ 和/或 - 作为前缀。
    • 增加了 $4 中没有小数点的功能。
    • 要测试的值必须单独存在于 parm 中。

    如果没有 Tim Pietzcker 的回应,我不确定我会走到这一步。

    【讨论】:

      【解决方案3】:

      我用这个:

      function isCurrency($number)
      {
        return preg_match("/^-?[0-9]+(?:\.[0-9]{1,2})?$/", $number);
      }
      
      //usage examples
      echo (isCurrency("10.36") ? "TRUE" : "FALSE");
      echo (isCurrency(10.3) ? "TRUE" : "FALSE");
      

      注意:

      1. 此函数也接受负货币值,如果您不想接受它们,请删除您在 preg_match 开头找到的 -?

      2. 这个函数也返回TRUE 类似13.7(只有一位小数)的值,如果你希望小数点总是两位而不是将{1,2} 替换为{2}(但在执行此读取点之前3)

      3. 此函数返回TRUE 也为0000.78 之类的值(多个前导零),但通常需要这种函数来过滤表单提交的值,然后再将它们插入@ 类型的DB 字段987654330@。当在此类字段中插入时,MySQL 接受 0000.7813.7 作为查询中的有效值,并自动将它们转换为 0.7813.70

      【讨论】:

        【解决方案4】:

        我快速启动了一个函数来检查字符串或 int 是否是有效价格,如果不是,则转换它。最终输出始终是小数点后两位的字符串,例如1000.00

        它会删除减号/负号、逗号、空格和美元符号。唯一的例外是如果字符串包含任何字符(如字母)会将is_numeric() 设置为 false。

        函数如下:

        function convertToValidPrice($price) {
            $price = str_replace(['-', ',', '$', ' '], '', $price);
            if(!is_numeric($price)) {
                $price = null;
            } else {
                if(strpos($price, '.') !== false) {
                    $dollarExplode = explode('.', $price);
                    $dollar = $dollarExplode[0];
                    $cents = $dollarExplode[1];
                    if(strlen($cents) === 0) {
                        $cents = '00';
                    } elseif(strlen($cents) === 1) {
                        $cents = $cents.'0';
                    } elseif(strlen($cents) > 2) {
                        $cents = substr($cents, 0, 2);
                    }
                    $price = $dollar.'.'.$cents;
                } else {
                    $cents = '00';
                    $price = $price.'.'.$cents;
                }
            }
        
            return $price;
        }
        

        这里是测试它:

        var_dump(convertToValidPrice('100'));          // 100.00
        var_dump(convertToValidPrice('-100'));         // 100.00
        var_dump(convertToValidPrice(100));            // 100.00
        var_dump(convertToValidPrice('$100'));         // 100.00
        var_dump(convertToValidPrice('100.98'));       // 100.98
        var_dump(convertToValidPrice('100.9'));        // 100.90
        var_dump(convertToValidPrice('100.'));         // 100.00
        var_dump(convertToValidPrice('1,00.98'));      // 100.98
        var_dump(convertToValidPrice('1,000.98'));     // 1000.98
        var_dump(convertToValidPrice('100.98829382')); // 100.98
        var_dump(convertToValidPrice('abc'));          // null
        

        【讨论】:

          【解决方案5】:

          你不能确定。用户可能会想到鸡。您需要检查用户是否输入了浮点数。看看 preg_match: http://jp2.php.net/manual/en/function.preg-match.php

          您还需要问自己是否要尝试使用用户输入的内容,或者是否要拒绝它并只接受确切的格式。

          【讨论】:

            猜你喜欢
            • 2010-10-17
            • 1970-01-01
            • 1970-01-01
            • 2014-08-01
            • 2021-07-05
            • 2021-09-18
            • 2021-12-04
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多