我试图创建一个简单的程序,允许用户输入数字或单词,并按字母顺序排序(如果是单词)或数字排序(如果是数字)。为此我需要一个输入来区分数字和单词,以便例如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);
}
}
但是,负数仍然被评估为文本。
我做错了什么?
答案 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)