Class: MobileNumberNormalizer

Inherits:
Object
  • Object
show all
Defined in:
lib/mobile_number_normalizer.rb,
lib/mobile_number_normalizer/version.rb

Overview

Normalize Mobile Numbers

Author:

  • dmasur

Constant Summary collapse

MIN_MOBILE_NUMBER_LENGTH =

Minimal Length of a Mobile Number 0049 => 4 177 => 3 xxxxxx => minimal 4

Author:

  • dmasur

11
VERSION =
"0.1.2"
@@valid_area_codes =

Array of String of International Area Codes

Author:

  • dmasur

[ '001', '001809', '0020', '00212', '00213', '00216', '00218',
'00220', '00221', '00222', '00223', '00224', '00225', '00226',
'00227', '00228', '00229', '00230', '00231', '00232', '00233',
'00234', '00235', '00236', '00237', '00238', '00239', '00240',
'00241', '00242', '00243', '00244', '00245', '00247', '00248',
'00249', '00250', '00251', '00252', '00253', '00254', '00255',
'00256', '00257', '00258', '00260', '00261', '00262', '00263',
'00264', '00265', '00266', '00267', '00268', '00269', '0027',
'00290', '00291', '00297', '00298', '00299', '0030', '0031',
'0032', '0033', '0034', '00350', '00351', '00352', '00353',
'00354', '00355', '00356', '00357', '00358', '00359', '0036',
'00370', '00371', '00372', '00373', '00376', '00378', '0038',
'00385', '00387', '00389', '0039', '00396', '0040', '0041',
'0042', '0043', '0044', '0045', '0046', '0047', '0048', '00500',
'00501', '00502', '00503', '00504', '00505', '00506', '00507',
'00508', '00509', '0051', '0052', '0053', '0054', '0055',
'0056', '0057', '0058', '00590', '00591', '00592', '00593',
'00594', '00595', '00596', '00597', '00598', '00599', '0060',
'0061', '0062', '0063', '0064', '0065', '0066', '00670',
'00671', '00673', '00674', '00675', '00676', '00677', '00678',
'00679', '00680', '00682', '00684', '00685', '00686', '00687',
'00689', '00691', '00692', '007', '0081', '0084', '00850',
'00852', '00853', '00855', '00856', '0086', '00880', '00886',
'0090', '0091', '0092', '0094', '0095', '00960', '00961',
'00962', '00963', '00964', '00965', '00966', '00967', '00968',
'00971', '00972', '00973', '00974', '00975', '00976', '00977',
'0098', '00994' ]

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(mobile_number) ⇒ MobileNumberNormalizer

Returns a new instance of MobileNumberNormalizer.



59
60
61
# File 'lib/mobile_number_normalizer.rb', line 59

def initialize(mobile_number)
  @mobile_number = mobile_number
end

Class Method Details

.add_area_code(new_area_code) ⇒ Object



54
55
56
57
# File 'lib/mobile_number_normalizer.rb', line 54

def self.add_area_code(new_area_code)
  area_code = '00' + new_area_code.to_s.sub(/^[^1-9]*/, '')
  @@valid_area_codes << area_code unless @@valid_area_codes.include? area_code
end

.clean_number(mobile_number) ⇒ String

Clean a mobile number

Parameters:

  • mobile_number (String)

    Mobile Number

Returns:

  • (String)

    Mobile Number

Author:

  • dmasur



157
158
159
160
161
162
163
164
165
# File 'lib/mobile_number_normalizer.rb', line 157

def self.clean_number mobile_number
  mobile_number.strip!
  mobile_number = replace_prefix mobile_number
  #puts mobile_number
  mobile_number = remove_superflouid_chars mobile_number
  #puts mobile_number
  mobile_number = "0049#{mobile_number[1..-1]}" if /^0[1-9]/ =~ mobile_number
  delete_invalid_numbers mobile_number
end

.delete_invalid_numbers(mobile_number) ⇒ String

Deletes the number if it is invalid

Parameters:

  • mobile_number (String)

    Mobile Number

Returns:

  • (String)

    Mobile Number

Author:

  • dmasur



173
174
175
176
177
# File 'lib/mobile_number_normalizer.rb', line 173

def self.delete_invalid_numbers mobile_number
  mobile_number = "" unless mobile_number.length.between?(MIN_MOBILE_NUMBER_LENGTH, 20)
  mobile_number = "" if /^[^0]/ =~ mobile_number
  return mobile_number
end

.get_number(number) ⇒ Object

Return the correct mobile number as Class

Author:

  • dmasur



67
68
69
70
# File 'lib/mobile_number_normalizer.rb', line 67

def self.get_number number
  number = new(number).get_number
  return number
end

.looks_like_a_mobile_number(number) ⇒ Boolean

Determinate if the number could be a mobile number

Parameters:

  • number (String)

    Mobile number

Returns:

  • (Boolean)

    is valild number?

Author:

  • dmasur



139
140
141
142
143
144
145
146
147
148
149
# File 'lib/mobile_number_normalizer.rb', line 139

def self.looks_like_a_mobile_number number
  if !number.blank?
    #puts "Dirty Part: #{number}"
    clean_number = MobileNumberNormalizer.clean_number(number)
    #puts "Clean Part: #{number}: #{clean_number}"
    if !clean_number.blank? && clean_number.length > MIN_MOBILE_NUMBER_LENGTH
      #puts "Nice Part: #{number}"
      return /^00491/ =~ clean_number
    end
  end
end

.remove_superflouid_chars(mobile_number) ⇒ String

Removed support characters in numbers

Returns:

  • (String)

    Mobile Number

Author:

  • dmasur



207
208
209
210
# File 'lib/mobile_number_normalizer.rb', line 207

def self.remove_superflouid_chars mobile_number
  mobile_number.gsub!(/[\(\)\.:´+*^&]/,'')
  mobile_number.gsub! /[^0-9]*/, ''
end

.replace_prefix(mobile_number) ⇒ String

Replace the different number prefix

Parameters:

  • mobile_number (String)

    Mobile Number

Returns:

  • (String)

    Mobile Number

Author:

  • dmasur



190
191
192
193
194
195
196
197
198
199
200
# File 'lib/mobile_number_normalizer.rb', line 190

def self.replace_prefix mobile_number
  mobile_number = "0#{mobile_number}" if /^1/ =~ mobile_number
  mobile_number.sub!(/^49/, '0049')
  mobile_number.sub!(/\+/, '00')
  valid_area_codes.each do |area_code|
    if mobile_number.start_with?(area_code[2..-1])
      mobile_number = "00#{mobile_number}"
    end
  end
  return mobile_number
end

.valid_area_codesObject



50
51
52
# File 'lib/mobile_number_normalizer.rb', line 50

def self.valid_area_codes
  @@valid_area_codes
end

.valid_area_codes=(new_valid_area_codes) ⇒ Object



46
47
48
# File 'lib/mobile_number_normalizer.rb', line 46

def self.valid_area_codes=(new_valid_area_codes)
  @@valid_area_codes = new_valid_area_codes
end

Instance Method Details

#clean_mobile_numberObject

Normalize mobile number

Author:

  • dmasur



93
94
95
# File 'lib/mobile_number_normalizer.rb', line 93

def clean_mobile_number
  @mobile_number = MobileNumberNormalizer.clean_number @mobile_number
end

#correct_typos_in_mobile_numberObject

Try to fix typos in the mobile number

Author:

  • dmasur



101
102
103
104
105
106
107
# File 'lib/mobile_number_normalizer.rb', line 101

def correct_typos_in_mobile_number
  @mobile_number.strip!
  @mobile_number.gsub!(/[ßo]/, '0')
  @mobile_number.gsub!(/[\(\)\.]/, '')
  @mobile_number.gsub!(/\s(\d{2})\s/, '\1')
  @mobile_number.gsub!(/[a-zA-Z\-]/, '')
end

#filter_partObject

Try to guess the right part of the mobile number

Author:

  • dmasur



113
114
115
116
117
118
119
120
121
# File 'lib/mobile_number_normalizer.rb', line 113

def filter_part
  good_guess = nil
  #puts splits
  splits.each do |split|
    good_guess = split if MobileNumberNormalizer.looks_like_a_mobile_number(split.strip)
  end
  #puts "Guess: #{good_guess}"
  @mobile_number = good_guess unless good_guess.blank?
end

#get_numberObject

Return the correct mobile number

Author:

  • dmasur



76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/mobile_number_normalizer.rb', line 76

def get_number
  org_num = @mobile_number
  #puts "Full Number: #{@mobile_number}"
  correct_typos_in_mobile_number
  #puts "Typofix: #{@mobile_number}"
  filter_part
  #puts "After Filter: #{@mobile_number}"
  clean_mobile_number
  #puts "After clean: #{@mobile_number}"
  mobile_number = "" unless has_valid_area_code?
  return @mobile_number
end

#has_valid_area_code?Boolean

Returns:

  • (Boolean)


179
180
181
182
183
# File 'lib/mobile_number_normalizer.rb', line 179

def has_valid_area_code?
  self.class.valid_area_codes.any? do |area_code|
    Regexp.new("^#{area_code}") =~ @mobile_number
  end
end

#splitsArray

Split the number in uniq Parts

Returns:

  • (Array)

    Possible Numbers

Author:

  • dmasur



128
129
130
131
# File 'lib/mobile_number_normalizer.rb', line 128

def splits
  split_chars = [/\s/,/\s{2}/, ':', ',', '/', '//', ')', '.', ' 0 ', ';']
  return split_chars.map { |split_char| @mobile_number.split(split_char) }.flatten.uniq
end