Javascript 只有一个点&引用;正则表达式

Javascript 只有一个点&引用;正则表达式,javascript,regex,angularjs,Javascript,Regex,Angularjs,我需要能够设置一个输入,以便只放置数字和一个点,如111.111,而不是111..110….11或11.11.11 这是因为我正在进行计算,如果用户在同一输入中输入了多个点,那么计算就会停止,我在指令中有这个 .directive('numbersOnly', function () { return { restrict: 'A', require: 'ngModel', link: function (scope, element, attrs, ngModelC

我需要能够设置一个输入,以便只放置数字和一个点,如
111.111
,而不是
111..110….11
11.11.11

这是因为我正在进行计算,如果用户在同一输入中输入了多个点,那么计算就会停止,我在指令中有这个

.directive('numbersOnly', function () {
  return {
    restrict: 'A',
    require: 'ngModel',
    link: function (scope, element, attrs, ngModelCtrl) {
      ngModelCtrl.$parsers.push(function (inputValue) {
        var transformedInput = inputValue.replace(/[^0-9\.]+/g, '');
        if (transformedInput !== inputValue) {
          ngModelCtrl.$setViewValue(transformedInput);
          ngModelCtrl.$render();
        }
        return transformedInput;
      });
    }
  }
})
那我在这里该怎么办

var transformedInput = inputValue.replace(/[^0-9\.]+/g, '');
?

更新


下面是我试图使用它的代码:

或者使用前瞻:

^(?!.*\..*\.)(\d+\.\d+)

或锚定:

^(\d+\.\d+)$

我建议只测试1个点以上。范例

(string.test(/\d\.\.?(\.+)/gm)) ? //do true : // do false;
test
检查它是否存在于字符串中,然后返回true或false

正则表达式检查一个数字,然后是两点或两点+。它检查全局和多行

然后,如果您对使用正则表达式检查由一个点分隔的三组三位数字不感兴趣,那么您可以使用正则表达式

/(\d{3}\.\d{3}\.\d{3})\b/gm

这里的示例:

好吧,这取决于您将接受的格式。 使用/^(\d)()?(\d)$/可以帮助您确保数字中只有一个点,但也可以接受没有小数点或只有小数点的数字。还可以使用isNaN()确保它是一个数字


希望它对您有用。

这不是最优雅的解决方案,但它会在用户键入时检查输入,并且只允许使用一个小数点的数字

 link: function (scope, element, attrs, ngModelCtrl) {
        scope.currentValue = '';
        element.bind('keyup',function(e) {
            if( e.which!=8 && e.which!=0 && e.which!=46 && e.which != 190 && (e.which<48 || e.which>57)) {
                element.val(scope.currentValue);
            }
            if(e.which != 8 && e.which != 0) {
                var valToCheck = element.val();

                var r = /^(\d*)\.{0,1}(\d*)$/
                if (!r.test(valToCheck)) {
                    element.val(scope.currentValue);
                } else {
                    scope.currentValue = element.val();
                }

            }


        });
链接:函数(范围、元素、属性、ngModelCtrl){
scope.currentValue='';
元素绑定('keyup',函数(e){
如果(e.which!=8&&e.which!=0&&e.which!=46&&e.which!=190&&e.which57)){
element.val(scope.currentValue);
}
如果(e.which!=8&&e.which!=0){
var valToCheck=element.val();
var r=/^(\d*)\.{0,1}(\d*)$/
如果(!r.测试(valToCheck)){
element.val(scope.currentValue);
}否则{
scope.currentValue=element.val();
}
}
});

这个问题是,例如,你看到一个字母中的用户类型,然后你看到它消失了。使用“按键”而不是“KEYUP”效果更好。然后,你必须考虑到用户在当前输入的值的中间点击鼠标,然后打字,这样就变得棘手了。

<代码> /[0-9]*\[0-9]*/-即二到零(任意)由一个点分隔的数字长度。你可以匹配vs.
/^\d+\.\d+$/
,对吗?我完全是个白痴,因为我忘记了起始
^
和结束
$
锚点,@tadman知道了。你在这里颠倒逻辑。我认为你应该只接受某些值,而不是尝试任意清理输入。你可以保留它imple和转换后,只需执行
if(transformedInput.split('.')).length尝试根据我的代码对其进行调整,但仍允许我设置多个点。我不想让用户选择1.1.2.1.22,仅111。111@NietzscheProgrammer这个答案的目的就是测试多个点。你想让每个数字都有3个数字吗?@zfrisch你的正则表达式只匹配
11..11
,而不是
11.11.11
@KevinB my regex测试一行中是否有多个点。我想这就是所要求的。我目前正在对其进行更新。尝试使其适应我的代码,仍然允许我设置多个点dot@NietzscheProgrammer你有没有试过这个答案?你的评论给人的印象是非常懒惰……是的,我正在试,而且还是我得到了相同的结果。对不起,第一个和第二个示例对我都有效,我怀疑是您的正则表达式实现造成的。我刚刚看到编辑器删除了确切的字符串,应该是:/^(\d)*()?(\d)*$/