JavaScript中用于验证十进制数的正则表达式

39
我需要一个JavaScript正则表达式来验证十进制数。
它应该只允许最多两位小数。例如,它应该允许10.89但不允许10.899
它也应该只允许一个句点(.)。例如,它应该允许10.89但不允许10.8.9

https://dev59.com/g3RB5IYBdhLWcg3w6bYE - Artem Koshelev
重复:stackoverflow.com/q/468655/55209 - safarov
12个回答

54

尝试使用以下表达式:^\d+\.\d{0,2}$。如果您希望小数位数是可选的,可以使用以下表达式:^\d+(\.\d{1,2})?$

编辑:要在JavaScript中测试字符串匹配,请使用以下代码片段:

var regexp = /^\d+\.\d{0,2}$/;

// returns true
regexp.test('10.5')

@micha,抱歉我已经修复了我第一个正则表达式中的拼写错误。 - zatatatata
如果您想要一个可选的逗号分隔符,请使用var regexp = /^\d+.?\d{0,2}$/;。 - marko

53

仅允许正小数

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

负数或正数的小数

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

演示

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

console.log("POSITIVE ONLY");
console.log("'.74' returns " + regexp.test('.74'));
console.log("'7' returns " + regexp.test('7'));
console.log("'-4' returns " + regexp.test('-4'));
console.log("'10.5' returns " + regexp.test('10.5'));
console.log("'115.25' returns " + regexp.test('115.25'));
console.log("'-120.56' returns " + regexp.test('-120.56'));
console.log("'1535.803' returns " + regexp.test('1535.803'));
console.log("'153.14.5' returns " + regexp.test('153.14.5'));
console.log("'415351108140' returns " + regexp.test('415351108140'));
console.log("'415351108140.55' returns " + regexp.test('415351108140.55'));
console.log("'415351108140.556' returns " + regexp.test('415351108140.556'));

regexp = /^-?\d+(\.\d{1,2})?$/;

console.log("\n");
console.log("POSITIVE OR NEGATIVE");
console.log("'.74' returns " + regexp.test('.74'));
console.log("'7' returns " + regexp.test('7'));
console.log("'-4' returns " + regexp.test('-4'));
console.log("'10.5' returns " + regexp.test('10.5'));
console.log("'115.25' returns " + regexp.test('115.25'));
console.log("'-120.56' returns " + regexp.test('-120.56'));
console.log("...");


解释

  1. / /:正则表达式的开始和结束标志
  2. ^:匹配字符串的开头位置
  3. \d+:匹配至少一个数字
  4. ( )?:这部分是可选的
  5. \.:匹配一个点号
  6. \d{1,2}:匹配一到两个数字
  7. $:匹配字符串的结尾位置

如果还想支持负小数,只需在 ^ 后面添加 -?,表示该位置也可以包含一个可选的负号。


提示

你可以使用 regexr.comregex101.com 在浏览器中直接测试正则表达式!


我该如何扩展它以接受负数? - KylianMbappe
@KylianMbappe:我刚刚更新了我的答案,以支持负小数。 - John Slegers
这里有一个更好的解决方案适用于我 /^\d{0,13}(\.\d{1,2}0*)?$/.test(yourNumber),可以允许 10.1200,你可以使用 Number(yourNumber.toFixed(2)) 来移除它,但只有在条件正确的情况下才能这样做! - Yasser CHENIK

43
^\d+(\.\d{1,2})?$

将允许:

  1. 244
  2. 10.89
  3. 9.5

将不允许:

  1. 10.895
  2. 10.
  3. 10.8.9

@ShardaprasadSoni 请看我的帖子,里面有一个例子。 - zatatatata
如果我输入0000.100,这将是无效的十进制数,那么正则表达式应该是什么? - Kaloyan Stamatov

4
请查看我的项目,使用JavaScript语言在您的网页上实现跨浏览器文本输入框值的过滤器:Input Key Filter。您可以将值过滤为整数,浮点数,或编写自定义过滤器,例如电话号码过滤器。查看一个自定义过滤器的示例,用于输入带有小数点和限制为小数点后2位的浮点数:

<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Input Key Filter Test</title>
 <meta name="author" content="Andrej Hristoliubov anhr@mail.ru">
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 
 <!-- For compatibility of IE browser with audio element in the beep() function.
 https://www.modern.ie/en-us/performance/how-to-use-x-ua-compatible -->
 <meta http-equiv="X-UA-Compatible" content="IE=9"/>
 
 <link rel="stylesheet" href="https://rawgit.com/anhr/InputKeyFilter/master/InputKeyFilter.css" type="text/css">  
 <script type="text/javascript" src="https://rawgit.com/anhr/InputKeyFilter/master/Common.js"></script>
 <script type="text/javascript" src="https://rawgit.com/anhr/InputKeyFilter/master/InputKeyFilter.js"></script>
 
</head>
<body>
 <h1>Float field</h1>
<input id="Float" 
 onchange="javascript: onChangeFloat(this)"
 onblur="inputKeyFilter.isNaN(parseFloat(this.value), this);"
/>
<script>
 function CreateFloatFilterCustom(elementID, onChange, onblur){
  try{
   inputKeyFilter.Create(elementID
    , onChange
    , function(elementInput, value){//customFilter
     if(value.match(/^(-?\d*)((\.(\d{0,2})?)?)$/i) == null){
      inputKeyFilter.TextAdd(isRussian() ?
        "Допустимый формат: -[0...9].[0...9] или -[0...9]e-[0...9]. Например: -12.34 1234"
        : "Acceptable formats: -[0...9].[0...9] or -[0...9]e-[0...9]. Examples: -12.34 1234"
       , elementInput);
      return false;
     }
     return true;
    }
    , onblur
   )
  } catch(e) {
   consoleError("Create float filter failed. " + e);
  }
 }
 
 CreateFloatFilterCustom("Float");
 
 function onChangeFloat(input){
  inputKeyFilter.RemoveMyTooltip();
  var elementNewFloat = document.getElementById("NewFloat");
  var float = parseFloat(input.value);
  if(inputKeyFilter.isNaN(float, input)){
   elementNewFloat.innerHTML = "";
   return;
  }
  elementNewFloat.innerHTML = float;
 }
</script>
 New float: <span id="NewFloat"></span>
</body>
</html>

同时请查看我的页面输入键过滤示例


我们能否限制小数点前只有6位数字? - Mohammed Farooq
将从 /^(-?\d*)((.(\d{0,2})?)?)$/i 到 /^(-?\d{0,6})((.(\d*)?)?)$/i 的内容替换。 - Andrej

4
我发现我可以使用:
^\d+(\.\d+)?$

超过两位小数的情况。


4

最多有2位小数的数字:

/^\d+(?:\.\d{1,2})?$/

这应该能够很好地运行。请试一下 :)

如何使用变量设置最大小数位数?谢谢。 - JTCon

3

尝试使用像这样的正则表达式:

(?=[^\0])(?=^([0-9]+){0,1}(\.[0-9]{1,2}){0,1}$)

允许的: 1, 10.8, 10.89, .89, 0.89, 1000

不允许的: 20. , 50.89.9, 12.999, ., 空字符 请注意,此方法仅适用于正数


3

既然您要求进行十进制数字验证,为了完整起见,我建议使用一个正则表达式来防止出现像 06.05 这样的字符串。

^((0(\.\d{1,2})?)|([1-9]\d*(\.\d{1,2})?))$

略微复杂,但在那种情况下返回假值。
编辑:
^-?((0(\.\d{1,2})?)|([1-9]\d*(\.\d{1,2})?))$

如果您希望包括负数,请按如下方式操作。

实际上,这并没有处理范围在[0,1)之间的小数。 - ptent
它确实可以,在这里进行测试https://regex101.com/。特别是,这个前半部分可以匹配(0(\.\d{1,2})?)。或者至少像OP要求的那样匹配到小数点后两位。 - Plutone11011

0
 function CheckValidAmount() {
        var amounttext = document.getElementById('txtRemittanceNumber').value;            
        if (!(/^[-+]?\d*\.?\d*$/.test(amounttext))){
            alert('Please enter only numbers into amount textbox.')
            document.getElementById('txtRemittanceNumber').value = "10.00";
        }
    }

这是一个函数,它可以接受任意位数的十进制数,包括有小数位和没有小数位的情况。
谢谢... :)

你能否将代码以文本形式发布,而不是图片? - RamenChef
如果后面没有使用amount,你为什么要使用var amount = parseFloat(amounttext);和test(amounttext)呢? - Darksymphony

0

将值作为字符串传递的模式。正则表达式将验证至少一个数字的字符串,可能后跟一个句点和恰好两个数字:

{
    "type": "string",
    "pattern": "^[0-9]+(\\.[0-9]{2})?$"
}

下面的模式是等效的,除了它还允许空字符串:

{
    "type": "string",
    "pattern": "^$|^[0-9]+(\\.[0-9]{2})?$"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接