Есть ли драгоценный камень, который нормализует и форматирует телефонные номера США в ruby?

#ruby-on-rails #ruby #phone-number

#ruby-on-rails #ruby #phone-number

Вопрос:

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

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

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

Спасибо.

http://rubygems.org/gems/phony

Комментарии:

1. О написании метода в классе String не может быть и речи?

2. как бы мне это сделать — можно ли это добавить в lib-файл?

3. Да, как класс String.rb затем просто определите класс String, а затем ваш метод «def convert_to_phone_number»

4. @kyle — хм, каким на самом деле был бы метод для прохождения логики … иногда значение равно xxx-xxxx-xxxx, но я, вероятно, хотел бы нормализовать до xxxxxxxx…..

5. Но тогда, когда я хочу отобразить, я бы хотел, чтобы это было в форме xxx-xxx-xxxx … это имеет смысл?

Ответ №1:

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

1) Ориентированный на США:

big-phoney (0.1.4)
phone_wrangler (0.1.3)
simple_phone_number (0.1.9)

2) зависит от rails или active_record:

phone_number (1.2.0)
validates_and_formats_phones (0.0.7)

3) вилки «phone», которые были объединены обратно в магистраль:

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

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

phoney (0.1.0)

5) У меня почти работает

телефон (0.9.9.3)

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

фальшивый (1.6.1)

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

Комментарии:

1. phone Драгоценный камень выглядит немного бездействующим для меня — несколько запросов на извлечение, на которые не было ответа. Вместо этого я использовал этот fork: github.com/g1smd/carrphone поскольку мне нужно правильно указать телефонные номера в Великобритании.

2. Обновлено с учетом списка опций для изучения.

Ответ №2:

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

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

 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"
  

Комментарии:

1. что произойдет, если ему присвоено значение 4155551212?

2. Вы могли бы попробовать это и выяснить сами, конечно! Пока присутствуют 11 или 10 цифр, нецифровые символы игнорируются, он будет форматироваться таким же образом.

3. о … нецифровые символы игнорируются… Я думаю, мне нужно больше узнать о regex и о том, что вы с ним сделали, вот почему у меня проблемы… Я предполагаю, что D для не цифр?

4. s это пробелы, S это не пробелы, поэтому версия верхнего регистра для нескольких вещей противоположна. Смотрите Rubular для получения дополнительных примеров и инструмента, который поможет.

5. В моем ruby 1.9.3 мне пришлось вставить digits = digits.join перед строкой '(%s) %s-%s' % [ digits[0,3], digits[3,3], digits[6,4] ]

Ответ №3:

Я написал это регулярное выражение, чтобы сопоставить телефонные номера 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 строку.

Ответ №4:

 #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 amp;amp; 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
  

Комментарии:

1. @kyle Я вижу, так что это будет использоваться для нормализации в базе данных… тогда я бы использовал другой ответ для отображения (чтобы отображать его красиво, как xxx-xxx-xxxx>

2. Хотя и не очень СУХОЙ… Я немного обновлю здесь кое-что получше

3. Понятно .. спасибо… что было бы лучшим способом… Я думал, что это должно быть в базе данных таким же образом, а затем позвольте мне отформатировать, я думаю, это работает, позвольте мне поиграть с этим, спасибо.

4. @Kyle — хм, я попробовал это, и я получаю сообщение об ошибке в моем контроллере, в котором говорится, что не удается найти метод ‘convert_to_phone’ — я снова перезапущу сервер… Я поместил его в lib / папку….

5. Вот полная ошибка: я попытался изменить ее на модуль для включения в модель, но по-прежнему ничего: неопределенный метод `convert_to_phone’ для «15104762000»:String

Ответ №5:

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

смотрите здесь: http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_to_phone

Ответ №6:

 def format_phone_numbers(n)
    "(#{n[-10..-8]}) #{n[-7..-5]}-#{n[-4..-1]}"
end

format_phone_numbers('555555555555')
  

«(555) 555-5555»