表單價格欄位驗證常見缺陷:僅前端攔截非數字字符,提交時未校驗小數位數、格式規範,導致髒數據入庫。本文提供「正則格式檢核 + 浮點數解析一致性比對」的雙重防線,兼容 JavaScript 前端與 Java 後端邏輯復用。
parseFloat 解析結果一致(排除 01.23、1. 等異常格式)function checkForm() {
var price = document.form1.SoftPrice.value.trim();
if (!price) {
alert("請填寫軟件價格!");
document.form1.SoftPrice.focus();
return false;
}
if (!isPriceNumeric(price)) {
alert("價格格式不正確:僅允許數字,小數點後最多兩位!");
document.form1.SoftPrice.focus();
return false;
}
return true;
}
function isPriceNumeric(str) {
if (!str) return false;
// 正則:整數部分至少一位,小數點可選,小數位 0-2 位
var regex = /^[0-9]+(\.[0-9]{1,2})?$/;
if (!regex.test(str)) return false;
// 雙重檢核:字符串與浮點數解析結果完全一致
try {
return parseFloat(str) == str;
} catch (e) {
return false;
}
}
public boolean isPriceNumeric(String str) {
if (str == null || str.trim().isEmpty()) return false;
String regex = "^[0-9]+(\\.[0-9]{1,2})?$";
if (!str.matches(regex)) return false;
try {
return Double.parseDouble(str) == Double.valueOf(str);
} catch (NumberFormatException e) {
return false;
}
}
| 檢核層 | 作用 | 攔截案例 |
|---|---|---|
| 正則格式 | 結構合法性 | abc, 1.2.3, 1., .23, 01.23 |
| parseFloat 一致性 | 語義等價性 | 1.00→1 (不一致), 01.23→1.23 (不一致) |
parseFloat(str) <= MAX_PRICEoninput="this.value=this.value.replace(/[^0-9.]/g,'')" 輔助用戶,但不可替代提交時完整驗證。雙重檢核模式簡單可靠,可直接納入項目通用驗證工具庫,消除價格字段數據質量隱患。