2015-10-08 155 views
1

如果字符串包含除數字之外的任何字符或將其與其他字符分開的逗號,則該函數應返回「無效輸入」重新所有數,應該輸出「偉大的工作」試圖確定一個字符串是否包含以逗號分隔的字符只包含數字

a,4,3,@ =「無效的輸入」 ...

1,4,6,5 =「偉大的工作」 < ===從函數返回

我努力學習關於正則表達式,但如果你可以用另一種方法做到這一點。我對如何解決它感興趣。我無法在網上找到自己的答案。我搜索了。我知道d(正則表達式)是用於數字,但我現在不知道如何將其應用於這種情況。

+0

是一個空字符串有效嗎?單個數字如「1」? – Phil

+0

就像'if(/^[0-9,] * $ /。test(value))'一樣簡單! – adeneo

+0

小數點如何,例如'「1,2,3,4,5」'? – Phil

回答

0
function isValid(str){ 
    var res = str.split(',').every(function(item){ 
     return !isNaN(item) ? true : false; 
    }); 
return res ? "great job" : "invalid input"; 
} 
console.log(isValid("1,2,4,5,@")) 
+1

* isNaN *返回true或false,所以'!isNaN(item)? true:false'應該只是'!isNaN(item)' – RobG

+0

是的,你是對的 –

1

可以使用String.split(炭)字符的字符串分割成一個陣列,例如:

'1,4,6,5'.split(','); 
> [1, 4, 6, 5] 

然後,您可以使用正則表達式來檢查字符是數字和減速器驗證。

function valid(c) { 
    //using regex, return true if the character is valid, false if not 
    // or something like 
    return !Number.isNaN(+c); 
} 

'1,4,6,5'.split(',').reduce(function(acc, x) { 
    if valid(x) { 
     return acc; 
    } else { 
     return false; 
    } 
}, true); 

這應該給你一個布爾值,你可以映射到你想要的輸出字符串。減少工作類似循環,它每次傳遞一個累積值和數組中的每個元素,其中初始值在這裏給出'},true);'所以只要正則表達式返回true,我們就會返回相同的acc值,但是如果我們得到一個無效的正則表達式,我們將累加器切換爲false。請注意,因爲我們不會在有效輸入上更改累加器值,所以我們不必擔心它會突然回退到「有效」狀態。

+0

我在這裏做的唯一事情是在先前無效的結果之後不打擾'有效'。微型優化和所有:) – Phil

+1

東西,一切邪惡的根源;) –

+0

*某些*或*每個*將是一個更好的解決方案,因爲他們將盡快退出,只要檢測到無效結果,而不管持續到最後。正則表達式大約快5倍。 – RobG

0

var hasCommaSeparatedDigits = function(str){ 
 
    var strArr = str.split(","); 
 
    var res = strArr.length ? "Great job!" : "Invalid Input"; 
 
    for(var i in strArr){ 
 
    \t var ch = strArr[i]; 
 
     if(isNaN(ch)){ 
 
      res = "Invalid Input"; 
 
      break; 
 
     } 
 
    } 
 
    
 
    return res; 
 
} 
 

 
console.log(hasCommaSeparatedDigits("1,2,3,4")); 
 
console.log(hasCommaSeparatedDigits("1,a,3,4"));

1

可以使用Array.prototype.every()方法

return str.split(',').every(function(val) { 
    return parseInt(val) == val; // or any of the many other ways to check if a string is a number 
}); 
+1

與你的正則表達式(在編輯之前)搞混了這個'/^\ d *(,\ d +)* $ /'這個可以使用單個數字,並且對於空字符串返回true – Terminus

+0

是的,我決定改變正則表達式解決方案 – Phil

+0

soo這是搶劫? :) – Terminus

0

有沒有需要分割字符串,循環,檢查各部分的有效性。只要做一個正則表達式檢查排除逗號 非數字的存在(這裏假設一個逗號可以發生在任何地方)

嘗試:

var str = "1,2,3,"; 
if(str.match(/[^\d|,]/) == null) 
alert("great job"); 
else 
alert("err"); 
2

您可以使用一個簡單的正則表達式來檢查字符串只包含逗號分隔的數字:

/^(\d+,)*\d+$/.test(s) 

,並用它喜歡:

['1,2,3','123,5,223','[email protected]','12','12,',',23',','].forEach(function(s) { 
 
    document.write('<br>' + s + ' : ' + (/^(\d+,)*\d+$/.test(s)? 'great job' : 'invalid input')); 
 
});

這假設數字可以有任意數量的數字,並且逗號只允許在數字之間;不在開始,結束或連續。

1

幫助鏈接:

Check whether an input string contains number

Check if string contains only digits

我扔了一起,希望它可以幫助! 這是一個工作功能,就像你問。

function isOnlyNumsAndCommas(str) { 
    for (var i = 2; i <= str.length + 2; i += 2) { 
    var val = str.substring(i - 2, i - 1); 
    var isnum = val.match(/\d+/g); 
    if (!isnum) { 
     return ('invalid input'); 
     break; 
    } 
    } 
    return('great job'); 
} 

alert(isOnlyNumsAndCommas("@,4,3,3")); 

對於非'for循環'功能!

function isOnlyNumsAndCommas(str) { 
    if (str.match(/[^\d|,]/) === null) { 
    return('great job'); 
    } else { 
    return('invalid input'); 
    } 
} 

alert(isOnlyNumsAndCommas("a,4,3,@")); 
+0

對於像',,,'和',2'這樣的值,「非for循環」版本可能不會返回true。 – RobG

相關問題