2015-03-18 67 views
-1

我有JS代碼來驗證郵編:10個數字字符在第6個位置(例如,12345-6789)帶有破折號。我確認這兩部分都是使用!isNaN的數字。isNaN沒有捕捉到字母

if (valSize == 10) { 
    var numVal1 = new Number(newVal.substring(0, 4)); 
    var numVal2 = new Number(newVal.substring(6, 9)); 
    if (newVal.charAt(5) == '-' && !isNaN(numVal1) && !isNaN(numVal2)) { 
     return newVal; 
    } 
} 
throw "Incorrect format"; 

這主要工作,但由於某些原因,以下值經過,並且不返回一個錯誤:

12345-678a 

爲什麼IsNaN(子(6,9))允許通過在這種情況下?

+0

備註:有人說異常應該用於*特殊*事情,輸入驗證不完全是例外。 – 2015-03-18 21:19:41

回答

7

String.substring函數簽名是:

str.substring(indexA[, indexB]) 

索引A

和字符串的長度爲0之間的整數,指定 偏移量的第一個字符的字符串中包括 返回的子串。

indexB

可選。一個介於0和字符串長度之間的整數,其中 指定第一個字符NOT至 的字符串中的偏移量包含在返回的子字符串中。

所以,你必須:

"12345-678a".substring(0,4) // 1234 
"12345-678a".substring(6,9) // 678 

因此,要麼糾正指數:

"12345-678a".substring(0,5) // 12345 
"12345-678a".substring(6) // 678a 

或者使用String.substr


或者使用正則表達式(推薦),因爲當前的代碼,固定後,將愉快地接受12.45-67.8+1234--67812e45-6e-9。所有你需要做的是:

/^\d{5}-\d{4}$/.test("12345-678a") // false 
/^\d{5}-\d{4}$/.test("12.45-67.8") // false 
/^\d{5}-\d{4}$/.test("12345-6789") // true 
+2

值得注意的是,「12345-678a」.substr(6,9)// 678a' – Tony 2015-03-18 21:15:12

1

newVal.substring(6,9)在字符串「12345-678a」的情況下將返回數字「678」。所以應該有不是是一個錯誤拋出。

2

將正則表達式不是更合適的測試?

/\d{5}-\d{4}/.test('12345-1234') 
true 

/\d{5}-\d{4}/.test('12345-123a') 
false