-
Notifications
You must be signed in to change notification settings - Fork 212
/
en_gb.ex
138 lines (119 loc) · 3.7 KB
/
en_gb.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
defmodule Faker.Phone.EnGb do
import Faker, only: [samplerp: 2]
@moduledoc """
This follows the rules of
[Telephone numbers in the United Kingdom](https://en.wikipedia.org/wiki/Telephone_numbers_in_the_United_Kingdom).
"""
@prefixes %{
"International dialling" => ["0"],
"Geographic numbers with area codes - for list see telephone area codes" => ["1", "2"],
"Geographic rate numbers - used by public sector and not-for-profit bodies" => ["30"],
"Geographic rate numbers - new allocations" => ["33"],
"Geographic rate numbers - migrating numbers from matching 084 numbers" => ["34"],
"Geographic rate numbers - migrating numbers from matching 087 numbers" => ["37"],
"Corporate numbers" => ["55"],
"Location independent electronic communications service (VoIP)" => ["56"],
"Personal numbering service" => ["70"],
"Radiopaging services" => ["76"],
"Freephone numbers" => ["80"],
"Internet for schools" => ["82"],
"Basic revenue share numbers" => ["84"],
"Higher rate revenue share numbers" => ["87"],
"Premium Rate Services (PRS) revenue share numbers" => ["90", "91"],
"Sexual Entertainment Services (SES) revenue share at a premium rate" => ["908", "909", "98"]
}
@doc """
Returns a random UK phone number
## Examples
iex> Faker.Phone.EnGb.number()
"+44054264610"
iex> Faker.Phone.EnGb.number()
"+44562970523"
iex> Faker.Phone.EnGb.number()
"+447502 030320"
iex> Faker.Phone.EnGb.number()
"+447933 760337"
"""
@spec number() :: String.t()
def number do
if Faker.random_between(0, 1) == 0 do
landline_number()
else
cell_number()
end
end
@doc """
Returns a random UK landline phone number
## Examples
iex> Faker.Phone.EnGb.landline_number()
"+44331542646"
iex> Faker.Phone.EnGb.landline_number()
"+44560832970"
iex> Faker.Phone.EnGb.landline_number()
"+44023570203"
iex> Faker.Phone.EnGb.landline_number()
"+44703209733"
"""
@spec landline_number() :: String.t()
def landline_number do
"+44#{number_prefix()}"
|> random_numbers_until(12)
end
samplerp(:cell_number_format, [
"074## ######",
"075## ######",
"076## ######",
"077## ######",
"078## ######",
"079## ######",
"+4474## ######",
"+4475## ######",
"+4476## ######",
"+4477## ######",
"+4478## ######",
"+4479## ######"
])
@doc """
Returns a random UK mobile phone number
## Examples
iex> Faker.Phone.EnGb.cell_number()
"+447415 426461"
iex> Faker.Phone.EnGb.cell_number()
"07483 297052"
iex> Faker.Phone.EnGb.cell_number()
"+447557 020303"
iex> Faker.Phone.EnGb.cell_number()
"+447609 733760"
"""
@spec cell_number() :: String.t()
def cell_number do
Faker.format(cell_number_format())
end
@doc """
Returns a random UK mobile phone number
## Examples
iex> Faker.Phone.EnGb.mobile_number()
"+447415 426461"
iex> Faker.Phone.EnGb.mobile_number()
"07483 297052"
iex> Faker.Phone.EnGb.mobile_number()
"+447557 020303"
iex> Faker.Phone.EnGb.mobile_number()
"+447609 733760"
"""
@spec mobile_number() :: String.t()
defdelegate mobile_number, to: __MODULE__, as: :cell_number
defp random_numbers_until(out, count) do
char_count =
out
|> String.to_charlist()
|> Enum.count()
format = String.duplicate("#", count - char_count)
"#{out}#{Faker.format(format)}"
end
defp number_prefix do
numbers = Map.values(@prefixes)
type = Enum.at(numbers, Faker.random_between(0, Enum.count(@prefixes) - 1))
Enum.at(type, Faker.random_between(0, Enum.count(type) - 1))
end
end