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

# JaeHyoLee's solution

## to Phone Number in the Lua Track

Published at Jul 13 2018 · 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.

## Running the tests

To run the tests, run the command `busted` from within the exercise directory.

## Further information

For more detailed information about the Lua track, including how to get help if you're having trouble, please visit the exercism.io Lua language page.

## 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.

### phone-number_spec.lua

``````local PhoneNumber = require('phone-number')

describe('phone-number', function()
it('cleans the number (123) 456-7890', function()
local phone = PhoneNumber:new('(123) 456-7890')
assert.are.equals('1234567890', phone.number)
end)

it('cleans numbers with dots', function()
local phone = PhoneNumber:new('123.456.7890')
assert.are.equals('1234567890', phone.number)
end)

it('valid when 11 digits and first digit is 1', function()
local phone = PhoneNumber:new('11234567890')
assert.are.equals('1234567890', phone.number)
end)

it('invalid when 11 digits', function()
local phone = PhoneNumber:new('21234567890')
assert.are.equals('0000000000', phone.number)
end)

it('invalid when 9 digits', function()
local phone = PhoneNumber:new('123456789')
assert.are.equals('0000000000', phone.number)
end)

it('has an area code', function()
local phone = PhoneNumber:new('1234567890')
assert.are.equals('123', phone:areaCode())
end)

it('formats a number', function()
local phone = PhoneNumber:new('1234567890')
assert.are.equals('(123) 456-7890', tostring(phone))
end)
end)``````
``````local expected_length = 10

local function verified_phone_number(number)
if #number == expected_length then return number
elseif (#number == expected_length + 1) and (number:sub(1, 1) == '1') then
return number:sub(2)
end
end

local function to_phone_number(source)
local phone_number = source:gsub('%D+', '')
return verified_phone_number(phone_number)
end

local function areaCode(self)
return self.number:sub(1,3)
end

local function format_phone_number(self)
return '('..self:areaCode() .. ') ' .. self.number:sub(4, 6) .. '-'.. self.number:sub(7, 10)
end

local function new(self, source)
local o = {
number = to_phone_number(source),
areaCode = areaCode
}

return setmetatable(o, {__tostring = format_phone_number})
end

return { new = new }``````