我试图创建一个正则表达式代码,以匹配带或不带美元符号$的价格,并带或不带逗号或小数点。
以下价格应该有效。
$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)
答案 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