RegEx (заменить все нечисловые символы и цифры выше 2 десятичных знаков) - PullRequest
0 голосов
/ 19 февраля 2019

В настоящее время я работаю над некоторой логикой регулярных выражений, чтобы заставить ввод поля ТОЛЬКО принимать (заменять / отображать) число (без буквенных символов) и применять ограничение в 2 десятичных знака ...

I "mНе знаете, как я могу сделать это более эффективным, а также добавить в (макс) 2 десятичных знака ограничение / ограничение?

Вот мой текущий на функцию keyup ()

$("#amount").on("keyup", function(){

    var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
    val = this.value;

    if(!valid){
        console.log('bad character found');

        //strip out commas
        this.value = val.replace(/,/g , "");

        //strip out all non-numeric characters (leaving decimal)
        //this.value = val.replace(/[^\d.-]/g, "");
        this.value = val.replace(/[^0-9.]/g, "");

        //enforce only (max) 2 decimal places
    }   
});

Iпервоначально использовал это, но это FLAWED (если вы вернетесь назад и добавите запятую в текущее / существующее число, он удалит последнюю цифру / символ в поле .. (даже если это не оскорбительный символ)

var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
val = this.value;

if(!valid){
    //console.log("Invalid input!");
    this.value = val.substring(0, val.length - 1);
}

Для ясности ...

Значение НЕ ДОЛЖНО иметь десятичную дробь и должно содержать 2 цифры после указанной десятичной запятой ... но если она есть ... Мне нужно применитьограничение в 2 символа после десятичной запятой.

  • без запятых (вообще)
  • допускается только 1 десятичный знак / точка
  • , в то время как десятичная дробь - не требуется-.. если присутствует, убедитесь, что после периода * 1 есть только 2 десятичных знака020 *

обновление 1:

окей ... так что у меня все "близко" (хотя одна строка REGEX была бы хороша!)

Мой последний пункт «сделать» ... это каким-то образом принудительно применить (если есть «точка» ... что после него есть только 2 десятичных знака ..... хотя точка / десятичная дробь не требуется)

$("#amount").on("keyup", function(){
    var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
    val = this.value;
    console.log("ORIGINAL VAL: " + val);

    if(!valid){
        console.log('bad character found');

        var dotCheck = val.indexOf("..");
        if(dotCheck >= 0){
            console.log('DOT CHECK: ' + dotCheck);
            console.log("PRE VAL: " + val);
            val = val.replace("..", "?");
            console.log("POST VAL: " + val);
        }       

        //strip out commas                      
        val = val.replace(/,/g , "");                           
        console.log("AFTER COMMA VAL: " + val);

        //strip out all non-numeric characters (leaving decimal)
        val = val.replace(/[^0-9.]/g, "");
        console.log("AFTER CHAR VAL: " + val);

        //output to field
        this.value = val;

    }

});

окончательное обновление:
(окончательное рабочее решение) ... все еще проверяют решение регулярных выражений, опубликованное ниже ...

  • нетзапятые
  • без символов вне цифр / цифр
  • без двойных '..' (точек)
  • не более 2 цифр после десятичной точки

    $("#amount").on("keyup", function(){                            
        var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
    val = this.value;
    
    if(!valid){
        var dotCheck = val.indexOf("..");
        if(dotCheck >= 0){                              
            val = val.replace("..", ".");
        }
    
        //strip out commas                                          
        val = val.replace(/,/g , "");                           
    
        //strip out all non-numeric characters (leaving decimal)                            
        val = val.replace(/[^0-9.]/g, "");
    
        //enforce 2 decimal places (max)                    
        var totalLength = val.length;
        var only2DecimalsCount = val.indexOf(".");
    
        if(only2DecimalsCount >= 0 && totalLength > (only2DecimalsCount + 2)){                          
            val = val.substring(0, (only2DecimalsCount + 3));
        }                           
    
        //output to field
        this.value = val;                           
    }
    
    
    });
    

РЕДАКТИРОВАТЬ: Я обнаружил, что это не обрабатывает что-то вроде L

1.9.9 (облом)

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Попробуйте: ^(\d+)(\.\d{2})?$

s ='1234567'
/^(\d+)(\.\d{2})?$/.test(s)
// true

s ='12345.67'
/^(\d+)(\.\d{2})?$/.test(s)
// true

s ='12345.678'
/^(\d+)(\.\d{2})?$/.test(s)
// false

s ='123.45.67'
/^(\d+)(\.\d{2})?$/.test(s)
// false

s ='a12345.67'
/^(\d+)(\.\d{2})?$/.test(s)
// false

Обновление: Regex для замены нескольких '.'символы

s = '123...45'
s.replace(/(\.)+/g, '.')
// '123.45'
0 голосов
/ 19 февраля 2019

Вот измененная версия вашего окончательного редактирования ... Я добавил строку, чтобы проверить ситуацию: 1.2.3 и заменил ее шаблоном для удаления второй точки.Сделал это без оглядки назад, потому что это может не поддерживаться.Вот строка: val = val.replace(/(\.)(.)(\.)/g, ".$2"); ".$2" заменит. #.с точкой и группой шаблонов, которая в данном случае является подстановочным знаком (.).Ваша другая проверка внизу поймает ситуацию с двойной точкой «..».

$("#amount").on("keyup", function () {
    var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
    val = this.value;
    console.log("ORIGINAL VAL: " + val);

    if (!valid) {
        var dotCheck = val.indexOf("..");
        if (dotCheck >= 0) {
            val = val.replace("..", ".");
        }

        val = val.replace(/(\.)(.)(\.)/g, ".$2");

        //strip out commas                                          
        val = val.replace(/,/g, "");

        //strip out all non-numeric characters (leaving decimal)                            
        val = val.replace(/[^0-9.]/g, "");

        //enforce 2 decimal places (max)                    
        var totalLength = val.length;
        var only2DecimalsCount = val.indexOf(".");

        if (only2DecimalsCount >= 0 && totalLength > (only2DecimalsCount + 2)) {
            val = val.substring(0, (only2DecimalsCount + 3));
        }

        //output to field
        this.value = val;
    }
});

РЕДАКТИРОВАТЬ: Исправлена ​​новая строка путем добавления скобок.Объяснение: Круглая скобка «группирует» части шаблона вместе (индекс на основе 1).Итак, новая линия имеет 3 группы - (\.)- 1, (.)- 2, (\.)- 3.Замена на $2 вызовет группу # 2, которая в данном случае является подстановочным знаком.

0 голосов
/ 19 февраля 2019

Я думаю, вы в порядке с заказом, который вы обрабатываете.Убедитесь, что вы повторно используете переменную val.Код выше установит val равным this.value, но затем после каждого паттерна вы устанавливаете замену на this.value вместо повторного использования val.Вы увидите только результаты вашего последнего звонка на замену.

Ваш шаблон для поиска любых нечисловых символов подходит.Единственная эффективность может заключаться в сочетании его с проверкой запятой с помощью логического ИЛИ (|), например: \d{0,9}(\.\d{0,2})?|,.

Что касается принудительного использования двух десятичных знаков, вы можете использовать что-то вроде этого: (?<=\.[0-9]{2}).+.Это позитивный взгляд: (?<= PATTERN ), и он вернет совпадения с этим шаблоном.Вот разбивка:

  • (?<= - начало позитивного взгляда позади
  • \.[0-9]{2} - соответствует десятичному символу ('.') С двумя числами после него
  • ) - конец положительного просмотра позади
  • .+ - что-нибудь после шаблона поиска

Вы можете использовать это для замены пустой строкойкак у вас с другим шаблоном.Если у вас есть только один десятичный знак после точки (например, 123.4), он не будет заменен, потому что «.4» не будет соответствовать положительному виду позади.Что-то вроде: this.value = this.value.replace(/(?<=\.[0-9]{2}).+/g, "");

** Примечание: проверенные шаблоны на https://regexr.com/, но не в коде js

...