Разрешить только 6-значное или 8-значное число с двумя десятичными знаками - PullRequest
0 голосов
/ 26 июня 2018

Я создал валидатор, который проверяет, является ли цифра числом, и следит за тем, чтобы после десятичного знака допускались 2 цифры. На это не распространяется число, состоящее из 6 цифр без десятичных знаков (123456) или 8 цифр с двумя десятичными знаками (123456.78). Это то, что я придумал

function validateInt2Dec(value, min, max) {

    if (Math.sign(value) === -1) {
        var negativeValue = true;
        value = -value
    }

    if (!value) {
        return true;
    }
    var format = /^\d+\.?\d{0,2}$/.test(value);
    if (format) {
        if (value < min || value > max) {
            format = false;
        }
    }
    return format;
}

и его реализация в форме

     vm.fields = [
             {
                className: 'row',
                fieldGroup: [
                    {
                        className: 'col-xs-6',
                        key: 'payment',
                        type: 'input',
                        templateOptions: {
                            label: 'Payment',
                            required: false,
                            maxlength: 8
                        },
                        validators: {
                            cost: function(viewValue, modelValue, scope) {
                                var value = modelValue || viewValue;
                                return validateInt2Dec(value);
                            }
                        }
                    }
                ]
            }
        ];

Что я должен добавить, чтобы покрыть сценарий выше?

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Если вы не хотите добавлять дополнительную сложность регулярных выражений, то вы можете сделать дополнительную проверку maxLength, прежде чем, наконец, дать ей проход

var str = value.toFixed(2);
var maxLength = (str.indexOf(".") > -1 ? 8 : 6);
if (str.length > maxLength) {
    return; //invalid input
}
0 голосов
/ 27 июня 2018

Попробуйте регулярное выражение ниже.

var regex = /^\d{1,6}(\.\d{1,2})?$/;

console.log(regex.test("123456"));
console.log(regex.test("123456.78"));
console.log(regex.test("123456.00"));
console.log(regex.test("12345.00"));
console.log(regex.test("12345.0"));
console.log(regex.test("12345.6"));
console.log(regex.test("12.34"));
console.log(regex.test("123456.789"));
0 голосов
/ 26 июня 2018

Испытание этого на regex101, кажется, соответствует вашим критериям.

Решение: ^(\d{6})?(\d{8}\.\d{2})?$

  • Группа 1 ^(\d{6})? - либо 6 цифр

  • Группа 2 ^(\d{6})?(\d{8}\.\d{2})?$ - или 8 цифр с двумя десятичными знаками

...