我有一个 asp 文本框,我想设置一个 javascript 函数,只允许人们输入小数点后 2 个数字的十进制值。例如:
43432131 - 好
54525582.23 - 好
3423.3 - 好
.23 - 好
45573490.343 - 坏
34.34.34 - 坏
345..23 - 坏
你明白了。我有一个现有的函数,其中的正则表达式可以工作。
function fnCurrencyOnly(o) {
var sValue = o.value;
var sKey = String.fromCharCode(window.event.keyCode);
if (document.selection.createRange().text == sValue) {
sValue = sKey;
}
else {
sValue = sValue + sKey;
}
var re = new RegExp("^\\d+(?:\\.\\d{0,2})?$");
if (!sValue.match(re))
window.event.returnValue = false;
}
我将其设置为 C# 代码中的按钮,后面带有
private void AddAttributes()
{
txtRate.Attributes.Add("onkeypress", "fnCurrencyOnly(this)");
}
只要您从头到尾输入整个数字,此操作就有效。但是,例如,如果您有 100.00,并将光标放在 1 和零之间并输入 2,尝试将值设置为 1200.00(这是完全有效的),它不会让您输入 2。原因在于javascript 函数,它执行 svalue + skey 操作,它只是将您输入的内容添加到末尾。所以在这种情况下,它实际上是在验证 100.002,这当然是错误的。我无法找到一种方法来检查按键的值是什么,并根据正则表达式进行检查。我知道我可以在 keyup 上执行此操作,但是如果它无效,我该如何恢复到旧值?
最佳答案
好吧,我找到了自己的答案:
function doGetCaretPosition(oField) {
// Initialize
var iCaretPos = 0;
// IE Support
if (document.selection) {
oField.focus(); // Set focus on the element
var oSel = document.selection.createRange(); // To get cursor position, get empty selection range
oSel.moveStart("character", -oField.value.length); // Move selection start to 0 position
iCaretPos = oSel.text.length; // The caret position is selection length
}
// Firefox support
else if (oField.selectionStart || oField.selectionStart == "0") {
iCaretPos = oField.selectionStart;
}
// Return results
return (iCaretPos);
}
function fnCurrencyOnly(o) {
var sValue = o.value;
var sKey = String.fromCharCode(window.event.keyCode);
var pos = doGetCaretPosition(o);
if (document.selection.createRange().text == sValue) {
sValue = sKey;
}
else {
sValue = sValue.substr(0, pos) + sKey + sValue.substr(pos);
}
var re = new RegExp("^\\d+(?:\\.\\d{0,2})?$");
if (!sValue.match(re))
window.event.returnValue = false;
}
来自: https://codinglifestyle.wordpress.com/2009/04/24/currency-textbox-with-javascript/#comment-2064
工作完美,只是您仍然可以在框中复制并粘贴无效内容。接下来将尝试找到解决方案。
关于Javascript 函数在输入时仅允许在文本框中输入具有 2 个小数点的十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25269800/