【问题标题】:Only allow 6 digit number or 8 digit number with 2 decimal places只允许 6 位数字或 8 位带 2 位小数的数字
【发布时间】:2018-06-26 15:31:51
【问题描述】:

我创建了一个验证器,用于检查 digit 是否为数字,并确保小数点后允许有 2 位数字。这不包括一个没有小数位的 6 位数字 (123456) 或 2 个小数位的 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);
                            }
                        }
                    }
                ]
            }
        ];

我必须添加什么来覆盖上述场景?

【问题讨论】:

  • 测试前添加缺少的“.00”(无小数点)、“00”(小数点后)或“0”(小数点后一位)会不会出错?

标签: javascript angularjs validation angular-formly


【解决方案1】:

试试下面的正则表达式。

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"));

【讨论】:

  • 123456.00 是正确的组合。它有 6 位数字和小数点后 2 位数字。 1234567 将不正确或 123456.123。我只允许在该字段中输入 9 个字符,因此无论如何它都不允许用户输入 123456.123,但应该接受 123456.00。
  • @LazioTibijczyk 我看到您的评论“123456.00”看起来不正确。我已经更新了我的正则表达式 - 是你要找的吗?
  • 对我来说看起来不错。经过测试并按预期工作。谢谢。
  • 不客气。如果是“123456”。 (点作为最后一个字符)也是正确的,您可能希望将该正则表达式更改为 /^\d{1,6}(\.\d{0,2})?$/
  • 不,不。绝对没问题。 123456. 不正确。
【解决方案2】:

在 regex101 上尝试一下似乎符合您的标准。

解决方案:^(\d{6})?(\d{8}\.\d{2})?$

  • 第 1 组 ^(\d{6})?- 6 位数字

  • 第 2 组 ^(\d{6})?(\d{8}\.\d{2})?$ - 或 8 位数字,带 2 个小数位

【讨论】:

  • 除了 6 位或 8 位数字之外,不允许使用任何其他数字。
  • 这是相同的正则表达式,没有分组^(?:\d{6}|\d{8}\.\d{2})$
  • 不匹配任何有两位小数和
  • @m8r1x 仅接受 6 位和 8 位数字。没有更短或更长。 123456.00 看起来也不正确
【解决方案3】:

如果您不想增加额外的正则表达式复杂性,您可以做的是在最终通过之前对 maxLength 进行额外检查

var str = value.toFixed(2);
var maxLength = (str.indexOf(".") > -1 ? 8 : 6);
if (str.length > maxLength) {
    return; //invalid input
}

【讨论】:

  • 这允许像 324.3454 这样的数字
  • 好收获!我通过将其更改为 value.toFixed(2).toString() 来修复它,它会处理额外的小数位。
  • 我还注意到toFixed()返回字符串本身,因此也不需要额外的字符串转换。
  • TypeError:无法读取未定义的属性“toFixed”并且TypeError:value.toFixed 不是函数
  • Number.prototype.ToFixedvalid in ES6。只要您的value 是一个数字,它就应该能够工作。如果你传递的是undefined,你应该在传递给这个函数之前检查它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-05
  • 2021-03-04
  • 2021-07-23
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多