Description
Library for validating international phone numbers. Based on Google's libphonenumber.
PhoneNumber alternatives and similar packages
Based on the "Miscellaneous" category.
Alternatively, view PhoneNumber alternatives based on common mentions on social networks and blogs.
-
ex_rated
ExRated, the Elixir OTP GenServer with the naughty name that allows you to rate-limit calls to any service that requires it. -
ex2ms
:ets.fun2ms for Elixir, translate functions to match specifications -
ecto_autoslug_field
Automatically create slugs for Ecto schemas. -
phone
Elixir phone number parser for numbers in international standard. -
std_json_io
A simple library for Elixir that provides json over STDIO -
gen_task
Generic Task behavior that helps encapsulate errors and recover from them in classic GenStage workers. -
exprint
A printf / sprintf library for Elixir. It works as a wrapper for :io.format. -
countriex
All sorts of useful information about every country. A pure elixir port of the ruby Countries gem -
Jisho-Elixir
A Japanese dictionary API; a wrapper around Jisho's API (http://jisho.org) -
indicado
Technical indicator library for Elixir with no dependencies. -
egaugex
A simple egauge parser to retrieve and parse data from egauge devices -
ratekeeper
Ratekeeper is a library for scheduling rate-limited actions. -
presentex
Elixir -> HTML/JavaScript based presentation framework intended for showing Elixir code -
mixstar
Elixir Mix task to starring GitHub repository with `mix deps.get`ting dependent library
Build time-series-based applications quickly and at scale.
Do you think we are missing an alternative of PhoneNumber or a related project?
README
PhoneNumber
Library for validating international phone numbers. Based on Google's libphonenumber.
Installation
Add phone_number
to your list of dependencies in mix.exs
:
def deps do
[
{:phone_number, "~> 0.2.3"}
]
end
To update to version 0.2.0
, you must delete the telephone_number_data.dat
file.
Documentation HexDocs
Usage
Parse phone:
iex> p = PhoneNumber.parse("381601234567")
%PhoneNumber.Phone{
country: %PhoneNumber.Country{
country_code: "381",
data: %{},
full_general_pattern: ~r/^(381)?(0)?(?<national_num>[126-9]\d{4,11}|3(?:[0-79]\d{3,10}|8[2-9]\d{2,9}))$/,
general_validation: ~r/[126-9]\d{4,11}|3(?:[0-79]\d{3,10}|8[2-9]\d{2,9})/,
id: "RS",
main_country_for_code: false,
mobile_token: nil,
national_prefix: "0",
national_prefix_for_parsing: nil,
national_prefix_transform_rule: "",
validations: [~r/^((?:1(?:[02-9][2-9]|1[1-9])\d|2(?:[0-24-7][2-9]\d|[389](?:0[2-9]|[2-9]\d))|3(?:[0-8][2-9]\d|9(?:[2-9]\d|0[2-9])))\d{3,8})$/,
~r/^(6(?:[0-689]|7\d)\d{6,7})$/, ~r/^(800\d{3,9})$/,
~r/^((?:90[0169]|78\d)\d{3,7})$/, ~r/^(7[06]\d{4,10})$/]
},
original_number: "381601234567",
valid: true
}
iex> PhoneNumber.Phone.e164_number(p)
{:ok, "+38181601234567"}
ex(2)> PhoneNumber.parse("381601234567", "RS")
%PhoneNumber.Phone{
country: %PhoneNumber.Country{
country_code: "381",
data: %{},
full_general_pattern: ~r/^(381)?(0)?(?<national_num>[126-9]\d{4,11}|3(?:[0-79]\d{3,10}|8[2-9]\d{2,9}))$/,
general_validation: ~r/[126-9]\d{4,11}|3(?:[0-79]\d{3,10}|8[2-9]\d{2,9})/,
id: "RS",
main_country_for_code: false,
mobile_token: nil,
national_prefix: "0",
national_prefix_for_parsing: nil,
national_prefix_transform_rule: "",
validations: [~r/^((?:1(?:[02-9][2-9]|1[1-9])\d|2(?:[0-24-7][2-9]\d|[389](?:0[2-9]|[2-9]\d))|3(?:[0-8][2-9]\d|9(?:[2-9]\d|0[2-9])))\d{3,8})$/,
~r/^(6(?:[0-689]|7\d)\d{6,7})$/, ~r/^(800\d{3,9})$/,
~r/^((?:90[0169]|78\d)\d{3,7})$/, ~r/^(7[06]\d{4,10})$/]
},
original_number: "381601234567",
valid: true
}
iex(3)> PhoneNumber.valid?("381601234567", "RS")
{:ok,
%PhoneNumber.Phone{
country: %PhoneNumber.Country{
country_code: "381",
data: %{},
full_general_pattern: ~r/^(381)?(0)?(?<national_num>[126-9]\d{4,11}|3(?:[0-79]\d{3,10}|8[2-9]\d{2,9}))$/,
general_validation: ~r/[126-9]\d{4,11}|3(?:[0-79]\d{3,10}|8[2-9]\d{2,9})/,
id: "RS",
main_country_for_code: false,
mobile_token: nil,
national_prefix: "0",
national_prefix_for_parsing: nil,
national_prefix_transform_rule: "",
validations: [~r/^((?:1(?:[02-9][2-9]|1[1-9])\d|2(?:[0-24-7][2-9]\d|[389](?:0[2-9]|[2-9]\d))|3(?:[0-8][2-9]\d|9(?:[2-9]\d|0[2-9])))\d{3,8})$/,
~r/^(6(?:[0-689]|7\d)\d{6,7})$/, ~r/^(800\d{3,9})$/,
~r/^((?:90[0169]|78\d)\d{3,7})$/, ~r/^(7[06]\d{4,10})$/]
},
original_number: "381601234567",
valid: true
}}
iex(4)> PhoneNumber.valid?("481601234567", "RS")
{:ok, nil}
iex(5)> PhoneNumber.possible_countries("381601234567")
[
%PhoneNumber.Phone{
country: %PhoneNumber.Country{
country_code: "49",
data: %{},
full_general_pattern: ~r/^(49)?(0)?(?<national_num>[1-35-9]\d{3,14}|4(?:[0-8]\d{3,12}|9(?:[0-37]\d|4(?:[1-35-8]|4\d?)|5\d{1,2}|6[1-8]\d?)\d{2,8}))$/,
general_validation: ~r/[1-35-9]\d{3,14}|4(?:[0-8]\d{3,12}|9(?:[0-37]\d|4(?:[1-35-8]|4\d?)|5\d{1,2}|6[1-8]\d?)\d{2,8})/,
id: "DE",
main_country_for_code: false,
mobile_token: nil,
national_prefix: "0",
national_prefix_for_parsing: nil,
national_prefix_transform_rule: "",
validations: [~r/^(2\d{5,13}|3(?:0\d{3,13}|2\d{9}|[3-9]\d{4,13})|4(?:0\d{3,12}|[1-8]\d{4,12}|9(?:[0-37]\d|4(?:[1-35-8]|4\d?)|5\d{1,2}|6[1-8]\d?)\d{2,8})|5(?:0[2-8]|[1256]\d|[38][0-8]|4\d{0,2}|[79][0-7])\d{3,11}|6(?:\d{5,13}|9\d{3,12})|7(?:0[2-8]|[1-9]\d)\d{3,10}|8(?:0[2-9]|[1-8]\d|9\d?)\d{3,10}|9(?:0[6-9]\d{3,10}|1\d{4,12}|[2-9]\d{4,11}))$/,
~r/^(1(?:5[0-25-9]\d{8}|6[023]\d{7,8}|7\d{8,9}))$/,
~r/^(16(?:4\d{1,10}|[89]\d{1,11}))$/, ~r/^(800\d{7,12})$/,
~r/^(137[7-9]\d{6}|900(?:[135]\d{6}|9\d{7}))$/,
~r/^(1(?:3(?:7[1-6]\d{6}|8\d{4})|80\d{5,11}))$/, ~r/^(700\d{8})$/,
~r/^(18(?:1\d{5,11}|[2-9]\d{8}))$/,
~r/^(1(?:5(?:(?:2\d55|7\d99|9\d33)\d{7}|(?:[034568]00|113)\d{8})|6(?:013|255|399)\d{7,8}|7(?:[015]13|[234]55|[69]33|[78]99)\d{7,8}))$/]
},
original_number: "381601234567",
valid: true
},
%PhoneNumber.Phone{
country: %PhoneNumber.Country{
country_code: "381",
data: %{},
full_general_pattern: ~r/^(381)?(0)?(?<national_num>[126-9]\d{4,11}|3(?:[0-79]\d{3,10}|8[2-9]\d{2,9}))$/,
general_validation: ~r/[126-9]\d{4,11}|3(?:[0-79]\d{3,10}|8[2-9]\d{2,9})/,
id: "RS",
main_country_for_code: false,
mobile_token: nil,
national_prefix: "0",
national_prefix_for_parsing: nil,
national_prefix_transform_rule: "",
validations: [~r/^((?:1(?:[02-9][2-9]|1[1-9])\d|2(?:[0-24-7][2-9]\d|[389](?:0[2-9]|[2-9]\d))|3(?:[0-8][2-9]\d|9(?:[2-9]\d|0[2-9])))\d{3,8})$/,
~r/^(6(?:[0-689]|7\d)\d{6,7})$/, ~r/^(800\d{3,9})$/,
~r/^((?:90[0169]|78\d)\d{3,7})$/, ~r/^(7[06]\d{4,10})$/]
},
original_number: "381601234567",
valid: true
}
]
On startup, the library loads the file data/telephone_number_data.dat
.
If the file is not found, then the file data/telephone_number_data.xml
is processed, which contains patterns for parsing the phone.
If you updated telephone_number_data.xls
, you must delete the data/telephone_number_data.dat
file, or run the mix phone_number.load_phone_data
task