JavaScript:小数格式的正则表达式

时间:2017-06-29 05:56:08

标签: javascript regex

在我当前的应用程序中,我正在使用表达式的正则表达式进行字段验证。

更具体地说,我在处理带小数的数字的边缘情况时遇到了麻烦。

基本上我使用正则表达式来阻止用户在输入字段中输入错误的信息。

例如,如果用户之后键入12.2然后.,我会使用正则表达式来检测不应该存在的内容,并用空字符串''替换

这是我使用回调函数的当前实现:

export const checkFormat = (typeFormat, value) => {
  //value is stringified
  switch (typeFormat) {
    //...
    case NUMERIC_DECIMALS: {
      return value.replace(/(\d+\.\d+)(\.*)\d*/g, '$1')
    }
  }

}

但是,当前的正则表达式实现无法处理

这样的情况
  • 用户类型:.,然后.. ==> .
  • 用户类型:123.2,然后1.23.2 ==> 1.232

我对Regex很新,显然它需要一些工作

3 个答案:

答案 0 :(得分:1)

你可以试试这个:

^(\d+(?:\.\d+)).*$

并替换为:

$1

Regex 101 demo

或者为了得到一个更复杂的解决方案,我想你正在寻找,你可以试试这个:

const regex = /^(\d+(?:\.\d*))|(\.)?/gm;
const str = ["1.2","...","g..g","1.23","1.2.3.4",".,",".,","123.2","1.23.2","14","1","15.6.4789756465","g"];
const replaceRegex = /[^\.\d]/gm;
for(var i=0;i<str.length;i++)
{
var res=str[i].replace(replaceRegex,'').split(regex);
var finalResult="";
var alreadyContainsDot=false;
for(var j=0;j<res.length;j++)
  if(res[j]!=null && res[j]!="")
  {
    if(res[j].includes(".") && !alreadyContainsDot)
      alreadyContainsDot=true;
    else if(res[j].includes(".") && alreadyContainsDot)
      res[j]=res[j].replace(/\./gm,'');
    finalResult+=res[j];
  }
console.log(str[i]+"==>"+finalResult);
}

答案 1 :(得分:1)

如果我对要求的解释是正确的,这应该有效:

const regex = /(\d+\.?\d+?)(\D+)/g;
const str = `131/1.13.ad`;
const subst = `$1`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

Regex101 link

答案 2 :(得分:0)

监控用户正在键入的内容以及从他下面更改输入是一种糟糕的用户体验。他可能会认为他的键盘坏了。我不知道这种方法何时或如何变得如此普遍,但幸好它似乎正在消亡。

在任何情况下,尝试使用regexp来处理数字总是一个坏主意,regexps基本上是为操作字符串而设计的。如果由于某种原因您需要检查某些字符串是否为有效数字,请使用!isNaN(+value)等数字API。

使用输入字段中相应的typepattern属性进行验证。如果这还不够,请在用户按下“提交”按钮或同等按钮时进行验证。