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

我有一个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.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升级。