activesupport 7.0.10 → 7.1.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +703 -361
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/lib/active_support/actionable_error.rb +3 -1
  6. data/lib/active_support/array_inquirer.rb +2 -0
  7. data/lib/active_support/backtrace_cleaner.rb +25 -5
  8. data/lib/active_support/benchmarkable.rb +1 -0
  9. data/lib/active_support/builder.rb +1 -1
  10. data/lib/active_support/cache/coder.rb +153 -0
  11. data/lib/active_support/cache/entry.rb +128 -0
  12. data/lib/active_support/cache/file_store.rb +37 -10
  13. data/lib/active_support/cache/mem_cache_store.rb +84 -68
  14. data/lib/active_support/cache/memory_store.rb +76 -26
  15. data/lib/active_support/cache/null_store.rb +6 -0
  16. data/lib/active_support/cache/redis_cache_store.rb +126 -131
  17. data/lib/active_support/cache/serializer_with_fallback.rb +175 -0
  18. data/lib/active_support/cache/strategy/local_cache.rb +20 -8
  19. data/lib/active_support/cache.rb +304 -246
  20. data/lib/active_support/callbacks.rb +38 -18
  21. data/lib/active_support/concern.rb +4 -2
  22. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +42 -3
  23. data/lib/active_support/concurrency/null_lock.rb +13 -0
  24. data/lib/active_support/configurable.rb +10 -0
  25. data/lib/active_support/core_ext/array/conversions.rb +2 -1
  26. data/lib/active_support/core_ext/array.rb +0 -1
  27. data/lib/active_support/core_ext/class/attribute.rb +1 -0
  28. data/lib/active_support/core_ext/class/subclasses.rb +13 -10
  29. data/lib/active_support/core_ext/date/conversions.rb +1 -0
  30. data/lib/active_support/core_ext/date.rb +0 -1
  31. data/lib/active_support/core_ext/date_and_time/calculations.rb +10 -0
  32. data/lib/active_support/core_ext/date_time/conversions.rb +6 -2
  33. data/lib/active_support/core_ext/date_time.rb +0 -1
  34. data/lib/active_support/core_ext/digest/uuid.rb +1 -10
  35. data/lib/active_support/core_ext/enumerable.rb +3 -75
  36. data/lib/active_support/core_ext/erb/util.rb +196 -0
  37. data/lib/active_support/core_ext/hash/conversions.rb +1 -1
  38. data/lib/active_support/core_ext/module/attribute_accessors.rb +6 -0
  39. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +34 -16
  40. data/lib/active_support/core_ext/module/concerning.rb +6 -6
  41. data/lib/active_support/core_ext/module/delegation.rb +40 -11
  42. data/lib/active_support/core_ext/module/deprecation.rb +15 -12
  43. data/lib/active_support/core_ext/module/introspection.rb +0 -1
  44. data/lib/active_support/core_ext/numeric/bytes.rb +9 -0
  45. data/lib/active_support/core_ext/numeric/conversions.rb +2 -0
  46. data/lib/active_support/core_ext/numeric.rb +0 -1
  47. data/lib/active_support/core_ext/object/deep_dup.rb +16 -0
  48. data/lib/active_support/core_ext/object/duplicable.rb +15 -24
  49. data/lib/active_support/core_ext/object/inclusion.rb +13 -5
  50. data/lib/active_support/core_ext/object/instance_variables.rb +22 -12
  51. data/lib/active_support/core_ext/object/json.rb +14 -8
  52. data/lib/active_support/core_ext/object/with.rb +44 -0
  53. data/lib/active_support/core_ext/object/with_options.rb +4 -4
  54. data/lib/active_support/core_ext/object.rb +1 -0
  55. data/lib/active_support/core_ext/pathname/blank.rb +16 -0
  56. data/lib/active_support/core_ext/pathname/existence.rb +2 -0
  57. data/lib/active_support/core_ext/pathname.rb +1 -0
  58. data/lib/active_support/core_ext/range/conversions.rb +28 -7
  59. data/lib/active_support/core_ext/range/overlap.rb +12 -0
  60. data/lib/active_support/core_ext/range.rb +1 -2
  61. data/lib/active_support/core_ext/securerandom.rb +24 -12
  62. data/lib/active_support/core_ext/string/filters.rb +20 -14
  63. data/lib/active_support/core_ext/string/indent.rb +1 -1
  64. data/lib/active_support/core_ext/string/inflections.rb +16 -5
  65. data/lib/active_support/core_ext/string/output_safety.rb +38 -174
  66. data/lib/active_support/core_ext/thread/backtrace/location.rb +12 -0
  67. data/lib/active_support/core_ext/time/calculations.rb +18 -2
  68. data/lib/active_support/core_ext/time/conversions.rb +2 -2
  69. data/lib/active_support/core_ext/time/zones.rb +4 -4
  70. data/lib/active_support/core_ext/time.rb +0 -1
  71. data/lib/active_support/current_attributes.rb +15 -6
  72. data/lib/active_support/dependencies/autoload.rb +17 -12
  73. data/lib/active_support/deprecation/behaviors.rb +55 -34
  74. data/lib/active_support/deprecation/constant_accessor.rb +5 -4
  75. data/lib/active_support/deprecation/deprecators.rb +104 -0
  76. data/lib/active_support/deprecation/disallowed.rb +3 -5
  77. data/lib/active_support/deprecation/instance_delegator.rb +31 -4
  78. data/lib/active_support/deprecation/method_wrappers.rb +6 -23
  79. data/lib/active_support/deprecation/proxy_wrappers.rb +37 -22
  80. data/lib/active_support/deprecation/reporting.rb +40 -29
  81. data/lib/active_support/deprecation.rb +32 -5
  82. data/lib/active_support/deprecator.rb +7 -0
  83. data/lib/active_support/descendants_tracker.rb +104 -132
  84. data/lib/active_support/duration/iso8601_serializer.rb +0 -2
  85. data/lib/active_support/duration.rb +2 -1
  86. data/lib/active_support/encrypted_configuration.rb +30 -9
  87. data/lib/active_support/encrypted_file.rb +8 -3
  88. data/lib/active_support/environment_inquirer.rb +22 -2
  89. data/lib/active_support/error_reporter/test_helper.rb +15 -0
  90. data/lib/active_support/error_reporter.rb +121 -35
  91. data/lib/active_support/execution_wrapper.rb +4 -4
  92. data/lib/active_support/file_update_checker.rb +4 -2
  93. data/lib/active_support/fork_tracker.rb +10 -2
  94. data/lib/active_support/gem_version.rb +4 -4
  95. data/lib/active_support/gzip.rb +2 -0
  96. data/lib/active_support/hash_with_indifferent_access.rb +35 -17
  97. data/lib/active_support/i18n.rb +1 -1
  98. data/lib/active_support/i18n_railtie.rb +20 -13
  99. data/lib/active_support/inflector/inflections.rb +2 -0
  100. data/lib/active_support/inflector/methods.rb +23 -11
  101. data/lib/active_support/inflector/transliterate.rb +3 -1
  102. data/lib/active_support/isolated_execution_state.rb +26 -22
  103. data/lib/active_support/json/decoding.rb +2 -1
  104. data/lib/active_support/json/encoding.rb +25 -43
  105. data/lib/active_support/key_generator.rb +9 -1
  106. data/lib/active_support/lazy_load_hooks.rb +6 -4
  107. data/lib/active_support/locale/en.yml +2 -0
  108. data/lib/active_support/log_subscriber.rb +78 -33
  109. data/lib/active_support/logger.rb +1 -1
  110. data/lib/active_support/logger_thread_safe_level.rb +9 -22
  111. data/lib/active_support/message_encryptor.rb +197 -53
  112. data/lib/active_support/message_encryptors.rb +140 -0
  113. data/lib/active_support/message_pack/cache_serializer.rb +23 -0
  114. data/lib/active_support/message_pack/extensions.rb +292 -0
  115. data/lib/active_support/message_pack/serializer.rb +63 -0
  116. data/lib/active_support/message_pack.rb +50 -0
  117. data/lib/active_support/message_verifier.rb +212 -93
  118. data/lib/active_support/message_verifiers.rb +134 -0
  119. data/lib/active_support/messages/codec.rb +65 -0
  120. data/lib/active_support/messages/metadata.rb +111 -45
  121. data/lib/active_support/messages/rotation_coordinator.rb +93 -0
  122. data/lib/active_support/messages/rotator.rb +34 -32
  123. data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
  124. data/lib/active_support/multibyte/chars.rb +2 -0
  125. data/lib/active_support/multibyte/unicode.rb +9 -37
  126. data/lib/active_support/notifications/fanout.rb +239 -81
  127. data/lib/active_support/notifications/instrumenter.rb +79 -30
  128. data/lib/active_support/notifications.rb +1 -1
  129. data/lib/active_support/number_helper/number_converter.rb +5 -14
  130. data/lib/active_support/number_helper/number_to_currency_converter.rb +6 -6
  131. data/lib/active_support/number_helper/number_to_human_size_converter.rb +3 -3
  132. data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -0
  133. data/lib/active_support/number_helper.rb +318 -379
  134. data/lib/active_support/ordered_hash.rb +3 -3
  135. data/lib/active_support/ordered_options.rb +14 -0
  136. data/lib/active_support/parameter_filter.rb +84 -69
  137. data/lib/active_support/proxy_object.rb +2 -0
  138. data/lib/active_support/railtie.rb +33 -21
  139. data/lib/active_support/reloader.rb +12 -4
  140. data/lib/active_support/rescuable.rb +2 -0
  141. data/lib/active_support/secure_compare_rotator.rb +16 -9
  142. data/lib/active_support/string_inquirer.rb +3 -1
  143. data/lib/active_support/subscriber.rb +9 -27
  144. data/lib/active_support/syntax_error_proxy.rb +49 -0
  145. data/lib/active_support/tagged_logging.rb +60 -24
  146. data/lib/active_support/test_case.rb +153 -6
  147. data/lib/active_support/testing/assertions.rb +26 -10
  148. data/lib/active_support/testing/autorun.rb +0 -2
  149. data/lib/active_support/testing/constant_stubbing.rb +32 -0
  150. data/lib/active_support/testing/deprecation.rb +25 -25
  151. data/lib/active_support/testing/error_reporter_assertions.rb +108 -0
  152. data/lib/active_support/testing/isolation.rb +1 -1
  153. data/lib/active_support/testing/method_call_assertions.rb +21 -8
  154. data/lib/active_support/testing/parallelize_executor.rb +8 -3
  155. data/lib/active_support/testing/stream.rb +1 -1
  156. data/lib/active_support/testing/strict_warnings.rb +38 -0
  157. data/lib/active_support/testing/time_helpers.rb +32 -14
  158. data/lib/active_support/time_with_zone.rb +4 -14
  159. data/lib/active_support/values/time_zone.rb +9 -7
  160. data/lib/active_support/version.rb +1 -1
  161. data/lib/active_support/xml_mini/jdom.rb +3 -10
  162. data/lib/active_support/xml_mini/nokogiri.rb +1 -1
  163. data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
  164. data/lib/active_support/xml_mini/rexml.rb +1 -1
  165. data/lib/active_support/xml_mini.rb +2 -2
  166. data/lib/active_support.rb +13 -3
  167. metadata +48 -58
  168. data/lib/active_support/core_ext/array/deprecated_conversions.rb +0 -25
  169. data/lib/active_support/core_ext/date/deprecated_conversions.rb +0 -40
  170. data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +0 -36
  171. data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +0 -60
  172. data/lib/active_support/core_ext/range/deprecated_conversions.rb +0 -36
  173. data/lib/active_support/core_ext/range/include_time_with_zone.rb +0 -5
  174. data/lib/active_support/core_ext/range/overlaps.rb +0 -36
  175. data/lib/active_support/core_ext/time/deprecated_conversions.rb +0 -73
  176. data/lib/active_support/core_ext/uri.rb +0 -5
  177. data/lib/active_support/per_thread_registry.rb +0 -65
@@ -18,438 +18,377 @@ module ActiveSupport
18
18
 
19
19
  extend self
20
20
 
21
- # Formats +number+ into a phone number.
22
- #
23
- # number_to_phone(5551234) # => "555-1234"
24
- # number_to_phone("5551234") # => "555-1234"
25
- # number_to_phone(1235551234) # => "123-555-1234"
26
- # number_to_phone("12x34") # => "12x34"
27
- #
28
- # number_to_phone(1235551234, delimiter: ".", country_code: 1, extension: 1343)
29
- # # => "+1.123.555.1234 x 1343"
21
+ # Formats a +number+ into a phone number (US by default e.g., (555)
22
+ # 123-9876). You can customize the format in the +options+ hash.
30
23
  #
31
24
  # ==== Options
32
25
  #
33
- # [+:area_code+]
34
- # Whether to use parentheses for the area code. Defaults to false.
35
- #
36
- # number_to_phone(1235551234, area_code: true)
37
- # # => "(123) 555-1234"
38
- #
39
- # [+:delimiter+]
40
- # The digit group delimiter to use. Defaults to <tt>"-"</tt>.
41
- #
42
- # number_to_phone(1235551234, delimiter: " ")
43
- # # => "123 555 1234"
44
- #
45
- # [+:country_code+]
46
- # A country code to prepend.
47
- #
48
- # number_to_phone(1235551234, country_code: 1)
49
- # # => "+1-123-555-1234"
50
- #
51
- # [+:extension+]
52
- # An extension to append.
53
- #
54
- # number_to_phone(1235551234, extension: 555)
55
- # # => "123-555-1234 x 555"
56
- #
57
- # [+:pattern+]
58
- # A regexp that specifies how the digits should be grouped. The first
59
- # three captures from the regexp are treated as digit groups.
60
- #
61
- # number_to_phone(13312345678, pattern: /(\d{3})(\d{4})(\d{4})$/)
62
- # # => "133-1234-5678"
63
- # number_to_phone(75561234567, pattern: /(\d{1,4})(\d{4})(\d{4})$/, area_code: true)
64
- # # => "(755) 6123-4567"
26
+ # * <tt>:area_code</tt> - Adds parentheses around the area code.
27
+ # * <tt>:delimiter</tt> - Specifies the delimiter to use
28
+ # (defaults to "-").
29
+ # * <tt>:extension</tt> - Specifies an extension to add to the
30
+ # end of the generated number.
31
+ # * <tt>:country_code</tt> - Sets the country code for the phone
32
+ # number.
33
+ # * <tt>:pattern</tt> - Specifies how the number is divided into three
34
+ # groups with the custom regexp to override the default format.
35
+ # ==== Examples
36
+ #
37
+ # number_to_phone(5551234) # => "555-1234"
38
+ # number_to_phone('5551234') # => "555-1234"
39
+ # number_to_phone(1235551234) # => "123-555-1234"
40
+ # number_to_phone(1235551234, area_code: true) # => "(123) 555-1234"
41
+ # number_to_phone(1235551234, delimiter: ' ') # => "123 555 1234"
42
+ # number_to_phone(1235551234, area_code: true, extension: 555) # => "(123) 555-1234 x 555"
43
+ # number_to_phone(1235551234, country_code: 1) # => "+1-123-555-1234"
44
+ # number_to_phone('123a456') # => "123a456"
45
+ #
46
+ # number_to_phone(1235551234, country_code: 1, extension: 1343, delimiter: '.')
47
+ # # => "+1.123.555.1234 x 1343"
65
48
  #
49
+ # number_to_phone(75561234567, pattern: /(\d{1,4})(\d{4})(\d{4})$/, area_code: true)
50
+ # # => "(755) 6123-4567"
51
+ # number_to_phone(13312345678, pattern: /(\d{3})(\d{4})(\d{4})$/)
52
+ # # => "133-1234-5678"
66
53
  def number_to_phone(number, options = {})
67
54
  NumberToPhoneConverter.convert(number, options)
68
55
  end
69
56
 
70
- # Formats a +number+ into a currency string.
71
- #
72
- # number_to_currency(1234567890.50) # => "$1,234,567,890.50"
73
- # number_to_currency(1234567890.506) # => "$1,234,567,890.51"
74
- # number_to_currency("12x34") # => "$12x34"
75
- #
76
- # number_to_currency(1234567890.50, unit: "&pound;", separator: ",", delimiter: "")
77
- # # => "&pound;1234567890,50"
57
+ # Formats a +number+ into a currency string (e.g., $13.65). You
58
+ # can customize the format in the +options+ hash.
78
59
  #
79
60
  # The currency unit and number formatting of the current locale will be used
80
- # unless otherwise specified via options. No currency conversion is
81
- # performed. If the user is given a way to change their locale, they will
61
+ # unless otherwise specified in the provided options. No currency conversion
62
+ # is performed. If the user is given a way to change their locale, they will
82
63
  # also be able to change the relative value of the currency displayed with
83
64
  # this helper. If your application will ever support multiple locales, you
84
- # may want to specify a constant +:locale+ option or consider using a
85
- # library capable of currency conversion.
65
+ # may want to specify a constant <tt>:locale</tt> option or consider
66
+ # using a library capable of currency conversion.
86
67
  #
87
68
  # ==== Options
88
69
  #
89
- # [+:locale+]
90
- # The locale to use for formatting. Defaults to the current locale.
91
- #
92
- # number_to_currency(1234567890.506, locale: :fr)
93
- # # => "1 234 567 890,51 €"
94
- #
95
- # [+:precision+]
96
- # The level of precision. Defaults to 2.
97
- #
98
- # number_to_currency(1234567890.123, precision: 3) # => "$1,234,567,890.123"
99
- # number_to_currency(0.456789, precision: 0) # => "$0"
100
- #
101
- # [+:round_mode+]
102
- # Specifies how rounding is performed. See +BigDecimal.mode+. Defaults to
103
- # +:default+.
104
- #
105
- # number_to_currency(1234567890.01, precision: 0, round_mode: :up)
106
- # # => "$1,234,567,891"
107
- #
108
- # [+:unit+]
109
- # The denomination of the currency. Defaults to <tt>"$"</tt>.
110
- #
111
- # [+:separator+]
112
- # The decimal separator. Defaults to <tt>"."</tt>.
113
- #
114
- # [+:delimiter+]
115
- # The thousands delimiter. Defaults to <tt>","</tt>.
116
- #
117
- # [+:format+]
118
- # The format for non-negative numbers. <tt>%u</tt> represents the currency,
119
- # and <tt>%n</tt> represents the number. Defaults to <tt>"%u%n"</tt>.
120
- #
121
- # number_to_currency(1234567890.50, format: "%n %u")
122
- # # => "1,234,567,890.50 $"
123
- #
124
- # [+:negative_format+]
125
- # The format for negative numbers. <tt>%u</tt> and <tt>%n</tt> behave the
126
- # same as in +:format+, but <tt>%n</tt> represents the absolute value of
127
- # the number. Defaults to the value of +:format+ prepended with <tt>-</tt>.
128
- #
129
- # number_to_currency(-1234567890.50, negative_format: "(%u%n)")
130
- # # => "($1,234,567,890.50)"
131
- #
132
- # [+:strip_insignificant_zeros+]
133
- # Whether to remove insignificant zeros after the decimal separator.
134
- # Defaults to false.
135
- #
136
- # number_to_currency(1234567890.50, strip_insignificant_zeros: true)
137
- # # => "$1,234,567,890.5"
138
- #
70
+ # * <tt>:locale</tt> - Sets the locale to be used for formatting
71
+ # (defaults to current locale).
72
+ # * <tt>:precision</tt> - Sets the level of precision (defaults
73
+ # to 2).
74
+ # * <tt>:round_mode</tt> - Determine how rounding is performed
75
+ # (defaults to :default. See BigDecimal::mode)
76
+ # * <tt>:unit</tt> - Sets the denomination of the currency
77
+ # (defaults to "$").
78
+ # * <tt>:separator</tt> - Sets the separator between the units
79
+ # (defaults to ".").
80
+ # * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults
81
+ # to ",").
82
+ # * <tt>:format</tt> - Sets the format for non-negative numbers
83
+ # (defaults to "%u%n"). Fields are <tt>%u</tt> for the
84
+ # currency, and <tt>%n</tt> for the number.
85
+ # * <tt>:negative_format</tt> - Sets the format for negative
86
+ # numbers (defaults to prepending a hyphen to the formatted
87
+ # number given by <tt>:format</tt>). Accepts the same fields
88
+ # than <tt>:format</tt>, except <tt>%n</tt> is here the
89
+ # absolute value of the number.
90
+ # * <tt>:strip_insignificant_zeros</tt> - If +true+ removes
91
+ # insignificant zeros after the decimal separator (defaults to
92
+ # +false+).
93
+ #
94
+ # ==== Examples
95
+ #
96
+ # number_to_currency(1234567890.50) # => "$1,234,567,890.50"
97
+ # number_to_currency(1234567890.506) # => "$1,234,567,890.51"
98
+ # number_to_currency(1234567890.506, precision: 3) # => "$1,234,567,890.506"
99
+ # number_to_currency(1234567890.506, locale: :fr) # => "1 234 567 890,51 €"
100
+ # number_to_currency('123a456') # => "$123a456"
101
+ #
102
+ # number_to_currency(-0.456789, precision: 0)
103
+ # # => "$0"
104
+ # number_to_currency(-1234567890.50, negative_format: '(%u%n)')
105
+ # # => "($1,234,567,890.50)"
106
+ # number_to_currency(1234567890.50, unit: '&pound;', separator: ',', delimiter: '')
107
+ # # => "&pound;1234567890,50"
108
+ # number_to_currency(1234567890.50, unit: '&pound;', separator: ',', delimiter: '', format: '%n %u')
109
+ # # => "1234567890,50 &pound;"
110
+ # number_to_currency(1234567890.50, strip_insignificant_zeros: true)
111
+ # # => "$1,234,567,890.5"
112
+ # number_to_currency(1234567890.50, precision: 0, round_mode: :up)
113
+ # # => "$1,234,567,891"
139
114
  def number_to_currency(number, options = {})
140
115
  NumberToCurrencyConverter.convert(number, options)
141
116
  end
142
117
 
143
- # Formats +number+ as a percentage string.
144
- #
145
- # number_to_percentage(100) # => "100.000%"
146
- # number_to_percentage("99") # => "99.000%"
147
- # number_to_percentage("99x") # => "99x%"
148
- #
149
- # number_to_percentage(12345.6789, delimiter: ".", separator: ",", precision: 2)
150
- # # => "12.345,68%"
118
+ # Formats a +number+ as a percentage string (e.g., 65%). You can
119
+ # customize the format in the +options+ hash.
151
120
  #
152
121
  # ==== Options
153
122
  #
154
- # [+:locale+]
155
- # The locale to use for formatting. Defaults to the current locale.
156
- #
157
- # number_to_percentage(1000, locale: :fr)
158
- # # => "1000,000%"
159
- #
160
- # [+:precision+]
161
- # The level of precision, or +nil+ to preserve +number+'s precision.
162
- # Defaults to 2.
163
- #
164
- # number_to_percentage(12.3456789, precision: 4) # => "12.3457%"
165
- # number_to_percentage(99.999, precision: 0) # => "100%"
166
- # number_to_percentage(99.999, precision: nil) # => "99.999%"
167
- #
168
- # [+:round_mode+]
169
- # Specifies how rounding is performed. See +BigDecimal.mode+. Defaults to
170
- # +:default+.
171
- #
172
- # number_to_percentage(12.3456789, precision: 4, round_mode: :down)
173
- # # => "12.3456%"
174
- #
175
- # [+:significant+]
176
- # Whether +:precision+ should be applied to significant digits instead of
177
- # fractional digits. Defaults to false.
178
- #
179
- # number_to_percentage(12345.6789) # => "12345.679%"
180
- # number_to_percentage(12345.6789, significant: true) # => "12300%"
181
- # number_to_percentage(12345.6789, precision: 2) # => "12345.68%"
182
- # number_to_percentage(12345.6789, precision: 2, significant: true) # => "12000%"
183
- #
184
- # [+:separator+]
185
- # The decimal separator. Defaults to <tt>"."</tt>.
186
- #
187
- # [+:delimiter+]
188
- # The thousands delimiter. Defaults to <tt>","</tt>.
189
- #
190
- # [+:strip_insignificant_zeros+]
191
- # Whether to remove insignificant zeros after the decimal separator.
192
- # Defaults to false.
193
- #
194
- # [+:format+]
195
- # The format of the output. <tt>%n</tt> represents the number. Defaults to
196
- # <tt>"%n%"</tt>.
197
- #
198
- # number_to_percentage(100, format: "%n %")
199
- # # => "100.000 %"
200
- #
123
+ # * <tt>:locale</tt> - Sets the locale to be used for formatting
124
+ # (defaults to current locale).
125
+ # * <tt>:precision</tt> - Sets the precision of the number
126
+ # (defaults to 3). Keeps the number's precision if +nil+.
127
+ # * <tt>:round_mode</tt> - Determine how rounding is performed
128
+ # (defaults to :default. See BigDecimal::mode)
129
+ # * <tt>:significant</tt> - If +true+, precision will be the number
130
+ # of significant_digits. If +false+, the number of fractional
131
+ # digits (defaults to +false+).
132
+ # * <tt>:separator</tt> - Sets the separator between the
133
+ # fractional and integer digits (defaults to ".").
134
+ # * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults
135
+ # to "").
136
+ # * <tt>:strip_insignificant_zeros</tt> - If +true+ removes
137
+ # insignificant zeros after the decimal separator (defaults to
138
+ # +false+).
139
+ # * <tt>:format</tt> - Specifies the format of the percentage
140
+ # string The number field is <tt>%n</tt> (defaults to "%n%").
141
+ #
142
+ # ==== Examples
143
+ #
144
+ # number_to_percentage(100) # => "100.000%"
145
+ # number_to_percentage('98') # => "98.000%"
146
+ # number_to_percentage(100, precision: 0) # => "100%"
147
+ # number_to_percentage(1000, delimiter: '.', separator: ',') # => "1.000,000%"
148
+ # number_to_percentage(302.24398923423, precision: 5) # => "302.24399%"
149
+ # number_to_percentage(1000, locale: :fr) # => "1000,000%"
150
+ # number_to_percentage(1000, precision: nil) # => "1000%"
151
+ # number_to_percentage('98a') # => "98a%"
152
+ # number_to_percentage(100, format: '%n %') # => "100.000 %"
153
+ # number_to_percentage(302.24398923423, precision: 5, round_mode: :down) # => "302.24398%"
201
154
  def number_to_percentage(number, options = {})
202
155
  NumberToPercentageConverter.convert(number, options)
203
156
  end
204
157
 
205
- # Formats +number+ by grouping thousands with a delimiter.
206
- #
207
- # number_to_delimited(12345678) # => "12,345,678"
208
- # number_to_delimited("123456") # => "123,456"
209
- # number_to_delimited(12345678.9876) # => "12,345,678.9876"
210
- # number_to_delimited("12x34") # => "12x34"
211
- #
212
- # number_to_delimited(12345678.9876, delimiter: ".", separator: ",")
213
- # # => "12.345.678,9876"
158
+ # Formats a +number+ with grouped thousands using +delimiter+
159
+ # (e.g., 12,324). You can customize the format in the +options+
160
+ # hash.
214
161
  #
215
162
  # ==== Options
216
163
  #
217
- # [+:locale+]
218
- # The locale to use for formatting. Defaults to the current locale.
219
- #
220
- # number_to_delimited(12345678.05, locale: :fr)
221
- # # => "12 345 678,05"
222
- #
223
- # [+:delimiter+]
224
- # The thousands delimiter. Defaults to <tt>","</tt>.
225
- #
226
- # number_to_delimited(12345678, delimiter: ".")
227
- # # => "12.345.678"
228
- #
229
- # [+:separator+]
230
- # The decimal separator. Defaults to <tt>"."</tt>.
231
- #
232
- # number_to_delimited(12345678.05, separator: " ")
233
- # # => "12,345,678 05"
234
- #
235
- # [+:delimiter_pattern+]
236
- # A regexp to determine the placement of delimiters. Helpful when using
237
- # currency formats like INR.
238
- #
239
- # number_to_delimited("123456.78", delimiter_pattern: /(\d+?)(?=(\d\d)+(\d)(?!\d))/)
240
- # # => "1,23,456.78"
241
- #
164
+ # * <tt>:locale</tt> - Sets the locale to be used for formatting
165
+ # (defaults to current locale).
166
+ # * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults
167
+ # to ",").
168
+ # * <tt>:separator</tt> - Sets the separator between the
169
+ # fractional and integer digits (defaults to ".").
170
+ # * <tt>:delimiter_pattern</tt> - Sets a custom regular expression used for
171
+ # deriving the placement of delimiter. Helpful when using currency formats
172
+ # like INR.
173
+ #
174
+ # ==== Examples
175
+ #
176
+ # number_to_delimited(12345678) # => "12,345,678"
177
+ # number_to_delimited('123456') # => "123,456"
178
+ # number_to_delimited(12345678.05) # => "12,345,678.05"
179
+ # number_to_delimited(12345678, delimiter: '.') # => "12.345.678"
180
+ # number_to_delimited(12345678, delimiter: ',') # => "12,345,678"
181
+ # number_to_delimited(12345678.05, separator: ' ') # => "12,345,678 05"
182
+ # number_to_delimited(12345678.05, locale: :fr) # => "12 345 678,05"
183
+ # number_to_delimited('112a') # => "112a"
184
+ # number_to_delimited(98765432.98, delimiter: ' ', separator: ',')
185
+ # # => "98 765 432,98"
186
+ # number_to_delimited("123456.78",
187
+ # delimiter_pattern: /(\d+?)(?=(\d\d)+(\d)(?!\d))/)
188
+ # # => "1,23,456.78"
242
189
  def number_to_delimited(number, options = {})
243
190
  NumberToDelimitedConverter.convert(number, options)
244
191
  end
245
192
 
246
- # Formats +number+ to a specific level of precision.
247
- #
248
- # number_to_rounded(12345.6789) # => "12345.679"
249
- # number_to_rounded(12345.6789, precision: 2) # => "12345.68"
250
- # number_to_rounded(12345.6789, precision: 0) # => "12345"
251
- # number_to_rounded(12345, precision: 5) # => "12345.00000"
193
+ # Formats a +number+ with the specified level of
194
+ # <tt>:precision</tt> (e.g., 112.32 has a precision of 2 if
195
+ # +:significant+ is +false+, and 5 if +:significant+ is +true+).
196
+ # You can customize the format in the +options+ hash.
252
197
  #
253
198
  # ==== Options
254
199
  #
255
- # [+:locale+]
256
- # The locale to use for formatting. Defaults to the current locale.
257
- #
258
- # number_to_rounded(111.234, locale: :fr)
259
- # # => "111,234"
260
- #
261
- # [+:precision+]
262
- # The level of precision, or +nil+ to preserve +number+'s precision.
263
- # Defaults to 3.
264
- #
265
- # number_to_rounded(12345.6789, precision: nil)
266
- # # => "12345.6789"
267
- #
268
- # [+:round_mode+]
269
- # Specifies how rounding is performed. See +BigDecimal.mode+. Defaults to
270
- # +:default+.
271
- #
272
- # number_to_rounded(12.34, precision: 0, round_mode: :up)
273
- # # => "13"
274
- #
275
- # [+:significant+]
276
- # Whether +:precision+ should be applied to significant digits instead of
277
- # fractional digits. Defaults to false.
278
- #
279
- # number_to_rounded(12345.6789) # => "12345.679"
280
- # number_to_rounded(12345.6789, significant: true) # => "12300"
281
- # number_to_rounded(12345.6789, precision: 2) # => "12345.68"
282
- # number_to_rounded(12345.6789, precision: 2, significant: true) # => "12000"
283
- #
284
- # [+:separator+]
285
- # The decimal separator. Defaults to <tt>"."</tt>.
286
- #
287
- # [+:delimiter+]
288
- # The thousands delimiter. Defaults to <tt>","</tt>.
289
- #
290
- # [+:strip_insignificant_zeros+]
291
- # Whether to remove insignificant zeros after the decimal separator.
292
- # Defaults to false.
293
- #
294
- # number_to_rounded(12.34, strip_insignificant_zeros: false) # => "12.340"
295
- # number_to_rounded(12.34, strip_insignificant_zeros: true) # => "12.34"
296
- # number_to_rounded(12.3456, strip_insignificant_zeros: true) # => "12.346"
297
- #
200
+ # * <tt>:locale</tt> - Sets the locale to be used for formatting
201
+ # (defaults to current locale).
202
+ # * <tt>:precision</tt> - Sets the precision of the number
203
+ # (defaults to 3). Keeps the number's precision if +nil+.
204
+ # * <tt>:round_mode</tt> - Determine how rounding is performed
205
+ # (defaults to :default. See BigDecimal::mode)
206
+ # * <tt>:significant</tt> - If +true+, precision will be the number
207
+ # of significant_digits. If +false+, the number of fractional
208
+ # digits (defaults to +false+).
209
+ # * <tt>:separator</tt> - Sets the separator between the
210
+ # fractional and integer digits (defaults to ".").
211
+ # * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults
212
+ # to "").
213
+ # * <tt>:strip_insignificant_zeros</tt> - If +true+ removes
214
+ # insignificant zeros after the decimal separator (defaults to
215
+ # +false+).
216
+ #
217
+ # ==== Examples
218
+ #
219
+ # number_to_rounded(111.2345) # => "111.235"
220
+ # number_to_rounded(111.2345, precision: 2) # => "111.23"
221
+ # number_to_rounded(13, precision: 5) # => "13.00000"
222
+ # number_to_rounded(389.32314, precision: 0) # => "389"
223
+ # number_to_rounded(111.2345, significant: true) # => "111"
224
+ # number_to_rounded(111.2345, precision: 1, significant: true) # => "100"
225
+ # number_to_rounded(13, precision: 5, significant: true) # => "13.000"
226
+ # number_to_rounded(13, precision: nil) # => "13"
227
+ # number_to_rounded(389.32314, precision: 0, round_mode: :up) # => "390"
228
+ # number_to_rounded(111.234, locale: :fr) # => "111,234"
229
+ #
230
+ # number_to_rounded(13, precision: 5, significant: true, strip_insignificant_zeros: true)
231
+ # # => "13"
232
+ #
233
+ # number_to_rounded(389.32314, precision: 4, significant: true) # => "389.3"
234
+ # number_to_rounded(1111.2345, precision: 2, separator: ',', delimiter: '.')
235
+ # # => "1.111,23"
298
236
  def number_to_rounded(number, options = {})
299
237
  NumberToRoundedConverter.convert(number, options)
300
238
  end
301
239
 
302
- # Formats +number+ as bytes into a more human-friendly representation.
303
- # Useful for reporting file sizes to users.
304
- #
305
- # number_to_human_size(123) # => "123 Bytes"
306
- # number_to_human_size(1234) # => "1.21 KB"
307
- # number_to_human_size(12345) # => "12.1 KB"
308
- # number_to_human_size(1234567) # => "1.18 MB"
309
- # number_to_human_size(1234567890) # => "1.15 GB"
310
- # number_to_human_size(1234567890123) # => "1.12 TB"
311
- # number_to_human_size(1234567890123456) # => "1.1 PB"
312
- # number_to_human_size(1234567890123456789) # => "1.07 EB"
240
+ # Formats the bytes in +number+ into a more understandable
241
+ # representation (e.g., giving it 1500 yields 1.46 KB). This
242
+ # method is useful for reporting file sizes to users. You can
243
+ # customize the format in the +options+ hash.
313
244
  #
314
- # See #number_to_human if you want to pretty-print a generic number.
245
+ # See <tt>number_to_human</tt> if you want to pretty-print a
246
+ # generic number.
315
247
  #
316
248
  # ==== Options
317
249
  #
318
- # [+:locale+]
319
- # The locale to use for formatting. Defaults to the current locale.
320
- #
321
- # [+:precision+]
322
- # The level of precision. Defaults to 3.
323
- #
324
- # number_to_human_size(123456, precision: 2) # => "120 KB"
325
- # number_to_human_size(1234567, precision: 2) # => "1.2 MB"
326
- #
327
- # [+:round_mode+]
328
- # Specifies how rounding is performed. See +BigDecimal.mode+. Defaults to
329
- # +:default+.
330
- #
331
- # number_to_human_size(123456, precision: 2, round_mode: :up)
332
- # # => "130 KB"
333
- #
334
- # [+:significant+]
335
- # Whether +:precision+ should be applied to significant digits instead of
336
- # fractional digits. Defaults to true.
337
- #
338
- # [+:separator+]
339
- # The decimal separator. Defaults to <tt>"."</tt>.
340
- #
341
- # number_to_human_size(1234567, separator: ",")
342
- # # => "1,18 MB"
343
- #
344
- # [+:delimiter+]
345
- # The thousands delimiter. Defaults to <tt>","</tt>.
346
- #
347
- # [+:strip_insignificant_zeros+]
348
- # Whether to remove insignificant zeros after the decimal separator.
349
- # Defaults to true.
350
- #
250
+ # * <tt>:locale</tt> - Sets the locale to be used for formatting
251
+ # (defaults to current locale).
252
+ # * <tt>:precision</tt> - Sets the precision of the number
253
+ # (defaults to 3).
254
+ # * <tt>:round_mode</tt> - Determine how rounding is performed
255
+ # (defaults to :default. See BigDecimal::mode)
256
+ # * <tt>:significant</tt> - If +true+, precision will be the number
257
+ # of significant_digits. If +false+, the number of fractional
258
+ # digits (defaults to +true+)
259
+ # * <tt>:separator</tt> - Sets the separator between the
260
+ # fractional and integer digits (defaults to ".").
261
+ # * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults
262
+ # to "").
263
+ # * <tt>:strip_insignificant_zeros</tt> - If +true+ removes
264
+ # insignificant zeros after the decimal separator (defaults to
265
+ # +true+)
266
+ #
267
+ # ==== Examples
268
+ #
269
+ # number_to_human_size(123) # => "123 Bytes"
270
+ # number_to_human_size(1234) # => "1.21 KB"
271
+ # number_to_human_size(12345) # => "12.1 KB"
272
+ # number_to_human_size(1234567) # => "1.18 MB"
273
+ # number_to_human_size(1234567890) # => "1.15 GB"
274
+ # number_to_human_size(1234567890123) # => "1.12 TB"
275
+ # number_to_human_size(1234567890123456) # => "1.1 PB"
276
+ # number_to_human_size(1234567890123456789) # => "1.07 EB"
277
+ # number_to_human_size(1234567, precision: 2) # => "1.2 MB"
278
+ # number_to_human_size(483989, precision: 2) # => "470 KB"
279
+ # number_to_human_size(483989, precision: 2, round_mode: :up) # => "480 KB"
280
+ # number_to_human_size(1234567, precision: 2, separator: ',') # => "1,2 MB"
281
+ # number_to_human_size(1234567890123, precision: 5) # => "1.1228 TB"
282
+ # number_to_human_size(524288000, precision: 5) # => "500 MB"
351
283
  def number_to_human_size(number, options = {})
352
284
  NumberToHumanSizeConverter.convert(number, options)
353
285
  end
354
286
 
355
- # Formats +number+ into a more human-friendly representation. Useful for
356
- # numbers that can become very large and too hard to read.
287
+ # Pretty prints (formats and approximates) a number in a way it
288
+ # is more readable by humans (e.g.: 1200000000 becomes "1.2
289
+ # Billion"). This is useful for numbers that can get very large
290
+ # (and too hard to read).
357
291
  #
358
- # number_to_human(123) # => "123"
359
- # number_to_human(1234) # => "1.23 Thousand"
360
- # number_to_human(12345) # => "12.3 Thousand"
361
- # number_to_human(1234567) # => "1.23 Million"
362
- # number_to_human(1234567890) # => "1.23 Billion"
363
- # number_to_human(1234567890123) # => "1.23 Trillion"
364
- # number_to_human(1234567890123456) # => "1.23 Quadrillion"
365
- # number_to_human(1234567890123456789) # => "1230 Quadrillion"
292
+ # See <tt>number_to_human_size</tt> if you want to print a file
293
+ # size.
366
294
  #
367
- # See #number_to_human_size if you want to pretty-print a file size.
295
+ # You can also define your own unit-quantifier names if you want
296
+ # to use other decimal units (e.g.: 1500 becomes "1.5
297
+ # kilometers", 0.150 becomes "150 milliliters", etc). You may
298
+ # define a wide range of unit quantifiers, even fractional ones
299
+ # (centi, deci, mili, etc).
368
300
  #
369
301
  # ==== Options
370
302
  #
371
- # [+:locale+]
372
- # The locale to use for formatting. Defaults to the current locale.
373
- #
374
- # [+:precision+]
375
- # The level of precision. Defaults to 3.
376
- #
377
- # number_to_human(123456, precision: 2) # => "120 Thousand"
378
- # number_to_human(123456, precision: 4) # => "123.5 Thousand"
379
- #
380
- # [+:round_mode+]
381
- # Specifies how rounding is performed. See +BigDecimal.mode+. Defaults to
382
- # +:default+.
383
- #
384
- # number_to_human(123456, precision: 2, round_mode: :up)
385
- # # => "130 Thousand"
386
- #
387
- # [+:significant+]
388
- # Whether +:precision+ should be applied to significant digits instead of
389
- # fractional digits. Defaults to true.
390
- #
391
- # [+:separator+]
392
- # The decimal separator. Defaults to <tt>"."</tt>.
393
- #
394
- # number_to_human(123456, precision: 4, separator: ",")
395
- # # => "123,5 Thousand"
396
- #
397
- # [+:delimiter+]
398
- # The thousands delimiter. Defaults to <tt>","</tt>.
399
- #
400
- # [+:strip_insignificant_zeros+]
401
- # Whether to remove insignificant zeros after the decimal separator.
402
- # Defaults to true.
403
- #
404
- # number_to_human(1000000) # => "1 Million"
405
- # number_to_human(1000000, strip_insignificant_zeros: false) # => "1.00 Million"
406
- # number_to_human(10.01) # => "10"
407
- # number_to_human(10.01, strip_insignificant_zeros: false) # => "10.0"
408
- #
409
- # [+:format+]
410
- # The format of the output. <tt>%n</tt> represents the number, and
411
- # <tt>%u</tt> represents the quantifier (e.g., "Thousand"). Defaults to
412
- # <tt>"%n %u"</tt>.
413
- #
414
- # [+:units+]
415
- # A Hash of custom unit quantifier names.
416
- #
417
- # number_to_human(1, units: { unit: "m", thousand: "km" }) # => "1 m"
418
- # number_to_human(100, units: { unit: "m", thousand: "km" }) # => "100 m"
419
- # number_to_human(1000, units: { unit: "m", thousand: "km" }) # => "1 km"
420
- # number_to_human(100000, units: { unit: "m", thousand: "km" }) # => "100 km"
421
- # number_to_human(10000000, units: { unit: "m", thousand: "km" }) # => "10000 km"
422
- #
423
- # The following keys are supported for integer units: +:unit+, +:ten+,
424
- # +:hundred+, +:thousand+, +:million+, +:billion+, +:trillion+,
425
- # +:quadrillion+. Additionally, the following keys are supported for
426
- # fractional units: +:deci+, +:centi+, +:mili+, +:micro+, +:nano+,
427
- # +:pico+, +:femto+.
428
- #
429
- # The Hash can also be defined as a scope in an I18n locale. For example:
430
- #
431
- # en:
432
- # distance:
433
- # centi:
434
- # one: "centimeter"
435
- # other: "centimeters"
436
- # unit:
437
- # one: "meter"
438
- # other: "meters"
439
- # thousand:
440
- # one: "kilometer"
441
- # other: "kilometers"
442
- #
443
- # Then it can be specified by name:
444
- #
445
- # number_to_human(1, units: :distance) # => "1 meter"
446
- # number_to_human(100, units: :distance) # => "100 meters"
447
- # number_to_human(1000, units: :distance) # => "1 kilometer"
448
- # number_to_human(100000, units: :distance) # => "100 kilometers"
449
- # number_to_human(10000000, units: :distance) # => "10000 kilometers"
450
- # number_to_human(0.1, units: :distance) # => "10 centimeters"
451
- # number_to_human(0.01, units: :distance) # => "1 centimeter"
452
- #
303
+ # * <tt>:locale</tt> - Sets the locale to be used for formatting
304
+ # (defaults to current locale).
305
+ # * <tt>:precision</tt> - Sets the precision of the number
306
+ # (defaults to 3).
307
+ # * <tt>:round_mode</tt> - Determine how rounding is performed
308
+ # (defaults to :default. See BigDecimal::mode)
309
+ # * <tt>:significant</tt> - If +true+, precision will be the number
310
+ # of significant_digits. If +false+, the number of fractional
311
+ # digits (defaults to +true+)
312
+ # * <tt>:separator</tt> - Sets the separator between the
313
+ # fractional and integer digits (defaults to ".").
314
+ # * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults
315
+ # to "").
316
+ # * <tt>:strip_insignificant_zeros</tt> - If +true+ removes
317
+ # insignificant zeros after the decimal separator (defaults to
318
+ # +true+)
319
+ # * <tt>:units</tt> - A Hash of unit quantifier names. Or a
320
+ # string containing an i18n scope where to find this hash. It
321
+ # might have the following keys:
322
+ # * *integers*: <tt>:unit</tt>, <tt>:ten</tt>,
323
+ # <tt>:hundred</tt>, <tt>:thousand</tt>, <tt>:million</tt>,
324
+ # <tt>:billion</tt>, <tt>:trillion</tt>,
325
+ # <tt>:quadrillion</tt>
326
+ # * *fractionals*: <tt>:deci</tt>, <tt>:centi</tt>,
327
+ # <tt>:mili</tt>, <tt>:micro</tt>, <tt>:nano</tt>,
328
+ # <tt>:pico</tt>, <tt>:femto</tt>
329
+ # * <tt>:format</tt> - Sets the format of the output string
330
+ # (defaults to "%n %u"). The field types are:
331
+ # * %u - The quantifier (ex.: 'thousand')
332
+ # * %n - The number
333
+ #
334
+ # ==== Examples
335
+ #
336
+ # number_to_human(123) # => "123"
337
+ # number_to_human(1234) # => "1.23 Thousand"
338
+ # number_to_human(12345) # => "12.3 Thousand"
339
+ # number_to_human(1234567) # => "1.23 Million"
340
+ # number_to_human(1234567890) # => "1.23 Billion"
341
+ # number_to_human(1234567890123) # => "1.23 Trillion"
342
+ # number_to_human(1234567890123456) # => "1.23 Quadrillion"
343
+ # number_to_human(1234567890123456789) # => "1230 Quadrillion"
344
+ # number_to_human(489939, precision: 2) # => "490 Thousand"
345
+ # number_to_human(489939, precision: 4) # => "489.9 Thousand"
346
+ # number_to_human(489939, precision: 2
347
+ # , round_mode: :down) # => "480 Thousand"
348
+ # number_to_human(1234567, precision: 4,
349
+ # significant: false) # => "1.2346 Million"
350
+ # number_to_human(1234567, precision: 1,
351
+ # separator: ',',
352
+ # significant: false) # => "1,2 Million"
353
+ #
354
+ # number_to_human(500000000, precision: 5) # => "500 Million"
355
+ # number_to_human(12345012345, significant: false) # => "12.345 Billion"
356
+ #
357
+ # Non-significant zeros after the decimal separator are stripped
358
+ # out by default (set <tt>:strip_insignificant_zeros</tt> to
359
+ # +false+ to change that):
360
+ #
361
+ # number_to_human(12.00001) # => "12"
362
+ # number_to_human(12.00001, strip_insignificant_zeros: false) # => "12.0"
363
+ #
364
+ # ==== Custom Unit Quantifiers
365
+ #
366
+ # You can also use your own custom unit quantifiers:
367
+ #
368
+ # number_to_human(500000, units: { unit: 'ml', thousand: 'lt' }) # => "500 lt"
369
+ #
370
+ # If in your I18n locale you have:
371
+ #
372
+ # distance:
373
+ # centi:
374
+ # one: "centimeter"
375
+ # other: "centimeters"
376
+ # unit:
377
+ # one: "meter"
378
+ # other: "meters"
379
+ # thousand:
380
+ # one: "kilometer"
381
+ # other: "kilometers"
382
+ # billion: "gazillion-distance"
383
+ #
384
+ # Then you could do:
385
+ #
386
+ # number_to_human(543934, units: :distance) # => "544 kilometers"
387
+ # number_to_human(54393498, units: :distance) # => "54400 kilometers"
388
+ # number_to_human(54393498000, units: :distance) # => "54.4 gazillion-distance"
389
+ # number_to_human(343, units: :distance, precision: 1) # => "300 meters"
390
+ # number_to_human(1, units: :distance) # => "1 meter"
391
+ # number_to_human(0.34, units: :distance) # => "34 centimeters"
453
392
  def number_to_human(number, options = {})
454
393
  NumberToHumanConverter.convert(number, options)
455
394
  end