是否有一颗宝石可以规范并格式化红宝石中的美国电话号码?

时间:2011-05-06 14:14:32

标签: ruby-on-rails ruby phone-number

我使用假冒来格式化电话号码(意思是,如果我放入xxx-xxx-xxxx它会转换为字符串,并且在删除它之前还要告诉它是否有(1))。

但它确实对我们的电话号码不起作用,它是专为国际号码设计的。

是否有等价的?

感谢。

http://rubygems.org/gems/phony

6 个答案:

答案 0 :(得分:20)

今年早些时候,我回顾了一堆解析和格式化电话号码的红宝石宝石。他们分为若干组(见下文)。 TLDR:我用'手机'。它可能适合您,因为如果您的电话号码不包含,则可以指定它使用的默认国家/地区代码。

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)已经合并回主干的“手机”叉子

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 :(得分:12)

我从未见过可靠的电话号码格式化程序,因为它很难做到正确。就在你认为自己已经看到所有东西的时候,其他一些格式也会出现并破坏它。

十位数的北美数字可能是最容易格式化的,您可以使用正则表达式,但是一旦遇到扩展,您就会遇到麻烦。不过,如果你愿意的话,你可以自己破解:

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

这只会将11位和10位数字换成你想要的格式。

一些例子:

formatted_number("1 (703) 451-5115")
 # => "(703) 451-5115"
formatted_number("555-555-1212")
 # => "(555) 555-1212"

答案 2 :(得分: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行。

答案 3 :(得分:0)

#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

答案 4 :(得分:0)

答案 5 :(得分:0)

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

format_phone_numbers('555555555555')
  

“((555)555-5555”