我想验证表单中的数字字段(价格)。
我尝试以这种方式验证格式10.00
,没关系。
$pattern = '/^\d+(:?[.]\d{2})$/';
if (preg_match($pattern, $_POST['price']) == '0') {
echo "ERROR";
exit;
}
现在我想同时验证字段格式,例如10.00
and 10
。我怎么能这样做?
我想验证表单中的数字字段(价格)。
我尝试以这种方式验证格式10.00
,没关系。
$pattern = '/^\d+(:?[.]\d{2})$/';
if (preg_match($pattern, $_POST['price']) == '0') {
echo "ERROR";
exit;
}
现在我想同时验证字段格式,例如10.00
and 10
。我怎么能这样做?
你的新模式:
$pattern = '/^\d+(\.\d{2})?$/';
将验证:
10
10.00
如果您想使05.00 等前导零数字无效,以下模式将有所帮助:
$pattern = '/^(0|[1-9]\d*)(\.\d{2})?$/';
如果您只检查它是否是数字,那么 is_numeric() 在这里要好得多。它比正则表达式更具可读性和速度。
我快速启动了一个函数来检查字符串或 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