Регулярное выражение, совпадающее с числом до 2 знаков после запятой - PullRequest
8 голосов
/ 19 марта 2009

Я ставлю после регулярного выражения, которое будет соответствовать числовым значениям до определенного пользователем количества десятичных разрядов. В настоящее время у меня есть

/(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/

, что позволит использовать столько мест, сколько вводится, но я также хотел бы иногда разрешить 2 для валюты или 4 или более для другого ввода. Функция, которую я строю,

var isNumeric = function(val, decimals) {
    // decimals is not used yet
    var objRegExp = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
    return objRegExp.test(val);
};

Ответы [ 8 ]

18 голосов
/ 19 марта 2009
/^\s*-?[1-9]\d*(\.\d{1,2})?\s*$/

Хорошо, когда прощают пробелы (\ s). Вышесказанное не позволяет начинать с нуля. Если вы хотите разрешить это:

/^\s*-?\d+(\.\d{1,2})?\s*$/

Ни один из вышеперечисленных символов не допускает десятичное число с нулем до десятичного знака Если вы хотите разрешить это:

/^\s*-?(\d+(\.\d{1,2})?|\.\d{1,2})\s*$/
5 голосов
/ 19 марта 2009

Попробуйте что-то вроде этого:

^\d+\.\d{0,3}$

где "3" - максимально допустимое количество десятичных знаков.

3 голосов
/ 20 марта 2009

Добавление 0, если последняя цифра - «.» не покрывает случай пробела после точки.

Я думаю, что это охватывает все случаи, но вы хотели бы проверить это более строго, чем я здесь.

var isNumeric = function(val, decimals) {
    if (decimals <= 0) {
        var re = /^\s*\d+\.?\s*$/;
        return re.test(val);
    } else {
        var reString = "^\\s*((\\d+(\\.\\d{0," + decimals + "})?)|((\\d*(\\.\\d{1," + decimals + "}))))\\s*$"
        var re = new RegExp(reString);
        return re.test(val);
    }
};

var test = function(val, decimals) {
    document.write("isNumeric(" + val + ", " + decimals + ") = " + isNumeric(val, decimals) + "<br/>");
}

test("123", 0);
test("123", 5);
test(" 123.45", 2);
test(" 123.45", 3);
test(" 123.45", 1);
test(" ", 0);
test(" ", 5);
test(" 3.", 0);
test(" 3.", 12);
test(" .", 3);
test(" .321 ", 5);
3 голосов
/ 19 марта 2009

Спасибо всем. Я использовал немного из всех ответов.

var isNumeric = function(val, decimalPlaces) {
    // If the last digit is a . then add a 0 before testing so if they type 25. it will be accepted
    var lastChar = val.substring(val.length - 1);
    if (lastChar == ".") val = val + "0";

    var objRegExp = new RegExp("^\\s*-?(\\d+(\\.\\d{1," + decimalPlaces + "})?|\\.\\d{1," + decimalPlaces + "})\\s*$", "g");
    if (decimalPlaces == -1)
        objRegExp = new RegExp("^\\s*-?(\\d+(\\.\\d{1,25})?|\\.\\d{1,25})\\s*$", "g");

    return objRegExp.test(val);        
};
3 голосов
/ 19 марта 2009

По профессии я парень C #, но я нахожу такие инструменты, как Регулятор для C # или RegexPal , которые очень полезны при попытке настроить Regex на "просто так" ».

1 голос
/ 01 марта 2017

Используйте этот шаблон:

[0-9]?[0-9]?(\.[0-9][0-9]?)? 
1 голос
/ 19 марта 2009

Это должно соответствовать целым числам и десятичным знакам с точностью до двух знаков после запятой.

/\A[+-]?\d+(?:\.\d{1,2})?\z/

ПРИМЕЧАНИЕ: Измените "2" в "{1,2}" на любое количество десятичных разрядов, которое вы хотите поддерживать.

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

var isNumeric = function( val, decimals ) {
    if ( parseFloat( val ) ) {
        var numeric_string = val + '';
        var parts = numeric_string.split( '.', 1 );
        if ( parts[1] && parts[1].length > decimals ) {
            alert( 'too many decimal places' );
        }
        else {
            alert( 'this works' );
        }
    }
    else {
        alert( 'not a float' );
    }
}
0 голосов
/ 09 октября 2015

Попробуйте это регулярное выражение, оно отлично работает для меня:

^\d+\.\d{0,2}$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...