Прямой контроль ввода с плавающей точкой с помощью маски регулярных выражений - PullRequest
1 голос
/ 11 января 2012

Я сделал функцию для управления контрольными числами и числами с плавающей запятой. Но это не работает должным образом для чисел с плавающей точкой, которые должны быть похожи на это выражение:

// 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);
}

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Это регулярное выражение

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

должно соответствовать

  • 1111111 за (^ \ d + $)
  • или 111111.11111 за (^ \ d +. \ D + $)
  • или запятая, за которой следует любой символ, и это может быть где угодно в выражении.

Я подозреваю, что ваше регулярное выражение должно быть Обратите внимание, что я избежал последнего периода. Это будет соответствовать запятой или точка

/ (^ \ D + [\.] {0,1} \ d {3}) / * * тысяча двадцать-один

может быть именно тем, что вы хотите, основываясь на пояснениях в комментариях

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

также будет работать

ПРИМЕЧАНИЕ. Вы можете значительно упростить свою жизнь с помощью регулярных выражений Роя Ошерова Regulazy или инструмента Regex Buddy.

0 голосов
/ 11 января 2012

Вы хотите произвольное количество цифр после запятой (запятая или точка)?

Что не так с:

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

Я отключил {3} для + и\. для [\.,]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...