ruby - phone-number
This commit is contained in:
parent
0e9c386087
commit
b2c0073bb3
59
ruby/phone-number/README.md
Normal file
59
ruby/phone-number/README.md
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
# Phone Number
|
||||||
|
|
||||||
|
Clean up user-entered phone numbers so that they can be sent SMS messages.
|
||||||
|
|
||||||
|
The **North American Numbering Plan (NANP)** is a telephone numbering system used by many countries in North America like the United States, Canada or Bermuda. All NANP-countries share the same international country code: `1`.
|
||||||
|
|
||||||
|
NANP numbers are ten-digit numbers consisting of a three-digit Numbering Plan Area code, commonly known as *area code*, followed by a seven-digit local number. The first three digits of the local number represent the *exchange code*, followed by the unique four-digit number which is the *subscriber number*.
|
||||||
|
|
||||||
|
The format is usually represented as
|
||||||
|
|
||||||
|
```text
|
||||||
|
(NXX)-NXX-XXXX
|
||||||
|
```
|
||||||
|
|
||||||
|
where `N` is any digit from 2 through 9 and `X` is any digit from 0 through 9.
|
||||||
|
|
||||||
|
Your task is to clean up differently formatted telephone numbers by removing punctuation and the country code (1) if present.
|
||||||
|
|
||||||
|
For example, the inputs
|
||||||
|
- `+1 (613)-995-0253`
|
||||||
|
- `613-995-0253`
|
||||||
|
- `1 613 995 0253`
|
||||||
|
- `613.995.0253`
|
||||||
|
|
||||||
|
should all produce the output
|
||||||
|
|
||||||
|
`6139950253`
|
||||||
|
|
||||||
|
**Note:** As this exercise only deals with telephone numbers used in NANP-countries, only 1 is considered a valid country code.
|
||||||
|
|
||||||
|
* * * *
|
||||||
|
|
||||||
|
For installation and learning resources, refer to the
|
||||||
|
[exercism help page](http://exercism.io/languages/ruby).
|
||||||
|
|
||||||
|
For running the tests provided, you will need the Minitest gem. Open a
|
||||||
|
terminal window and run the following command to install minitest:
|
||||||
|
|
||||||
|
gem install minitest
|
||||||
|
|
||||||
|
If you would like color output, you can `require 'minitest/pride'` in
|
||||||
|
the test file, or note the alternative instruction, below, for running
|
||||||
|
the test file.
|
||||||
|
|
||||||
|
Run the tests from the exercise directory using the following command:
|
||||||
|
|
||||||
|
ruby phone_number_test.rb
|
||||||
|
|
||||||
|
To include color from the command line:
|
||||||
|
|
||||||
|
ruby -r minitest/pride phone_number_test.rb
|
||||||
|
|
||||||
|
|
||||||
|
## Source
|
||||||
|
|
||||||
|
Event Manager by JumpstartLab [http://tutorials.jumpstartlab.com/projects/eventmanager.html](http://tutorials.jumpstartlab.com/projects/eventmanager.html)
|
||||||
|
|
||||||
|
## Submitting Incomplete Solutions
|
||||||
|
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
19
ruby/phone-number/phone_number.rb
Normal file
19
ruby/phone-number/phone_number.rb
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
class PhoneNumber
|
||||||
|
def self.clean(number)
|
||||||
|
number.gsub!(/[^0-9]/, '')
|
||||||
|
|
||||||
|
if number.length < 10 or number.length > 11
|
||||||
|
nil
|
||||||
|
elsif number.length == 11
|
||||||
|
if number[0] == "1"
|
||||||
|
number.slice(1, number.length)
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
elsif ["0", "1"].include?(number[0]) or ["0", "1"].include?(number[3])
|
||||||
|
nil
|
||||||
|
else
|
||||||
|
number
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
75
ruby/phone-number/phone_number_test.rb
Normal file
75
ruby/phone-number/phone_number_test.rb
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
require 'minitest/autorun'
|
||||||
|
require_relative 'phone_number'
|
||||||
|
|
||||||
|
# Common test data version: 1.4.0 0783171
|
||||||
|
class PhoneNumberTest < Minitest::Test
|
||||||
|
def test_cleans_the_number
|
||||||
|
# skip
|
||||||
|
assert_equal "2234567890", PhoneNumber.clean("(223) 456-7890")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_cleans_numbers_with_dots
|
||||||
|
# skip
|
||||||
|
assert_equal "2234567890", PhoneNumber.clean("223.456.7890")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_cleans_numbers_with_multiple_spaces
|
||||||
|
# skip
|
||||||
|
assert_equal "2234567890", PhoneNumber.clean("223 456 7890 ")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invalid_when_9_digits
|
||||||
|
# skip
|
||||||
|
assert_nil PhoneNumber.clean("123456789")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invalid_when_11_digits_does_not_start_with_a_1
|
||||||
|
# skip
|
||||||
|
assert_nil PhoneNumber.clean("22234567890")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_valid_when_11_digits_and_starting_with_1
|
||||||
|
# skip
|
||||||
|
assert_equal "2234567890", PhoneNumber.clean("12234567890")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_valid_when_11_digits_and_starting_with_1_even_with_punctuation
|
||||||
|
# skip
|
||||||
|
assert_equal "2234567890", PhoneNumber.clean("+1 (223) 456-7890")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invalid_when_more_than_11_digits
|
||||||
|
# skip
|
||||||
|
assert_nil PhoneNumber.clean("321234567890")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invalid_with_letters
|
||||||
|
# skip
|
||||||
|
assert_nil PhoneNumber.clean("123-abc-7890")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invalid_with_punctuations
|
||||||
|
# skip
|
||||||
|
assert_nil PhoneNumber.clean("123-@:!-7890")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invalid_if_area_code_starts_with_0
|
||||||
|
# skip
|
||||||
|
assert_nil PhoneNumber.clean("(023) 456-7890")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invalid_if_area_code_starts_with_1
|
||||||
|
# skip
|
||||||
|
assert_nil PhoneNumber.clean("(123) 456-7890")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invalid_if_exchange_code_starts_with_0
|
||||||
|
# skip
|
||||||
|
assert_nil PhoneNumber.clean("(223) 056-7890")
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_invalid_if_exchange_code_starts_with_1
|
||||||
|
# skip
|
||||||
|
assert_nil PhoneNumber.clean("(223) 156-7890")
|
||||||
|
end
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user