你加入了 LinkLine,這是一家頂尖的通訊公司,致力於讓每個人都能擁有可靠的連線。 團隊面臨一個巨大的挑戰:使用者提交的電話號碼格式五花八門,有破折號、空格、點、括號,甚至還有前綴。 有些號碼是有效的,有些則根本無法使用。
你的任務就是把這團混亂變成井然有序。 你要清理有效的號碼,把它們整理成適合系統使用的格式。 同時,你還要找出並過濾掉所有無效的項目。
LinkLine 的營運能否順利,取決於你能否區分哪些可用、哪些不能用。 你準備好迎接挑戰,讓連線順暢運作了嗎?
清理電話號碼,讓它們可以用來傳送簡訊。
**北美電話號碼編碼計畫(NANP)**是北美許多國家(如美國、加拿大或百慕達)使用的電話號碼編碼系統。
所有 NANP 國家都共用同一個國際國碼:1。
NANP 號碼是十位數的號碼,由三位數的編碼區號(一般稱為_區域號碼_)加上七位數的當地號碼組成。 當地號碼的前三位數是_交換碼_,後面接著四位數的專屬號碼,也就是_用戶號碼_。
格式通常表示為
NXX NXX-XXXX
其中N是 2 到 9 之間的任何數字,X則是 0 到 9 之間的任何數字。
有時號碼前面還會加上國碼(以 1 或 +1 表示)。
你的任務是清理各種不同格式的電話號碼,移除標點符號,並在出現時移除國碼。
例如,下列輸入
+1 (613)-995-0253613-995-02531 613 995 0253613.995.0253都應該產生這樣的輸出
6139950253
注意: 由於這個練習只處理 NANP 國家使用的電話號碼,因此只有 1 被視為有效的國碼。
有時候,你會需要拋出例外。這麼做的時候,一定要附上有意義的錯誤訊息,指出錯誤的來源。這能讓你的程式碼更好讀,也對除錯很有幫助。如果你已經知道錯誤來源是某個特定的型別,可以選擇拋出其中一種內建錯誤類型,但仍然要附上有意義的訊息。
這個練習要求你使用 raise 敘述,在PhoneNumber()類別的建構子收到不是_有效電話號碼_的數字時,「拋出」多個ValueErrors。這涵蓋區碼或交換碼無效、號碼位數太多(或太少),以及輸入中出現標點符號或字母等情況。唯有同時raise這個exception並附上訊息,測試才會通過。
若要raise帶有訊息的ValueError,請把訊息寫成exception型別的引數:
# if a phone number has less than 10 digits.
raise ValueError("must not be fewer than 10 digits")
# if a phone number has more than 11 digits.
raise ValueError("must not be greater than 11 digits")
# if a phone number has 11 digits, but starts with a number other than 1.
raise ValueError("11 digits must start with 1")
# if a phone number has an exchange code that starts with 0.
raise ValueError("exchange code cannot start with zero")
# if a phone number has an exchange code that starts with 1.
raise ValueError("exchange code cannot start with one")
# if a phone number has an area code that starts with 0.
raise ValueError("area code cannot start with zero")
# if a phone number has an area code that starts with 1.
raise ValueError("area code cannot start with one")
# if a phone number has punctuation in place of some digits.
raise ValueError("punctuations not permitted")
# if a phone number has letters in place of some digits.
raise ValueError("letters not permitted")