Module: Padrino::Helpers::NumberHelpers
- Defined in:
- lib/padrino-helpers/number_helpers.rb
Overview
Provides methods for converting numbers into formatted strings. Methods are provided for phone numbers, currency, percentage, precision, positional notation, and file size.
Adapted from Rails Number Helpers.
Constant Summary collapse
- STORAGE_UNITS =
The units available for storage formatting.
[:byte, :kb, :mb, :gb, :tb].freeze
Instance Method Summary collapse
-
#number_to_currency(number, options = {}) ⇒ String
Formats a
number
into a currency string (e.g., $13.65). -
#number_to_human_size(number, options = {}) ⇒ String
Formats the bytes in
size
into a more understandable representation (e.g., giving it 1500 yields 1.5 KB). -
#number_to_percentage(number, options = {}) ⇒ String
Formats a
number
as a percentage string (e.g., 65%). -
#number_with_delimiter(number, options = {}) ⇒ String
Formats a
number
with grouped thousands usingdelimiter
(e.g., 12,324). -
#number_with_precision(number, options = {}) ⇒ String
Formats a
number
with the specified level of:precision
(e.g., 112.32 has a precision of 2).
Instance Method Details
#number_to_currency(number, options = {}) ⇒ String
Formats a number
into a currency string (e.g., $13.65). You can customize the format in the options
hash.
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/padrino-helpers/number_helpers.rb', line 43 def number_to_currency(number, = {}) = Utils.symbolize_keys() defaults = I18n.translate(:'number.format', :locale => [:locale], :raise => true) rescue {} currency = I18n.translate(:'number.currency.format', :locale => [:locale], :raise => true) rescue {} defaults = defaults.merge(currency) precision = [:precision] || defaults[:precision] unit = [:unit] || defaults[:unit] separator = [:separator] || defaults[:separator] delimiter = [:delimiter] || defaults[:delimiter] format = [:format] || defaults[:format] separator = '' if precision == 0 begin format.gsub(/%n/, number_with_precision(number, :precision => precision, :delimiter => delimiter, :separator => separator) ).gsub(/%u/, unit) rescue number end end |
#number_to_human_size(number, options = {}) ⇒ String
Formats the bytes in size
into a more understandable representation (e.g., giving it 1500 yields 1.5 KB). This method is useful for reporting file sizes to users. This method returns nil if size
cannot be converted into a number. You can customize the format in the options
hash.
237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 |
# File 'lib/padrino-helpers/number_helpers.rb', line 237 def number_to_human_size(number, *args) return nil if number.nil? = args.last.is_a?(Hash) ? Utils.symbolize_keys(args.pop) : {} defaults = I18n.translate(:'number.format', :locale => [:locale], :raise => true) rescue {} human = I18n.translate(:'number.human.format', :locale => [:locale], :raise => true) rescue {} defaults = defaults.merge(human) precision ||= ([:precision] || defaults[:precision]) separator ||= ([:separator] || defaults[:separator]) delimiter ||= ([:delimiter] || defaults[:delimiter]) storage_units_format = I18n.translate(:'number.human.storage_units.format', :locale => [:locale], :raise => true) if number.to_i < 1024 unit = I18n.translate(:'number.human.storage_units.units.byte', :locale => [:locale], :count => number.to_i, :raise => true) storage_units_format.gsub(/%n/, number.to_i.to_s).gsub(/%u/, unit) else max_exp = STORAGE_UNITS.size - 1 number = Float(number) exponent = (Math.log(number) / Math.log(1024)).to_i # Convert to base 1024 exponent = max_exp if exponent > max_exp # we need this to avoid overflow for the highest unit number /= 1024 ** exponent unit_key = STORAGE_UNITS[exponent] unit = I18n.translate(:"number.human.storage_units.units.#{unit_key}", :locale => [:locale], :count => number, :raise => true) begin escaped_separator = Regexp.escape(separator) formatted_number = number_with_precision(number, :precision => precision, :separator => separator, :delimiter => delimiter ).sub(/(#{escaped_separator})(\d*[1-9])?0+\z/, '\1\2').sub(/#{escaped_separator}\z/, '') storage_units_format.gsub(/%n/, formatted_number).gsub(/%u/, unit) rescue number end end end |
#number_to_percentage(number, options = {}) ⇒ String
Formats a number
as a percentage string (e.g., 65%). You can customize the format in the options
hash.
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# File 'lib/padrino-helpers/number_helpers.rb', line 91 def number_to_percentage(number, = {}) = Utils.symbolize_keys() defaults = I18n.translate(:'number.format', :locale => [:locale], :raise => true) rescue {} percentage = I18n.translate(:'number.percentage.format', :locale => [:locale], :raise => true) rescue {} defaults = defaults.merge(percentage) precision = [:precision] || defaults[:precision] separator = [:separator] || defaults[:separator] delimiter = [:delimiter] || defaults[:delimiter] begin number_with_precision(number, :precision => precision, :separator => separator, :delimiter => delimiter) + "%" rescue number end end |
#number_with_delimiter(number, options = {}) ⇒ String
Formats a number
with grouped thousands using delimiter
(e.g., 12,324). You can customize the format in the options
hash.
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
# File 'lib/padrino-helpers/number_helpers.rb', line 136 def number_with_delimiter(number, *args) = args.last.is_a?(Hash) ? Utils.symbolize_keys(args.pop) : {} defaults = I18n.translate(:'number.format', :locale => [:locale], :raise => true) rescue {} delimiter ||= ([:delimiter] || defaults[:delimiter]) separator ||= ([:separator] || defaults[:separator]) begin parts = number.to_s.split('.') parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}") parts.join(separator) rescue number end end |
#number_with_precision(number, options = {}) ⇒ String
Formats a number
with the specified level of :precision
(e.g., 112.32 has a precision of 2). You can customize the format in the options
hash.
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
# File 'lib/padrino-helpers/number_helpers.rb', line 179 def number_with_precision(number, *args) = args.last.is_a?(Hash) ? Utils.symbolize_keys(args.pop) : {} defaults = I18n.translate(:'number.format', :locale => [:locale], :raise => true) rescue {} precision_defaults = I18n.translate(:'number.precision.format', :locale => [:locale], :raise => true) rescue {} defaults = defaults.merge(precision_defaults) precision ||= ([:precision] || defaults[:precision]) separator ||= ([:separator] || defaults[:separator]) delimiter ||= ([:delimiter] || defaults[:delimiter]) begin rounded_number = (Float(number) * (10 ** precision)).round.to_f / 10 ** precision number_with_delimiter("%01.#{precision}f" % rounded_number, :separator => separator, :delimiter => delimiter) rescue number end end |