@@ -57,15 +57,11 @@ def initialize(number)
57
57
# # => +1.123.555.1234 x 1343
58
58
def number_to_phone ( number , options = { } )
59
59
return unless number
60
+ options = options . symbolize_keys
60
61
61
- begin
62
- Float ( number )
63
- rescue ArgumentError , TypeError
64
- raise InvalidNumberError , number
65
- end if options [ :raise ]
62
+ parse_float ( number , true ) if options [ :raise ]
66
63
67
64
number = number . to_s . strip
68
- options = options . symbolize_keys
69
65
area_code = options [ :area_code ]
70
66
delimiter = options [ :delimiter ] || "-"
71
67
extension = options [ :extension ]
@@ -75,7 +71,7 @@ def number_to_phone(number, options = {})
75
71
number . gsub! ( /(\d {1,3})(\d {3})(\d {4}$)/ , "(\\ 1) \\ 2#{ delimiter } \\ 3" )
76
72
else
77
73
number . gsub! ( /(\d {0,3})(\d {3})(\d {4})$/ , "\\ 1#{ delimiter } \\ 2#{ delimiter } \\ 3" )
78
- number . slice! ( 0 , 1 ) if number . starts_with ?( delimiter ) && !delimiter . blank?
74
+ number . slice! ( 0 , 1 ) if number . start_with ?( delimiter ) && !delimiter . blank?
79
75
end
80
76
81
77
str = [ ]
@@ -122,8 +118,7 @@ def number_to_phone(number, options = {})
122
118
# # => 1234567890,50 £
123
119
def number_to_currency ( number , options = { } )
124
120
return unless number
125
-
126
- options . symbolize_keys!
121
+ options = options . symbolize_keys
127
122
128
123
currency = translations_for ( 'currency' , options [ :locale ] )
129
124
currency [ :negative_format ] ||= "-" + currency [ :format ] if currency [ :format ]
@@ -185,12 +180,10 @@ def number_to_currency(number, options = {})
185
180
# number_to_percentage("98a", :raise => true) # => InvalidNumberError
186
181
def number_to_percentage ( number , options = { } )
187
182
return unless number
183
+ options = options . symbolize_keys
188
184
189
- options . symbolize_keys!
190
-
191
- defaults = defaults_translations ( options [ :locale ] ) . merge ( translations_for ( 'percentage' , options [ :locale ] ) )
192
-
193
- options = options . reverse_merge ( defaults )
185
+ defaults = format_translations ( 'percentage' , options [ :locale ] )
186
+ options = defaults . merge! ( options )
194
187
195
188
format = options [ :format ] || "%n%"
196
189
@@ -201,7 +194,8 @@ def number_to_percentage(number, options = {})
201
194
if options [ :raise ]
202
195
raise
203
196
else
204
- e . number . to_s . html_safe? ? format . gsub ( /%n/ , e . number ) . html_safe : format . gsub ( /%n/ , e . number )
197
+ formatted_number = format . gsub ( /%n/ , e . number )
198
+ e . number . to_s . html_safe? ? formatted_number . html_safe : formatted_number
205
199
end
206
200
end
207
201
end
@@ -231,13 +225,11 @@ def number_to_percentage(number, options = {})
231
225
#
232
226
# number_with_delimiter("112a", :raise => true) # => raise InvalidNumberError
233
227
def number_with_delimiter ( number , options = { } )
234
- options . symbolize_keys!
228
+ options = options . symbolize_keys
235
229
236
- parse_float_number ( number , options [ :raise ] ) do
237
- return number
238
- end
230
+ parse_float ( number , options [ :raise ] ) or return number
239
231
240
- options = options . reverse_merge ( defaults_translations ( options [ :locale ] ) )
232
+ options = defaults_translations ( options [ :locale ] ) . merge ( options )
241
233
242
234
parts = number . to_s . to_str . split ( '.' )
243
235
parts [ 0 ] . gsub! ( /(\d )(?=(\d \d \d )+(?!\d ))/ , "\\ 1#{ options [ :delimiter ] } " )
@@ -277,15 +269,13 @@ def number_with_delimiter(number, options = {})
277
269
# number_with_precision(1111.2345, :precision => 2, :separator => ',', :delimiter => '.')
278
270
# # => 1.111,23
279
271
def number_with_precision ( number , options = { } )
280
- options . symbolize_keys!
272
+ options = options . symbolize_keys
281
273
282
- number = parse_float_number ( number , options [ :raise ] ) do
283
- return number
284
- end
274
+ number = ( parse_float ( number , options [ :raise ] ) or return number )
285
275
286
- defaults = defaults_translations ( options [ :locale ] ) . merge ( translations_for ( 'precision' , options [ :locale ] ) )
276
+ defaults = format_translations ( 'precision' , options [ :locale ] )
277
+ options = defaults . merge! ( options )
287
278
288
- options = options . reverse_merge ( defaults ) # Allow the user to unset default values: Eg.: :significant => false
289
279
precision = options . delete :precision
290
280
significant = options . delete :significant
291
281
strip_insignificant_zeros = options . delete :strip_insignificant_zeros
@@ -346,15 +336,13 @@ def number_with_precision(number, options = {})
346
336
# number_to_human_size(1234567890123, :precision => 5) # => "1.1229 TB"
347
337
# number_to_human_size(524288000, :precision => 5) # => "500 MB"
348
338
def number_to_human_size ( number , options = { } )
349
- options . symbolize_keys!
339
+ options = options . symbolize_keys
350
340
351
- number = parse_float_number ( number , options [ :raise ] ) do
352
- return number
353
- end
341
+ number = ( parse_float ( number , options [ :raise ] ) or return number )
354
342
355
- defaults = defaults_translations ( options [ :locale ] ) . merge ( translations_for ( 'human' , options [ :locale ] ) )
343
+ defaults = format_translations ( 'human' , options [ :locale ] )
344
+ options = defaults . merge! ( options )
356
345
357
- options = options . reverse_merge ( defaults )
358
346
#for backwards compatibility with those that didn't add strip_insignificant_zeros to their locale files
359
347
options [ :strip_insignificant_zeros ] = true if not options . key? ( :strip_insignificant_zeros )
360
348
@@ -458,15 +446,13 @@ def number_to_human_size(number, options = {})
458
446
# number_to_human(0.34, :units => :distance) # => "34 centimeters"
459
447
#
460
448
def number_to_human ( number , options = { } )
461
- options . symbolize_keys!
449
+ options = options . symbolize_keys
462
450
463
- number = parse_float_number ( number , options [ :raise ] ) do
464
- return number
465
- end
451
+ number = ( parse_float ( number , options [ :raise ] ) or return number )
466
452
467
- defaults = defaults_translations ( options [ :locale ] ) . merge ( translations_for ( 'human' , options [ :locale ] ) )
453
+ defaults = format_translations ( 'human' , options [ :locale ] )
454
+ options = defaults . merge! ( options )
468
455
469
- options = options . reverse_merge ( defaults )
470
456
#for backwards compatibility with those that didn't add strip_insignificant_zeros to their locale files
471
457
options [ :strip_insignificant_zeros ] = true if not options . key? ( :strip_insignificant_zeros )
472
458
@@ -504,6 +490,10 @@ def number_to_human(number, options = {})
504
490
505
491
private
506
492
493
+ def format_translations ( namespace , locale )
494
+ defaults_translations ( locale ) . merge ( translations_for ( namespace , locale ) )
495
+ end
496
+
507
497
def defaults_translations ( locale )
508
498
I18n . translate ( :'number.format' , :locale => locale , :default => { } )
509
499
end
@@ -512,14 +502,10 @@ def translations_for(namespace, locale)
512
502
I18n . translate ( :"number.#{ namespace } .format" , :locale => locale , :default => { } )
513
503
end
514
504
515
- def parse_float_number ( number , raise_error )
505
+ def parse_float ( number , raise_error )
516
506
Float ( number )
517
507
rescue ArgumentError , TypeError
518
- if raise_error
519
- raise InvalidNumberError , number
520
- else
521
- yield
522
- end
508
+ raise InvalidNumberError , number if raise_error
523
509
end
524
510
end
525
511
end
0 commit comments