aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/number_helper/number_to_phone.rb
diff options
context:
space:
mode:
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.rb54
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
+