Javascript函数,在键入时只允许文本框中有两个小数点的十进制数
我有一个asp文本框,我想设置一个javascript函数,只允许人们输入小数点后有两个数字的十进制值。例如:Javascript函数,在键入时只允许文本框中有两个小数点的十进制数,javascript,asp.net,Javascript,Asp.net,我有一个asp文本框,我想设置一个javascript函数,只允许人们输入小数点后有两个数字的十进制值。例如: 43432131-良好 54525582.23-良好 3423.3-良好 .23-好 45573490.343-坏 34.34.34-不好 345..23-错误 你明白了。我有一个带有正则表达式的现有函数 function fnCurrencyOnly(o) { var sValue = o.value; var sKey = String.fr
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#code behind的一个
private void AddAttributes()
{
txtRate.Attributes.Add("onkeypress", "fnCurrencyOnly(this)");
}
只要你从头到尾输入整数,这就行了。但是,如果您有100.00,并且将光标停留在1和0之间,然后键入2,尝试将值设为1200.00(这是完全有效的),则不允许您键入2。原因是在javascript函数中,它执行svalue+skey操作,这只是将您键入的内容固定到最后。所以在这种情况下,它实际上是在验证100.002,这当然是错误的。我想不出一种方法来检查keypress的值是什么,并对照regex进行检查。我知道我可以在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;
}
发件人:
工作完美,除非你仍然可以复制和粘贴盒子里的无效内容。下一步将尝试找到解决方案。最近,我想在对照正则表达式检查值时防止无效按键,并提出了以下方法来处理粘贴和选择重放:
function updateOk(e) {
var k
if (e.clipboardData) k = e.clipboardData.getData('text/plain')
else k = String.fromCharCode(!event.charCode ? event.which : event.charCode)
const start = e.target.selectionStart
const end = e.target.selectionEnd
const v = e.target.value
const n = v.slice(0, start) + k + v.slice(end)
if (!/^\d+(?:\.\d{0,2})?$/.test(n)) {
e.preventDefault()
}
}
输入元素
<input type="text" onkeypress="updateOk(event)" onpaste="updateOk(event)"
placeholder="number with 2 digits"/>
Quick note:在你的问题中,你没有说你的目标浏览器是什么,但它们是HTML5,你应该使用
input
的模式属性。更简单。对不起,我的目标是IE10升级。