function validateAmount(inputElement) {
let value = inputElement.value;
// 使用正则表达式匹配,允许开头为可选的负号,然后是数字和小数点,最多两位小数
const regex = /^-?\d+(\.\d{0,2})?$/;
if (!regex.test(value)) {
// 如果不匹配,则去除无效字符
inputElement.value = value.replace(/[^0-9.-]/g, '');
// 处理多个小数点的情况,只保留第一个
const decimalCount = (inputElement.value.match(/\./g) || []).length;
if (decimalCount > 1) {
inputElement.value = inputElement.value.replace(/\./g, (match, offset, string) => {
return offset === string.indexOf('.') ? '.' : '';
});
}
// 处理负号位置,只能在开头
if (inputElement.value.startsWith('-') && inputElement.value.lastIndexOf('-') !== 0) {
inputElement.value = '-' + inputElement.value.replace(/-/g, '');
} else if (!inputElement.value.startsWith('-') && inputElement.value.includes('-')) {
inputElement.value = inputElement.value.replace(/-/g, '');
}
// 处理以小数点开头的情况,前面加 0
if (inputElement.value.startsWith('.')) {
inputElement.value = '0' + inputElement.value;
}
// 处理负号和小数点一起开头的情况,前面加 0
if (inputElement.value.startsWith('-.')) {
inputElement.value = '-0' + inputElement.value.substring(1);
}
// 限制小数位数
const parts = inputElement.value.split('.');
if (parts.length === 2 && parts[1].length > 2) {
inputElement.value = parts[0] + '.' + parts[1].substring(0, 2);
}
}
}
// 绑定input事件
const amountInput = document.getElementById('amountInput'); // 将 'amountInput' 替换为你输入框的ID
if (amountInput) {
amountInput.addEventListener('input', function(event) {
validateAmount(this);
});
}
HTML示例:
<input type="text" id="amountInput" placeholder="请输入金额">
代码解释和改进:
-
正则表达式: 使用
^-?\d+(\.\d{0,2})?$
来匹配金额格式。^
: 匹配字符串的开头。-?
: 匹配可选的负号。\d+
: 匹配一个或多个数字。(\.\d{0,2})?
: 匹配可选的小数部分,最多两位小数。$
: 匹配字符串的结尾。
-
实时校验: 使用
input
事件监听输入框的变化,并在每次输入时进行校验。 -
无效字符处理: 使用
replace(/[^0-9.-]/g, '')
去除任何非数字、小数点和负号的字符。 -
多个小数点处理: 代码现在可以处理多个小数点的情况,只保留第一个。
-
负号位置处理: 确保负号只能出现在开头。
-
小数点开头处理: 如果输入以小数点开头,则自动在前面添加
0
。 -
负号和小数点一起开头处理: 如果输入以
-.
开头,则自动在前面添加0
。 -
小数位数限制: 限制小数部分最多只能有两位。
-
getElementById
的错误处理: 添加了if (amountInput)
来检查是否找到了元素,避免空指针错误。
这个改进后的版本更加健壮,可以处理各种边缘情况,并提供更好的用户体验。 它能实时响应用户的输入,并确保输入框中的值始终符合金额格式的要求。
标签:3.56,inputElement,amountInput,小数点,value,负号,开头,input,输入 From: https://www.cnblogs.com/ai888/p/18591757