使用Regex区分输入中的数字和单词

时间:2016-11-28 13:34:41

标签: javascript jquery regex

我试图创建一个简单的程序,允许用户输入数字或单词,并按字母顺序排序(如果是单词)或数字排序(如果是数字)。为此我需要一个输入来区分数字和单词,以便例如10,-10,0.5和-0.5将被评估为数字,其他一切将被视为单词。

到目前为止,我已经想出了这个:

function recordUserInput() {
  userInput = $('input').val();

  if (userInput.charAt(0).match(/^(-)?[0-9]/)) {
    console.log('number', userInput);
  }
  else {
    console.log('text', userInput);
  }

}

但是,负数仍然被评估为文本。

我做错了什么?

4 个答案:

答案 0 :(得分:3)

使用一元+。如果它返回NaN,则它不是数字。

var type = isNaN(+userInput) ? 'text' : 'number';

parseFloat可能不是最佳选择。它从左到右解析寻找一个数字并停在一个非数字上。它收集了什么,它变成了一个数字。 parseFloat('123a') === 123

答案 1 :(得分:0)

不要使用.charAt(0)因为你只看第一个字符。相反,您的正则表达式旨在查看整个输入,所以只需(但最后添加+$):

if (userInput.match(/^-?[0-9]+$/)) {

将输入放入数组后,您可以对此进行排序(这也演示了如何更好地测试数字):

// Sample input:
var inputs = ['z', 1, 'a', 9, 3];

inputs.sort(function (a, b) {
    return isNaN(a) - isNaN(b) || isNaN(a) && a.localeCompare(b) || +a - +b;
});

console.log(inputs);

答案 2 :(得分:0)

您可以编写一个小函数isNumeric()来正确确定值是否为数字。这类似于https://stackoverflow.com/a/9716488/1637175

中提出的解决方案
function isNumeric(val) {
    return !isNaN(parseFloat(val)) && isFinite(val);
}

您的原始功能变为

function recordUserInput() {
    userInput = $('input').val();

    if ( isNumeric(userInput) ) {
        console.log('number', userInput);
    }
    else {
        console.log('text', userInput);
    }
}

答案 3 :(得分:0)

如果要检查用户输入是否为数字,可以使用以下内容:

/^[-+]?\d+\.?\d*$/

它将匹配开头可能包含-+的所有数字和点符号。 10-10.0+10.0之类的数字 Example