【问题标题】:using Javascript to force number precision on event Onkeypressed in textbox使用 Javascript 在文本框中的 Onkeypressed 事件上强制数字精度
【发布时间】:2012-09-21 03:43:47
【问题描述】:

我需要的是在用户输入文本框时强制用户 -

  1. 最多可以放16个

  2. 如果他们按 .他们可以在点后添加额外的 2 位数字

所以到目前为止我所做的是

<asp:TextBox ID="textbox" runat="server" Width="200" onkeypress="validateCurrencyX(this,7, 2);" >0.00</asp:TextBox>

javascript代码是

function validateCurrencyX(sender,prefix, suffix){
var something = document.getElementById('textbox').value;
           var valueArr = something.split('.');

            if (valueArr[1]!= null && valueArr[1].length > suffix-1)
                event.returnValue = false;

            if (valueArr[0].length > prefix-1)
                event.returnValue = false;
    }

反正我的代码有问题 - 当我选择整个文本或部分文本并按下某个东西时,它不会改变任何东西

他们有什么普通的方法吗?我对 javascript 和 asp.net 都很陌生 谢谢关注

【问题讨论】:

  • prefix 参数应该是什么?
  • @NathanWall 墙前缀是点之前的可用数字,我希望它是 16。后缀是点之后的可用数字

标签: javascript asp.net validation


【解决方案1】:

由于您对 javascript 和 .net 都是新手,因此最好不要尝试重新发明轮子。

如果您愿意使用 jQuery,请查看NumberFormatter

$(".amt").blur(function(){
    $(this).format({format:"#,###,###,###,###,###.00", locale:"us"});
});

【讨论】:

    【解决方案2】:

    这是你想要的:

    <asp:TextBox ID="textbox" runat="server" Width="200" oninput="validateCurrencyX(this,7, 2);" onkeydown="validateCurrencyX(this,7, 2);" >0.00</asp:TextBox>
    

    JavaScript:

    var validateCurrencyX = (function() {
        // Closure for local oldVal variable
        var oldVal = 0;
        return function validateCurrencyX(sender, prefix, suffix) {
            setTimeout(function() {
                // Convert to number
                var val = sender.value * 1,
                // Get decimals
                    dec = sender.value.split('.')[1];
                if(
                    val != val // NaN
                    || val > 16
                    || val < 0
                    || dec && dec.length > suffix // check number of decimals
                ) {
                    // If the new input doesn't fit the criteria, revert to the old input.
                    sender.value = oldVal;
                } else {
                    if(Math.floor(val) != 0 && sender.value.charAt(0) == '0') {
                        // If it's a number >= 1, remove leading '0's.
                        sender.value = sender.value.replace(/^0+/, '');
                    }
                    // Value is good. Save it in case we need to revert later.
                    oldVal = sender.value;
                }
            }, 0);
        };
    })();
    

    这是一个工作示例:http://jsfiddle.net/6HUUT/4/

    获得用户友好的实时文本验证器的关键是 (1) 使用 onkeydown / oninput 而不是 onkeypress,因为 @987654327 @ 不会因为粘贴和删除等内容而触发,并且 (2) 使用间隔为 0setTimeout 检查用户实际输入的内容,并在文本框中更新后更改它,而不是试图阻止他们从一开始就输入它。同样,这有助于粘贴和删除等操作,以及在开头以外的位置插入字符,通常会让您的生活更轻松。这个想法只是让用户进行更改,然后检查它们以确保它们正常。

    注意,onkeydownoninput 用于旧版浏览器。 input 对于现代浏览器来说已经足够了,但是旧的浏览器(大约 IE8)不支持它。

    【讨论】:

    • 按 时。它不会在点后添加额外的 2 位数字
    • @krish,这不会给用户带来麻烦吗?如果你想要这个功能,你可以想办法让它工作并且对用户友好,但你不会只希望它添加两个 0,仅此而已。从用户体验的角度来看,还有更多需要考虑。这些考虑可以留给实现此技术的开发人员,并且超出了此答案的范围。
    【解决方案3】:

    这是没有使用 javascript,因为你说过 - 他们有什么普通的方法吗?所以看看这个:

    1) 他们可以输入的最大数字是 16:为此,您拥有文本框的 maxlength 属性。将其设置为 16

    2) 这段代码将限制您的用户在文本框中仅输入小数点后 2 位。

    //In key press event of your TextBox:
    if (e.KeyChar == '.' && (sender as TextBox).Text.IndexOf('.') > -1)
    {
        e.Handled = true;
    }
    if (!char.IsControl(e.KeyChar))
    {
        TextBox tt = (TextBox)sender;
        if (tt.Text.IndexOf('.') > -1 && tt.Text.Substring(tt.Text.IndexOf('.')).Length >= 3)
         {
           e.Handled = true;
         }
     }
    

    【讨论】:

    • [maxlength] 与文本框中的最大值无关。
    • @zzzzBov:操作员要求输入的最大数字是 16。我假设它是 16 位数字而不是值 16。让我看看我是否正确。无论如何,他可以使用第二点的答案,这会很好。
    • 感谢两位。但@zzzzBov 是对的.. 16-didgit 要求意味着“。”左侧的数字只是......所以设置属性不会有帮助......我想我会在这个问题上更清楚
    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多