信頼できるつながりをすべての人に届けることを使命とする大手通信会社、LinkLineの一員になりました。 チームは大きな課題に直面しています。ユーザーが送信してくる電話番号は、ハイフン、スペース、ドット、括弧、さらにはプレフィックスまで、実にさまざまな形式です。 有効な番号もあれば、どうしても使えない番号もあります。
使命は、この混沌を秩序に変えることです。 有効な番号は整えて、システムで使えるように適切な形式にします。 同時に、無効なデータは見つけ次第、取り除きます。
LinkLineの事業がうまく回るかどうかは、使えるものと使えないものを正しく見分けられるかどうかにかかっています。 さあ、この挑戦に挑み、つながりをスムーズに保つ準備はできましたか?
電話番号を整理して、SMSメッセージを送れるようにしましょう。
**北米電話番号計画(NANP)**は、アメリカ合衆国、カナダ、バミューダなど、北米の多くの国で使われている電話番号の体系です。
NANPに加盟する国は、いずれも同じ国際国番号1を共有しています。
NANPの番号は10桁で、3桁の番号計画エリアコード(一般に_市外局番_と呼ばれます)と、それに続く7桁の市内番号で構成されます。 市内番号の最初の3桁が_交換局コード_で、そのあとに続く固有の4桁の番号が_加入者番号_です。
この形式は、通常次のように表されます。
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を「投げる」必要があります。これには、市外局番や市内局番が無効な場合、桁数が多すぎる(または少なすぎる)場合、句読点や文字が入力として渡された場合のエラーが含まれます。テストが合格するのは、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")