允许十进制数只有1个小数点的指令

时间:2015-01-27 09:58:22

标签: regex angularjs angularjs-directive

我有一个角度应用程序,其中输入字段应该只允许带有一个小数点的正数。在我的指令中,我正在替换0-9以外的任何内容。'。但是目前我的应用程序正在接受多个十进制值。 它应该接受:

0.5 0.56

不 0.5.5或0..5

PFB代码:

link: function (scope, element, attrs, modelCtrl) {
                modelCtrl.$parsers.push(function (inputValue) {
                    // this next if is necessary for when using ng-required on your input. 
                    // In such cases, when a letter is typed first, this parser will be called
                    // again, and the 2nd time, the value will be undefined
                    if (inputValue === undefined) {
                        return '';
                    }
                    var transformedInput = inputValue.replace(/[^0-9\.]/g, '');
                    if (transformedInput !== inputValue) {
                        modelCtrl.$setViewValue(transformedInput);
                        modelCtrl.$render();
                    }

                    return transformedInput;
                });
            }

这个问题可能看似无知,但我已经尝试过在此之前提供的所有解决方案,但根据相同的方式改变我的正则表达似乎不起作用。它现在接受多个'。'。

提前致谢。

2 个答案:

答案 0 :(得分:1)

这是小提琴http://jsfiddle.net/oora0t93/检查它: -

   app.directive('inputPrice', function () {
        return {
            restrict: 'EA',
            template: '<input name="{{inputName}}" ng-model="inputValue" />',
            scope: {
                inputValue: '=',
                inputName: '='
            },
            link: function (scope) {
                scope.$watch('inputValue', function(newValue,oldValue) {
                    if(String(newValue).indexOf(',') != -1)
                        scope.inputValue = String(newValue).replace(',', '.');
                    else {
                        var index_dot,
                            arr = String(newValue).split("");
                        if (arr.length === 0) return;
                        if (arr.length === 1 && (arr[0] == '-' || arr[0] === '.')) return;
                        if (arr.length === 2 && newValue === '-.') return;
                        if (isNaN(newValue) || ((index_dot = String(newValue).indexOf('.')) != -1 && String(newValue).length - index_dot > 3 )) {
                            scope.inputValue = oldValue;
                        }
                    }
                });
            }
        };
    });

答案 1 :(得分:0)

我明白了。我没有找到正则表达式解决方案,所以使用一些javascript字符串操作。 PFB代码:

            var firstIndexOfDecimal = transformedInput.indexOf('.');
            var lastIndexofDecimal = transformedInput.lastIndexOf(".");

            if(firstIndexOfDecimal !== lastIndexofDecimal){
                transformedInput = transformedInput.substr(0,lastIndexofDecimal) + transformedInput.substr(lastIndexofDecimal+1, transformedInput.length);
            }

感谢您的帮助。