如何检查输入的值是否为货币

时间:2011-02-13 03:38:27

标签: php regex

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

1550.501500100.75

等值

5 个答案:

答案 0 :(得分:48)

我猜你真正想要的是一种方法,可以将数字中的任何号码告诉作为货币值。因此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

答案 1 :(得分:23)

我用这个:

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(只有一个小数),如果您希望小数始终为2而不是{1,2}替换为{2} (但在此之前执行此读取点3)

  3. 此函数也会返回TRUE这样的值,例如0000.78(多个前导零),但通常需要这种函数来过滤表单提交的值,然后再将它们插入到数据库中DECIMAL(n.2)类型的字段。在这些类型的字段中插入时,MySQL会同时接受0000.7813.7作为查询中的有效值,并自动将它们转换为0.7813.70

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

基于上面的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。
  • 要测试的值必须在参数中单独存在。

如果没有蒂姆·皮茨克(Tim Pietzcker)的回应,我不确定我会走这么远。

答案 4 :(得分:-1)

我迅速启动了一个函数,用于检查字符串或整数是否是有效价格,如果不是,则将其转换。最终输出将始终是小数点后两位的字符串,例如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