【问题标题】:Live control a float input with a regex mask使用正则表达式掩码实时控制浮点输入
【发布时间】:2012-01-11 18:11:55
【问题描述】:

我制作了一个函数来控制数字和浮点数。 但它不适用于浮点数,必须像这样的表达式:

// I wish a number like x figures . 3 figures (example : 123456.123)
/^([1-9][0-9]*|0)(\.[0-9]{3})?$/

但是这个表达式让点消失了……

以下工作/(^\d+$)|(^\d+\.\d+$)|[,.]/,但可以添加多个点:

$('.float_input').live("keypress",function(){inputControl($(this),'double');});

function inputControl(input,format) 
{ 
    var value=input.val();
    if (format=='int'){expression=/(^\d+$)|(^\d+\.\d+$)/;}
    else if (format=='double'){expression=/(^\d+$)|(^\d+\.\d+$)|[,.]/;}
    var values=value.split("");
    var update="";
    for(id in values)
    {           
        if (expression.test(values[id])==true && values[id]!='')
        {
              // also replace ',' by '.' 
              update=update+''+values[id].replace(',','.');
        }
    }
    input.val(update);
}

所以我有多个点或没有点,这让我很疯狂,因为我肯定会接近解决方案。

编辑 > 解决方案

哎呀,感谢您对正则表达式的帮助,我找到了解决方案!

两个测试是必要的:

  • 一个为字符测试,一个一个测试
  • 另一个在输入字符时测试整个输入

这是最终的脚本,像花一样工作,我只为你分享:

$('.numeric_input').live("keyup",function(){inputControl($(this),'int');});
$('.float_input').live("keyup",function(){inputControl($(this),'float');});

function inputControl(input,format) 
{ 
    var value=input.val();
    var values=value.split("");
    var update="";
    var transition="";
    if (format=='int'){
        expression=/^([0-9])$/;
        finalExpression=/^([1-9][0-9]*)$/;
    }
    else if (format=='float')
    {
        var expression=/(^\d+$)|(^\d+\.\d+$)|[,\.]/;
        var finalExpression=/^([1-9][0-9]*[,\.]?\d{0,3})$/;
    }   
    for(id in values)
    {           
        if (expression.test(values[id])==true && values[id]!='')
        {
            transition+=''+values[id].replace(',','.');
            if(finalExpression.test(transition)==true)
            {
                update+=''+values[id].replace(',','.');
            }
        }
    }
    input.val(update);
}

【问题讨论】:

    标签: javascript jquery regex


    【解决方案1】:

    这个正则表达式

    (/(^\d+$)|(^\d+.\d+$)|[,.]/)

    应该匹配

    • 1111111 每 (^\d+$)
    • 或 111111.11111 每个 (^\d+.\d+$)
    • 或逗号后跟任何字符,它可以是表达式中的任何位置。

    我怀疑你的正则表达式应该是 请注意,我已经逃脱了最后阶段。这将匹配逗号或句点

    /(^\d+[,\.]{0,1}\d{3})/

    根据 cmets 中的说明,可能正是您想要的

    [-+]?[0-9]*\.?[0-9]+

    也可以

    注意:您可以使用 Roy Osherove 的 Regulazy 或 Regex Buddy 工具极大地简化您的正则表达式生活。

    【讨论】:

    • 诚然,我不确定您要完成什么。
    • 感谢您的回复,但您的正则表达式允许:“............”我希望只有一个点。我希望,只有: xnumbers 。 3个号码(12345679.123)
    • [\.]{1} 应该可以做到只制作一个句点,\d{3} 将是三位数字。
    • 这会返回 SyntaxError: Invalid regular expression: /(^\d+[,\.]{0,1}\d{3}/: Unterminated group
    • 对不起 - 把我的括号放在错误的一边......我添加的另一个可能更优化,顺便说一句......
    【解决方案2】:

    您想要小数点后面的任意数量的数字(逗号或句点)?

    有什么问题:

    /^([1-9][0-9]*|0)([\.,][0-9]+)?$/
    

    我将{3} 换成了+\. 换成了[\.,]

    【讨论】:

    • 这在函数中也不起作用。点被下一个数字替换。我想要:一个像 x 数字这样的数字。 3 个数字(例如:123456.123)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多