Javascript 函数在输入时仅允许在文本框中输入具有 2 个小数点的十进制数

标签 javascript asp.net

我有一个 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/

相关文章:

javascript - 我想在我的 WordPress 网站中使用 counterup.js 但它显示错误

c# - ASP.NET:在回发不同数据后动态添加控件

javascript - 同步 Jquery Ajax 调用

javascript - 组合/精炼两个相同的 jQuery block

c# - 什么是将参数传递给 SQL,为什么我需要它?

javascript - 需要在 html 表格中进行简单易用的分页

c# - 如何自定义 TreeNode 在 TreeView 中的显示顺序/位置?

javascript - 在 end_request 处理程序期间回发后无法从 asp gridview 检索数据

JavaScript 正则表达式帮助

javascript - 我应该在每个类方法中创建一个新的 Promise 吗?