ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# katrinleinweber's solution

## to Phone Number in the R Track

Published at Apr 21 2019 · 0 comments
Instructions
Test suite
Solution

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

``````(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.

## Installation

See this guide for instructions on how to setup your local R environment.

## How to implement your solution

In each problem folder, there is a file named `<exercise_name>.R` containing a function that returns a `NULL` value. Place your implementation inside the body of the function.

## How to run tests

Inside of RStudio, simply execute the `test_<exercise_name>.R` script. This can be conveniently done with testthat's `auto_test` function. Because exercism code and tests are in the same folder, use this same path for both `code_path` and `test_path` parameters. On the command-line, you can also run `Rscript test_<exercise_name>.R`.

## Source

Event Manager by JumpstartLab 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.

### test_phone-number.R

``````source("./phone-number.R")
library(testthat)

context("phone number")

test_that("cleans the number", {
expect_equal(parse_phone_number("(223) 456-7890"), "2234567890")
})

test_that("cleans numbers with dots", {
expect_equal(parse_phone_number("223.456.7890"), "2234567890")
})

test_that("cleans numbers with multiple spaces", {
expect_equal(parse_phone_number("223 456   7890   "), "2234567890")
})

test_that("invalid when 9 digits", {
expect_equal(parse_phone_number("123456789"), NULL)
})

test_that("invalid when 11 digits and not starting with a 1", {
expect_equal(parse_phone_number("22234567890"), NULL)
})

test_that("valid when 11 digits and starting with 1", {
expect_equal(parse_phone_number("12234567890"), "2234567890")
})

test_that("invalid when more than 11 digits", {
expect_equal(parse_phone_number("321234567890"), NULL)
})

test_that("invalid with letters", {
expect_equal(parse_phone_number("123-abc-7890"), NULL)
})

test_that("invalid with punctuations", {
expect_equal(parse_phone_number("123-@:!-7890"), NULL)
})

expect_equal(parse_phone_number("(123) 456-7890"), NULL)
})

expect_equal(parse_phone_number("(223) 056-7890"), NULL)
})

message("All tests passed for exercise: phone-number")``````
``````library(magrittr)

parse_phone_number <- function(number_string) {
number_string %>%
# remove non-digit characters
gsub(pattern = "\\D",
replacement = "",
x = .) %>%
# extract valid number pattern
grep("^1?[2-9]\\d{2}[2-9]\\d{6}\$",
x = ., value = TRUE) %>%
unlist() %>%
paste(collapse = "") ->
phone_number

# handle 9 digits edge case here, to avoid "subscript out of bounds" error later
if (phone_number == "")
return(NULL)

dplyr::case_when(
nchar(phone_number) == 10 ~ phone_number,
# phone_number == "" ~ NULL, # not sure why this doesn't work
TRUE ~ sub("1", "", phone_number)
)
}``````