2016-11-28 40 views
0

我正在嘗試創建一個簡單的程序,它允許用戶輸入數字或單詞,並按字母順序(如果是文字)或數字(如果是數字)進行排序。爲此,我需要一個可以區分數字和單詞的輸入,例如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

我真的認爲約瑟的回答是最好的辦法,而不是正則表達式。然而,你的正則表達式不起作用的原因是你對你的正則表達式使用了'charAt(0).match'。在負數的情況下,'charAt(0)'是'-',所以它不會匹配'^( - )?[0-9]'。你應該簡單地使用'userInput.match' – Aserre

回答

3

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

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

parseFloat可能不是最優的。它從左到右解析數字並停止在非數字上。它收集什麼,它變成了一個數字。 parseFloat('123a') === 123

+0

而且他需要轉換爲數字來排序 – mplungjan

+1

不需要'+'。 'isNaN'也適用於字符串。 – georg

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);

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); 
    } 
} 
0

如果你想檢查是否有用戶輸入的是一個數字或沒有,你可以使用這樣的事情:

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

它將匹配可能包含在開始和網點SYMB -+所有號碼醇。號碼像10,-10.0+10.0 Example

相關問題