正则表达式检查用户提交的价格是否真的是有效价格

时间:2017-03-30 19:42:05

标签: php regex

我试图创建一个正则表达式代码,以匹配带或不带美元符号$的价格,并带或不带逗号或小数点。

以下价格应该有效。

$1
$5.00
$.10
$.07
$03 //this should be interpreted as $0.03 in case if you are confused
$10,000
$10,000.00

1
5.00
.10
.07
03 //this should be interpreted as $0.03 in case if you are confused
10,000
10,000.00

到目前为止,这是我的代码:

preg_match('/^([1-9][0-9]*|0)(\.[0-9]{2})?$/', $price)

3 个答案:

答案 0 :(得分:0)

你觉得这样吗?

preg_match(
    '/^' .
    '\$?' . // optional dollar sign
    '[\d]*' . // any digits (0 or not does not make a difference, 03 is valid as well as .03 or 0.03)
    '(,\d{3})*?' . // a comma has to be followed by 3 digits to be valid
    '(.\d\d)?' . // the point has to be followed by 2 digits to be valid
    '$/', // the end
    $price
);

如果你想在每三个数字后强制使用一个逗号,你必须调整它。但是如果你google" regex float"那么有很好的正则表达式。 (如http://www.regular-expressions.info/floatingpoint.html

我不确定为什么" 03"或" $ 03"很重要如果你想验证字符串,好的。如果你只想将它转换为浮点数,我会保持简单,愚蠢:

$price = str_replace(['$', ','], '', $str);
    if ('0' === $price[0]) {
        $price = '.' . $price;
    }
    $price = (float) $price;

答案 1 :(得分:0)

您可以使用此正则表达式 -

^\$?(?:(?:\d+(?:,\d+)?(?:\.\d+)?)|(?:\.\d+))$

这里是demo,也解释了它。

请注意,我已将03和.03添加为单独的条目。这个正则表达式将匹配它们。

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