Есть ли жемчужина, которая нормализует и форматирует номера телефонов США в рубине? - PullRequest
13 голосов
/ 06 мая 2011

Я использовал phony для форматирования телефонных номеров (то есть, если я введу xxx-xxx-xxxx, он будет преобразован в строку, а также сообщит, есть ли (1) перед тем, как удалить ее).

Но для нас этот номер телефона действительно не работает, он предназначен для международных номеров.

Есть ли эквивалент?

Спасибо.

http://rubygems.org/gems/phony

Ответы [ 5 ]

20 голосов
/ 08 декабря 2011

Ранее в этом году я рассмотрел кучу рубиновых самоцветов, которые анализируют и форматируют телефонные номера.Они делятся на несколько групп (см. Ниже).TLDR: я использовал «телефон».Он может работать для вас, потому что вы можете указать код страны по умолчанию, который он использует, если ваш номер телефона не содержит его.

1) В США:

большой телефон (0.1.4)
phone_wrangler (0.1.3)
simple_phone_number (0.1.9)

2) зависит от рельсов или active_record:

номер_телефона (1.2.0)
validates_and_formats_phones (0.0.7)

3) вилки «телефона», которые были объединены обратно в транк:

elskwid-phone (0.9.9.4)
tfe-phone (0.9.9.1)

4) полагается на то, что вы заранее знаете регион

phoney (0.1.0)

5) Вид почти работает для меня

Телефон (0.9.9.3)

6)не содержит подстроку 'phone' в имени драгоценного камня (редактировать: я вижу, вы пробовали это)

phony (1.6.1)

Эти группировки могут быть несколько несправедливымидаты, так что не стесняйтесь комментировать.Я должен признать, что в то время я был немного разочарован тем, сколько людей частично изобрели это колесо.

12 голосов
/ 06 мая 2011

Я никогда не видел такого надежного средства форматирования телефонных номеров, потому что так сложно все сделать правильно.Просто когда вы думаете, что видели все, появляется какой-то другой формат и портит его.

Десятизначные североамериканские числа, пожалуй, легче всего форматировать, вы можете использовать регулярное выражение, но как только вы столкнетесьРасширения у вас проблемы.Тем не менее, вы можете взломать его самостоятельно, если хотите:

def formatted_number(number)
  digits = number.gsub(/\D/, '').split(//)

  if (digits.length == 11 and digits[0] == '1')
    # Strip leading 1
    digits.shift
  end

  if (digits.length == 10)
    # Rejoin for latest Ruby, remove next line if old Ruby
    digits = digits.join
    '(%s) %s-%s' % [ digits[0,3], digits[3,3], digits[6,4] ]
  end
end

Это просто приведет к тому, что одиннадцатизначные и десятизначные числа получатся в нужном формате.

Некоторые примеры:

formatted_number("1 (703) 451-5115")
 # => "(703) 451-5115"
formatted_number("555-555-1212")
 # => "(555) 555-1212"
3 голосов
/ 07 мая 2011

Я написал это регулярное выражение, чтобы сопоставить номера телефонов NANPA с некоторыми соглашениями (например, для расширений) для PHP (слава богу, что времена прошли) и преобразовал его в валидатор Rails несколько месяцев назад для проекта. Это прекрасно работает для меня, но это более прагматично, чем строго по спецификации.

# app/validators/phone_number_validator.rb
class PhoneNumberValidator < ActiveModel::EachValidator
  @@regex = %r{\A(?:1(?:[. -])?)?(?:\((?=\d{3}\)))?([2-9]\d{2})(?:(?<=\(\d{3})\))? ?(?:(?<=\d{3})[.-])?([2-9]\d{2})[. -]?(\d{4})(?: (?:ext|x)\.? ?(\d{1,5}))?\Z}

  def validate_each (object, attribute, value)
    if m = value.match(@@regex)
      # format the phone number consistently
      object.send("#{attribute}=", "(#{m[1]}) #{m[2]}-#{m[3]}")
    else
      object.errors[attribute] << (options[:message] || "is not an appropriately formatted phone number")
    end
  end
end

# app/models/foobar.rb
class Foobar < ActiveRecord::Base
  validates :phone, phone_number: true
end

Сохраненный / выведенный формат выглядит следующим образом: (888) 888-8888. В настоящее время вывод снимает расширение, потому что оно мне не нужно. Вы можете добавить его обратно и довольно легко изменить формат (см. Строку object.send.

0 голосов
/ 29 мая 2014

Вы можете использовать метод rails number_to_phone

см. Здесь: http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_to_phone

0 голосов
/ 07 мая 2011
#RAILS_ROOT/lib/String.rb
class String
  def convert_to_phone
    number = self.gsub(/\D/, '').split(//)

    #US 11-digit numbers
    number = number.drop(1) if (number.count == 11 && number[0] == 1)

    #US 10-digit numbers
    number.to_s if (number.count == 10)

  end


  def format_phone
    return "#{self[0,3]}-#{self[3,3]}-#{self[6,4]}"
  end
end

"585-343-2070".convert_to_phone 
=> "5853432070"

"5853432070".convert_to_phone
=> "5853432070"

"1(585)343-2070".convert_to_phone.format_phone
=> "585-343-2070"

##Everything formatted as requested in Asker's various comments
...