Есть ли драгоценный камень, который нормализует и форматирует номера телефонов США в рубине?
Я использовал фальшивый формат для форматирования телефонных номеров (это означает, что если я поставлю xxx-xxx-xxxx, он преобразуется в строку, а также скажет, есть ли (1), чтобы удалить его).
Но это действительно не работает для нас номер телефона, он предназначен для международных номеров.
Существует ли эквивалент?
Спасибо.
http://rubygems.org/gems/phony
Ответы
Ответ 1
В начале этого года я просмотрел кучу рубиновых драгоценных камней, которые анализируют и форматируют телефонные номера. Они попадают в ряд групп (см. Ниже). TL;DR: Я использовал "телефон". Это может сработать для вас, потому что вы можете указать код страны по умолчанию, который он использует, если ваш номер телефона не включает его.
1) Ориентированный на США:
big-foney (0.1.4)
phone_wrangler (0.1.3)
simple_phone_number (0.1.9)
2) зависит от рельсов или active_record:
phone_number (1.2.0)
validates_and_formats_phones (0.0.7)
3) вилки "телефона", которые были объединены обратно в багажник:
elskwid-phone (0.9.9.4)
tfe-phone (0.9.9.1)
4) полагается на то, что вы заранее знаете регион
фона (0.1.0)
5) Вид почти работает для меня
телефон (0.9.9.3)
6) не содержит подстроку "телефон" в названии драгоценного камня (изменить: я вижу, что вы пробовали этот)
phony (1.6.1)
Эти группировки могут быть несколько несправедливыми или устаревшими, поэтому не стесняйтесь комментировать. Должен признаться, я был немного расстроен в то время, когда многие люди частично изобрели это колесо.
Ответ 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"
Ответ 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 && 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 various comments
Ответ 5
Вы можете использовать метод rails number_to_phone
см. здесь:
http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_to_phone