2014-12-03 190 views
3

我即將創建電話號碼格式驗證。格式爲10位數字,包括加號,例如:+0133999504。即使我已經聲明瞭模式,我試圖禁止使用「 - 」符號或任何其他字符,但驗證不起作用。任何其他想法或解決方案?如何驗證電話號碼格式

1st I declared the string regex: 

String PhoneNo; 
String PhoneNo_PATTERN ="[\\+]\\d{3}\\d{7}"; 

2nd I make a if..else statement: 
{ 
        Pattern pattern = Pattern.compile(PhoneNo_PATTERN); 
        Matcher matcher = pattern.matcher(PhoneNo); 
        if (!matcher.matches()) 
        { 
        inputemergencyContactNo.setError("Please enter Emergency Contact No"); 
        } 
        else{ 
        Toast.makeText(RiderProfile.this, "Please filled in All field", Toast.LENGTH_SHORT).show(); 
        } 

回答

4

爲什麼不能消除所有的非數字和再算上剩餘的數字並在以後再加回來?這允許用戶自由反正要填寫自己的電話號碼,他們想...

String PhoneNo = "+123-456 7890"; 
String Regex = "[^\\d]"; 
String PhoneDigits = PhoneNo.replaceAll(Regex, ""); 
if (PhoneDigits.length()!=10) 
{ 
    // error message 
} 
else 
{ 
    PhoneNo = "+"; 
    PhoneNo = PhoneNo.concat(PhoneDigits); // adding the plus sign 

    // validation successful 

} 

如果你的應用程序的目的是在國際上使用替代

if (!PhoneDigits.length()!=10) 

if(PhoneDigits.length() < 6 || PhoneDigits.length() > 13) 

爲Fatti汗建議。


要在你張貼在Android EditText Validation and Regex代碼應用此首先包括在公共類此方法,或者含有的onClick()類:

public boolean validateNumber(String S) { 
    String Regex = "[^\\d]"; 
    String PhoneDigits = S.replaceAll(Regex, ""); 
    return (PhoneDigits.length()!=10); 
} 

,包括在CreateNewRider類此方法:

protected String tidyNumber(String S) { 
    String Regex = "[^\\d]"; 
    String PhoneDigits = S.replaceAll(Regex, ""); 
    String Plus = "+"; 
    return Plus.concat(PhoneDigits); 
} 

這是驗證發生......

@Override 
public void onClick(View view) { 

    Boolean b = false; 
    if(inputfullname.getText().toString().equals("")) b = true; 

    else if(... // do this for all fields 

    else if(inputmobileNo.getText().toString().equals("")) b=true; 
    else if(inputemergencyContactNo.getText().toString().equals("")) b=true; 
    else { 
     if(validateNumber(inputmobileNo.getText().toString()) 
      Toast.makeText(RiderProfile.this, "Invalid mobile number", Toast.LENGTH_SHORT).show(); 

     else if(validateNumber(inputemergencyContactNo.getText().toString()) 
      Toast.makeText(RiderProfile.this, "Invalid emergency contact number", Toast.LENGTH_SHORT).show(); 
     else { 
      // Validation succesful 

      new CreateNewRider().execute(); 

     } 
    } 
    if(b) Toast.makeText(RiderProfile.this, "Please filled in All field", Toast.LENGTH_SHORT).show(); 
} 

然後在CreateNewRider類使用tidyNumber():

protected String doInBackground(String... args) { 
     String fullname= inputfullname.getText().toString(); 
     String IC= inputIC.getText().toString(); 
     String mobileNo= tidyNumber(inputmobileNo.getText().toString()); 
     String emergencyContactName= inputemergencyContactName.getText().toString()); 
     String emergencyContactNo= tidyNumber(inputemergencyContactNo.getText().toString()); 

     ... 
+0

謝謝你的想法n解決方案..我會嘗試插入到我的編碼..tq這麼多.. – 2014-12-03 06:25:42

+0

我試過編碼,但它似乎不是工作.. – 2014-12-03 06:52:30

+0

我修復了代碼中的一些錯誤。讓我知道,如果它現在適合你... – 2014-12-03 17:01:00

3
^[\\+]\\d{3}\\d{7}$ 

使用錨來限制對手。

^ =>開始比賽的

$匹配

2

的=>端鑑於你指定的規則:

高達長度13和包括字符+盈。

(也包含10在你的代碼的最小長度)

你會希望有一個正則表達式看起來像這樣:

^\+[0-9]{10,13}$ 

隨着最小和最大長度的編碼正則表達式,你可以從你的if()塊中刪除這些條件。

偏題:我建議10-13的範圍對於國際電話號碼字段來說太侷限了;你幾乎肯定會發現有效的數字比這更長和更短。我建議8-20的範圍是安全的。

[編輯] OP指出由於轉義序列,上述正則表達式不起作用。不知道爲什麼,但一個替代將是:

^[+][0-9]{10,13}$ 

[編輯2] OP現在添加+符號應該是可選的。在這種情況下,正則表達式需要+後一個問號,所以上面的例子,現在應該是這樣的:

^[+]?[0-9]{10,13}$ 

對於有效的手機你需要考慮的7位至13位,因爲一些國家有7位手機號碼。此外,我們不能像查詢手機號碼必須與9或8或任何啓動..

對於手機號碼,我用這個這個功能

private boolean isValidMobile(String phone2) 
{ 
    boolean check; 
    if(phone2.length() < 6 || phone2.length() > 13) 
    { 
     check = false; 
     txtPhone.setError("Not Valid Number"); 
    } 
    else 
    { 
     check = true; 
    } 
    return check; 
} 
+0

謝謝fatti khan爲你的好主意n解決方案.. – 2014-12-03 06:26:10

1

使用this我的電話號碼的驗證和它的作品般的魅力。它涵蓋了手機驗證以及開發者希望用電話號碼嘗試的更多內容。