activesupport 7.0.8 → 7.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (199) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +142 -428
  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 +3 -1
  7. data/lib/active_support/backtrace_cleaner.rb +39 -7
  8. data/lib/active_support/benchmarkable.rb +1 -0
  9. data/lib/active_support/broadcast_logger.rb +251 -0
  10. data/lib/active_support/builder.rb +1 -1
  11. data/lib/active_support/cache/coder.rb +153 -0
  12. data/lib/active_support/cache/entry.rb +134 -0
  13. data/lib/active_support/cache/file_store.rb +49 -17
  14. data/lib/active_support/cache/mem_cache_store.rb +94 -128
  15. data/lib/active_support/cache/memory_store.rb +80 -25
  16. data/lib/active_support/cache/null_store.rb +6 -0
  17. data/lib/active_support/cache/redis_cache_store.rb +165 -152
  18. data/lib/active_support/cache/serializer_with_fallback.rb +152 -0
  19. data/lib/active_support/cache/strategy/local_cache.rb +29 -14
  20. data/lib/active_support/cache.rb +363 -291
  21. data/lib/active_support/callbacks.rb +118 -134
  22. data/lib/active_support/code_generator.rb +15 -10
  23. data/lib/active_support/concern.rb +4 -2
  24. data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +42 -3
  25. data/lib/active_support/concurrency/null_lock.rb +13 -0
  26. data/lib/active_support/configurable.rb +10 -0
  27. data/lib/active_support/core_ext/array/conversions.rb +1 -2
  28. data/lib/active_support/core_ext/array.rb +0 -1
  29. data/lib/active_support/core_ext/class/subclasses.rb +17 -34
  30. data/lib/active_support/core_ext/date/blank.rb +4 -0
  31. data/lib/active_support/core_ext/date/conversions.rb +1 -2
  32. data/lib/active_support/core_ext/date.rb +0 -1
  33. data/lib/active_support/core_ext/date_and_time/calculations.rb +10 -0
  34. data/lib/active_support/core_ext/date_and_time/compatibility.rb +28 -1
  35. data/lib/active_support/core_ext/date_time/blank.rb +4 -0
  36. data/lib/active_support/core_ext/date_time/conversions.rb +2 -2
  37. data/lib/active_support/core_ext/date_time.rb +0 -1
  38. data/lib/active_support/core_ext/digest/uuid.rb +7 -10
  39. data/lib/active_support/core_ext/enumerable.rb +3 -75
  40. data/lib/active_support/core_ext/erb/util.rb +201 -0
  41. data/lib/active_support/core_ext/hash/conversions.rb +1 -1
  42. data/lib/active_support/core_ext/hash/deep_merge.rb +22 -14
  43. data/lib/active_support/core_ext/hash/keys.rb +4 -4
  44. data/lib/active_support/core_ext/module/attr_internal.rb +17 -6
  45. data/lib/active_support/core_ext/module/attribute_accessors.rb +6 -0
  46. data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +34 -16
  47. data/lib/active_support/core_ext/module/concerning.rb +6 -6
  48. data/lib/active_support/core_ext/module/delegation.rb +20 -119
  49. data/lib/active_support/core_ext/module/deprecation.rb +12 -12
  50. data/lib/active_support/core_ext/module/introspection.rb +0 -1
  51. data/lib/active_support/core_ext/numeric/bytes.rb +9 -0
  52. data/lib/active_support/core_ext/numeric/conversions.rb +5 -3
  53. data/lib/active_support/core_ext/numeric.rb +0 -1
  54. data/lib/active_support/core_ext/object/blank.rb +45 -1
  55. data/lib/active_support/core_ext/object/deep_dup.rb +16 -0
  56. data/lib/active_support/core_ext/object/duplicable.rb +24 -15
  57. data/lib/active_support/core_ext/object/inclusion.rb +13 -5
  58. data/lib/active_support/core_ext/object/instance_variables.rb +4 -2
  59. data/lib/active_support/core_ext/object/json.rb +17 -7
  60. data/lib/active_support/core_ext/object/with.rb +46 -0
  61. data/lib/active_support/core_ext/object/with_options.rb +4 -4
  62. data/lib/active_support/core_ext/object.rb +1 -0
  63. data/lib/active_support/core_ext/pathname/blank.rb +20 -0
  64. data/lib/active_support/core_ext/pathname/existence.rb +2 -0
  65. data/lib/active_support/core_ext/pathname.rb +1 -0
  66. data/lib/active_support/core_ext/range/conversions.rb +28 -7
  67. data/lib/active_support/core_ext/range/overlap.rb +40 -0
  68. data/lib/active_support/core_ext/range.rb +1 -2
  69. data/lib/active_support/core_ext/securerandom.rb +1 -5
  70. data/lib/active_support/core_ext/string/conversions.rb +1 -1
  71. data/lib/active_support/core_ext/string/filters.rb +21 -15
  72. data/lib/active_support/core_ext/string/indent.rb +1 -1
  73. data/lib/active_support/core_ext/string/inflections.rb +16 -5
  74. data/lib/active_support/core_ext/string/multibyte.rb +1 -1
  75. data/lib/active_support/core_ext/string/output_safety.rb +34 -177
  76. data/lib/active_support/core_ext/thread/backtrace/location.rb +12 -0
  77. data/lib/active_support/core_ext/time/calculations.rb +36 -30
  78. data/lib/active_support/core_ext/time/compatibility.rb +16 -0
  79. data/lib/active_support/core_ext/time/conversions.rb +1 -3
  80. data/lib/active_support/core_ext/time/zones.rb +4 -4
  81. data/lib/active_support/core_ext/time.rb +0 -1
  82. data/lib/active_support/core_ext.rb +0 -1
  83. data/lib/active_support/current_attributes.rb +53 -46
  84. data/lib/active_support/deep_mergeable.rb +53 -0
  85. data/lib/active_support/delegation.rb +202 -0
  86. data/lib/active_support/dependencies/autoload.rb +9 -16
  87. data/lib/active_support/deprecation/behaviors.rb +65 -42
  88. data/lib/active_support/deprecation/constant_accessor.rb +47 -25
  89. data/lib/active_support/deprecation/deprecators.rb +104 -0
  90. data/lib/active_support/deprecation/disallowed.rb +3 -5
  91. data/lib/active_support/deprecation/method_wrappers.rb +6 -23
  92. data/lib/active_support/deprecation/proxy_wrappers.rb +34 -22
  93. data/lib/active_support/deprecation/reporting.rb +49 -27
  94. data/lib/active_support/deprecation.rb +39 -9
  95. data/lib/active_support/deprecator.rb +7 -0
  96. data/lib/active_support/descendants_tracker.rb +66 -172
  97. data/lib/active_support/duration/iso8601_parser.rb +2 -2
  98. data/lib/active_support/duration/iso8601_serializer.rb +1 -4
  99. data/lib/active_support/duration.rb +13 -7
  100. data/lib/active_support/encrypted_configuration.rb +30 -9
  101. data/lib/active_support/encrypted_file.rb +9 -4
  102. data/lib/active_support/environment_inquirer.rb +22 -2
  103. data/lib/active_support/error_reporter/test_helper.rb +15 -0
  104. data/lib/active_support/error_reporter.rb +160 -36
  105. data/lib/active_support/evented_file_update_checker.rb +0 -1
  106. data/lib/active_support/execution_wrapper.rb +4 -5
  107. data/lib/active_support/file_update_checker.rb +5 -3
  108. data/lib/active_support/fork_tracker.rb +4 -32
  109. data/lib/active_support/gem_version.rb +3 -3
  110. data/lib/active_support/gzip.rb +2 -0
  111. data/lib/active_support/hash_with_indifferent_access.rb +41 -25
  112. data/lib/active_support/html_safe_translation.rb +19 -6
  113. data/lib/active_support/i18n.rb +1 -1
  114. data/lib/active_support/i18n_railtie.rb +20 -13
  115. data/lib/active_support/inflector/inflections.rb +2 -0
  116. data/lib/active_support/inflector/methods.rb +23 -11
  117. data/lib/active_support/inflector/transliterate.rb +3 -1
  118. data/lib/active_support/isolated_execution_state.rb +26 -22
  119. data/lib/active_support/json/decoding.rb +2 -1
  120. data/lib/active_support/json/encoding.rb +25 -43
  121. data/lib/active_support/key_generator.rb +9 -1
  122. data/lib/active_support/lazy_load_hooks.rb +6 -4
  123. data/lib/active_support/locale/en.yml +2 -0
  124. data/lib/active_support/log_subscriber.rb +74 -34
  125. data/lib/active_support/logger.rb +22 -60
  126. data/lib/active_support/logger_thread_safe_level.rb +10 -32
  127. data/lib/active_support/message_encryptor.rb +197 -53
  128. data/lib/active_support/message_encryptors.rb +141 -0
  129. data/lib/active_support/message_pack/cache_serializer.rb +23 -0
  130. data/lib/active_support/message_pack/extensions.rb +305 -0
  131. data/lib/active_support/message_pack/serializer.rb +63 -0
  132. data/lib/active_support/message_pack.rb +50 -0
  133. data/lib/active_support/message_verifier.rb +220 -89
  134. data/lib/active_support/message_verifiers.rb +135 -0
  135. data/lib/active_support/messages/codec.rb +65 -0
  136. data/lib/active_support/messages/metadata.rb +111 -45
  137. data/lib/active_support/messages/rotation_coordinator.rb +93 -0
  138. data/lib/active_support/messages/rotator.rb +34 -32
  139. data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
  140. data/lib/active_support/multibyte/chars.rb +4 -2
  141. data/lib/active_support/multibyte/unicode.rb +9 -37
  142. data/lib/active_support/notifications/fanout.rb +248 -87
  143. data/lib/active_support/notifications/instrumenter.rb +93 -25
  144. data/lib/active_support/notifications.rb +29 -28
  145. data/lib/active_support/number_helper/number_converter.rb +16 -7
  146. data/lib/active_support/number_helper/number_to_currency_converter.rb +6 -6
  147. data/lib/active_support/number_helper/number_to_human_size_converter.rb +3 -3
  148. data/lib/active_support/number_helper/number_to_phone_converter.rb +1 -0
  149. data/lib/active_support/number_helper.rb +379 -318
  150. data/lib/active_support/option_merger.rb +2 -2
  151. data/lib/active_support/ordered_hash.rb +3 -3
  152. data/lib/active_support/ordered_options.rb +67 -15
  153. data/lib/active_support/parameter_filter.rb +84 -69
  154. data/lib/active_support/proxy_object.rb +8 -3
  155. data/lib/active_support/railtie.rb +25 -20
  156. data/lib/active_support/reloader.rb +12 -4
  157. data/lib/active_support/rescuable.rb +2 -0
  158. data/lib/active_support/secure_compare_rotator.rb +16 -9
  159. data/lib/active_support/string_inquirer.rb +4 -2
  160. data/lib/active_support/subscriber.rb +10 -27
  161. data/lib/active_support/syntax_error_proxy.rb +60 -0
  162. data/lib/active_support/tagged_logging.rb +64 -25
  163. data/lib/active_support/test_case.rb +156 -7
  164. data/lib/active_support/testing/assertions.rb +28 -12
  165. data/lib/active_support/testing/autorun.rb +0 -2
  166. data/lib/active_support/testing/constant_stubbing.rb +54 -0
  167. data/lib/active_support/testing/deprecation.rb +20 -27
  168. data/lib/active_support/testing/error_reporter_assertions.rb +107 -0
  169. data/lib/active_support/testing/isolation.rb +21 -9
  170. data/lib/active_support/testing/method_call_assertions.rb +7 -8
  171. data/lib/active_support/testing/parallelization/server.rb +3 -0
  172. data/lib/active_support/testing/parallelize_executor.rb +8 -3
  173. data/lib/active_support/testing/setup_and_teardown.rb +2 -0
  174. data/lib/active_support/testing/stream.rb +1 -1
  175. data/lib/active_support/testing/strict_warnings.rb +43 -0
  176. data/lib/active_support/testing/tests_without_assertions.rb +19 -0
  177. data/lib/active_support/testing/time_helpers.rb +38 -16
  178. data/lib/active_support/time_with_zone.rb +12 -18
  179. data/lib/active_support/values/time_zone.rb +25 -14
  180. data/lib/active_support/version.rb +1 -1
  181. data/lib/active_support/xml_mini/jdom.rb +3 -10
  182. data/lib/active_support/xml_mini/nokogiri.rb +1 -1
  183. data/lib/active_support/xml_mini/nokogirisax.rb +1 -1
  184. data/lib/active_support/xml_mini/rexml.rb +1 -1
  185. data/lib/active_support/xml_mini.rb +12 -3
  186. data/lib/active_support.rb +15 -3
  187. metadata +145 -24
  188. data/lib/active_support/core_ext/array/deprecated_conversions.rb +0 -25
  189. data/lib/active_support/core_ext/date/deprecated_conversions.rb +0 -40
  190. data/lib/active_support/core_ext/date_time/deprecated_conversions.rb +0 -36
  191. data/lib/active_support/core_ext/numeric/deprecated_conversions.rb +0 -60
  192. data/lib/active_support/core_ext/range/deprecated_conversions.rb +0 -36
  193. data/lib/active_support/core_ext/range/include_time_with_zone.rb +0 -5
  194. data/lib/active_support/core_ext/range/overlaps.rb +0 -10
  195. data/lib/active_support/core_ext/time/deprecated_conversions.rb +0 -73
  196. data/lib/active_support/core_ext/uri.rb +0 -5
  197. data/lib/active_support/deprecation/instance_delegator.rb +0 -38
  198. data/lib/active_support/per_thread_registry.rb +0 -65
  199. data/lib/active_support/ruby_features.rb +0 -7
@@ -18,377 +18,438 @@ module ActiveSupport
18
18
 
19
19
  extend self
20
20
 
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.
21
+ # Formats +number+ into a phone number.
23
22
  #
24
- # ==== Options
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"
25
27
  #
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: '.')
28
+ # number_to_phone(1235551234, delimiter: ".", country_code: 1, extension: 1343)
47
29
  # # => "+1.123.555.1234 x 1343"
48
30
  #
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"
31
+ # ==== Options
32
+ #
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"
65
+ #
53
66
  def number_to_phone(number, options = {})
54
67
  NumberToPhoneConverter.convert(number, options)
55
68
  end
56
69
 
57
- # Formats a +number+ into a currency string (e.g., $13.65). You
58
- # can customize the format in the +options+ hash.
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"
59
78
  #
60
79
  # The currency unit and number formatting of the current locale will be used
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
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
63
82
  # also be able to change the relative value of the currency displayed with
64
83
  # this helper. If your application will ever support multiple locales, you
65
- # may want to specify a constant <tt>:locale</tt> option or consider
66
- # using a library capable of currency conversion.
84
+ # may want to specify a constant +:locale+ option or consider using a
85
+ # library capable of currency conversion.
67
86
  #
68
87
  # ==== Options
69
88
  #
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"
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
+ #
114
139
  def number_to_currency(number, options = {})
115
140
  NumberToCurrencyConverter.convert(number, options)
116
141
  end
117
142
 
118
- # Formats a +number+ as a percentage string (e.g., 65%). You can
119
- # customize the format in the +options+ hash.
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%"
120
151
  #
121
152
  # ==== Options
122
153
  #
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%"
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
+ #
154
201
  def number_to_percentage(number, options = {})
155
202
  NumberToPercentageConverter.convert(number, options)
156
203
  end
157
204
 
158
- # Formats a +number+ with grouped thousands using +delimiter+
159
- # (e.g., 12,324). You can customize the format in the +options+
160
- # hash.
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"
161
214
  #
162
215
  # ==== Options
163
216
  #
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"
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
+ #
189
242
  def number_to_delimited(number, options = {})
190
243
  NumberToDelimitedConverter.convert(number, options)
191
244
  end
192
245
 
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.
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"
197
252
  #
198
253
  # ==== Options
199
254
  #
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"
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
+ #
236
298
  def number_to_rounded(number, options = {})
237
299
  NumberToRoundedConverter.convert(number, options)
238
300
  end
239
301
 
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.
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"
244
313
  #
245
- # See <tt>number_to_human</tt> if you want to pretty-print a
246
- # generic number.
314
+ # See #number_to_human if you want to pretty-print a generic number.
247
315
  #
248
316
  # ==== Options
249
317
  #
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"
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
+ #
283
351
  def number_to_human_size(number, options = {})
284
352
  NumberToHumanSizeConverter.convert(number, options)
285
353
  end
286
354
 
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).
355
+ # Formats +number+ into a more human-friendly representation. Useful for
356
+ # numbers that can become very large and too hard to read.
291
357
  #
292
- # See <tt>number_to_human_size</tt> if you want to print a file
293
- # size.
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"
294
366
  #
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).
367
+ # See #number_to_human_size if you want to pretty-print a file size.
300
368
  #
301
369
  # ==== Options
302
370
  #
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"
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
+ #
392
453
  def number_to_human(number, options = {})
393
454
  NumberToHumanConverter.convert(number, options)
394
455
  end