diff options
Diffstat (limited to 'activesupport/lib/active_support/number_helper/number_to_phone.rb')
-rw-r--r-- | activesupport/lib/active_support/number_helper/number_to_phone.rb | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/activesupport/lib/active_support/number_helper/number_to_phone.rb b/activesupport/lib/active_support/number_helper/number_to_phone.rb new file mode 100644 index 0000000000..171c2dff18 --- /dev/null +++ b/activesupport/lib/active_support/number_helper/number_to_phone.rb @@ -0,0 +1,54 @@ +require 'active_support/number_helper/number_converter' +require 'active_support/number_helper/number_to_rounded' + +module ActiveSupport + module NumberHelper + class NumberToPhoneConverter < NumberConverter + def convert + str = '' + str << country_code(opts[:country_code]) + str << convert_to_phone_number(@number.to_s.strip) + str << phone_ext(opts[:extension]) + end + + private + + def convert_to_phone_number(number) + if opts[:area_code] + convert_with_area_code(number) + else + convert_without_area_code(number) + end + end + + def convert_with_area_code(number) + number.gsub(/(\d{1,3})(\d{3})(\d{4}$)/,"(\\1) \\2#{delimiter}\\3") + end + + def convert_without_area_code(number) + number.tap { |n| + n.gsub!(/(\d{0,3})(\d{3})(\d{4})$/,"\\1#{delimiter}\\2#{delimiter}\\3") + n.slice!(0, 1) if begins_with_delimiter?(n) + } + end + + def begins_with_delimiter?(number) + number.start_with?(delimiter) && !delimiter.blank? + end + + def delimiter + opts[:delimiter] || "-" + end + + def country_code(code) + code.blank? ? "" : "+#{code}#{delimiter}" + end + + def phone_ext(ext) + ext.blank? ? "" : " x #{ext}" + end + + end + end +end + |