activesupport 6.1.0 → 7.1.5.1
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1075 -325
- data/MIT-LICENSE +1 -1
- data/README.rdoc +7 -7
- data/lib/active_support/actionable_error.rb +4 -2
- data/lib/active_support/array_inquirer.rb +2 -2
- data/lib/active_support/backtrace_cleaner.rb +32 -7
- data/lib/active_support/benchmarkable.rb +3 -2
- data/lib/active_support/broadcast_logger.rb +251 -0
- data/lib/active_support/builder.rb +1 -1
- data/lib/active_support/cache/coder.rb +153 -0
- data/lib/active_support/cache/entry.rb +134 -0
- data/lib/active_support/cache/file_store.rb +53 -20
- data/lib/active_support/cache/mem_cache_store.rb +201 -62
- data/lib/active_support/cache/memory_store.rb +86 -24
- data/lib/active_support/cache/null_store.rb +16 -2
- data/lib/active_support/cache/redis_cache_store.rb +186 -193
- data/lib/active_support/cache/serializer_with_fallback.rb +175 -0
- data/lib/active_support/cache/strategy/local_cache.rb +63 -71
- data/lib/active_support/cache.rb +487 -249
- data/lib/active_support/callbacks.rb +227 -105
- data/lib/active_support/code_generator.rb +70 -0
- data/lib/active_support/concern.rb +9 -7
- data/lib/active_support/concurrency/load_interlock_aware_monitor.rb +44 -7
- data/lib/active_support/concurrency/null_lock.rb +13 -0
- data/lib/active_support/concurrency/share_lock.rb +2 -2
- data/lib/active_support/configurable.rb +18 -5
- data/lib/active_support/configuration_file.rb +7 -2
- data/lib/active_support/core_ext/array/access.rb +1 -5
- data/lib/active_support/core_ext/array/conversions.rb +15 -13
- data/lib/active_support/core_ext/array/grouping.rb +6 -6
- data/lib/active_support/core_ext/array/inquiry.rb +2 -2
- data/lib/active_support/core_ext/big_decimal/conversions.rb +1 -1
- data/lib/active_support/core_ext/class/subclasses.rb +37 -26
- data/lib/active_support/core_ext/date/blank.rb +1 -1
- data/lib/active_support/core_ext/date/calculations.rb +24 -9
- data/lib/active_support/core_ext/date/conversions.rb +16 -15
- data/lib/active_support/core_ext/date_and_time/calculations.rb +14 -4
- data/lib/active_support/core_ext/date_and_time/compatibility.rb +1 -1
- data/lib/active_support/core_ext/date_time/blank.rb +1 -1
- data/lib/active_support/core_ext/date_time/calculations.rb +4 -0
- data/lib/active_support/core_ext/date_time/conversions.rb +19 -15
- data/lib/active_support/core_ext/digest/uuid.rb +30 -13
- data/lib/active_support/core_ext/enumerable.rb +85 -83
- data/lib/active_support/core_ext/erb/util.rb +196 -0
- data/lib/active_support/core_ext/file/atomic.rb +3 -1
- data/lib/active_support/core_ext/hash/conversions.rb +1 -2
- data/lib/active_support/core_ext/hash/deep_merge.rb +22 -14
- data/lib/active_support/core_ext/hash/deep_transform_values.rb +3 -3
- data/lib/active_support/core_ext/hash/indifferent_access.rb +3 -3
- data/lib/active_support/core_ext/hash/keys.rb +4 -4
- data/lib/active_support/core_ext/integer/inflections.rb +12 -12
- data/lib/active_support/core_ext/kernel/reporting.rb +4 -4
- data/lib/active_support/core_ext/kernel/singleton_class.rb +1 -1
- data/lib/active_support/core_ext/module/attribute_accessors.rb +8 -0
- data/lib/active_support/core_ext/module/attribute_accessors_per_thread.rb +49 -22
- data/lib/active_support/core_ext/module/concerning.rb +6 -6
- data/lib/active_support/core_ext/module/delegation.rb +81 -43
- data/lib/active_support/core_ext/module/deprecation.rb +15 -12
- data/lib/active_support/core_ext/module/introspection.rb +0 -1
- data/lib/active_support/core_ext/name_error.rb +2 -8
- data/lib/active_support/core_ext/numeric/bytes.rb +9 -0
- data/lib/active_support/core_ext/numeric/conversions.rb +82 -77
- data/lib/active_support/core_ext/object/acts_like.rb +29 -5
- data/lib/active_support/core_ext/object/blank.rb +2 -2
- data/lib/active_support/core_ext/object/deep_dup.rb +17 -1
- data/lib/active_support/core_ext/object/duplicable.rb +31 -11
- data/lib/active_support/core_ext/object/inclusion.rb +13 -5
- data/lib/active_support/core_ext/object/instance_variables.rb +22 -12
- data/lib/active_support/core_ext/object/json.rb +49 -27
- data/lib/active_support/core_ext/object/to_query.rb +2 -4
- data/lib/active_support/core_ext/object/try.rb +20 -20
- data/lib/active_support/core_ext/object/with.rb +44 -0
- data/lib/active_support/core_ext/object/with_options.rb +25 -6
- data/lib/active_support/core_ext/object.rb +1 -0
- data/lib/active_support/core_ext/pathname/blank.rb +16 -0
- data/lib/active_support/core_ext/pathname/existence.rb +23 -0
- data/lib/active_support/core_ext/pathname.rb +4 -0
- data/lib/active_support/core_ext/range/compare_range.rb +0 -25
- data/lib/active_support/core_ext/range/conversions.rb +34 -13
- data/lib/active_support/core_ext/range/each.rb +1 -1
- data/lib/active_support/core_ext/range/overlap.rb +40 -0
- data/lib/active_support/core_ext/range.rb +1 -2
- data/lib/active_support/core_ext/securerandom.rb +25 -13
- data/lib/active_support/core_ext/string/conversions.rb +2 -2
- data/lib/active_support/core_ext/string/filters.rb +21 -15
- data/lib/active_support/core_ext/string/indent.rb +1 -1
- data/lib/active_support/core_ext/string/inflections.rb +17 -10
- data/lib/active_support/core_ext/string/inquiry.rb +1 -1
- data/lib/active_support/core_ext/string/output_safety.rb +85 -165
- data/lib/active_support/core_ext/symbol/starts_ends_with.rb +0 -8
- data/lib/active_support/core_ext/thread/backtrace/location.rb +12 -0
- data/lib/active_support/core_ext/time/calculations.rb +30 -8
- data/lib/active_support/core_ext/time/conversions.rb +15 -13
- data/lib/active_support/core_ext/time/zones.rb +12 -28
- data/lib/active_support/core_ext.rb +2 -1
- data/lib/active_support/current_attributes.rb +47 -20
- data/lib/active_support/deep_mergeable.rb +53 -0
- data/lib/active_support/dependencies/autoload.rb +17 -12
- data/lib/active_support/dependencies/interlock.rb +10 -18
- data/lib/active_support/dependencies/require_dependency.rb +28 -0
- data/lib/active_support/dependencies.rb +58 -788
- data/lib/active_support/deprecation/behaviors.rb +66 -40
- data/lib/active_support/deprecation/constant_accessor.rb +5 -4
- data/lib/active_support/deprecation/deprecators.rb +104 -0
- data/lib/active_support/deprecation/disallowed.rb +6 -8
- data/lib/active_support/deprecation/instance_delegator.rb +31 -4
- data/lib/active_support/deprecation/method_wrappers.rb +9 -26
- data/lib/active_support/deprecation/proxy_wrappers.rb +38 -23
- data/lib/active_support/deprecation/reporting.rb +43 -26
- data/lib/active_support/deprecation.rb +32 -5
- data/lib/active_support/deprecator.rb +7 -0
- data/lib/active_support/descendants_tracker.rb +150 -72
- data/lib/active_support/digest.rb +5 -3
- data/lib/active_support/duration/iso8601_parser.rb +3 -3
- data/lib/active_support/duration/iso8601_serializer.rb +9 -3
- data/lib/active_support/duration.rb +83 -52
- data/lib/active_support/encrypted_configuration.rb +72 -9
- data/lib/active_support/encrypted_file.rb +29 -13
- data/lib/active_support/environment_inquirer.rb +23 -3
- data/lib/active_support/error_reporter/test_helper.rb +15 -0
- data/lib/active_support/error_reporter.rb +203 -0
- data/lib/active_support/evented_file_update_checker.rb +20 -7
- data/lib/active_support/execution_context/test_helper.rb +13 -0
- data/lib/active_support/execution_context.rb +53 -0
- data/lib/active_support/execution_wrapper.rb +44 -22
- data/lib/active_support/executor/test_helper.rb +7 -0
- data/lib/active_support/file_update_checker.rb +4 -2
- data/lib/active_support/fork_tracker.rb +28 -11
- data/lib/active_support/gem_version.rb +4 -4
- data/lib/active_support/gzip.rb +2 -0
- data/lib/active_support/hash_with_indifferent_access.rb +44 -19
- data/lib/active_support/html_safe_translation.rb +53 -0
- data/lib/active_support/i18n.rb +2 -1
- data/lib/active_support/i18n_railtie.rb +21 -14
- data/lib/active_support/inflector/inflections.rb +25 -7
- data/lib/active_support/inflector/methods.rb +50 -64
- data/lib/active_support/inflector/transliterate.rb +4 -2
- data/lib/active_support/isolated_execution_state.rb +76 -0
- data/lib/active_support/json/decoding.rb +2 -1
- data/lib/active_support/json/encoding.rb +27 -45
- data/lib/active_support/key_generator.rb +31 -6
- data/lib/active_support/lazy_load_hooks.rb +33 -7
- data/lib/active_support/locale/en.yml +4 -2
- data/lib/active_support/log_subscriber/test_helper.rb +2 -2
- data/lib/active_support/log_subscriber.rb +97 -35
- data/lib/active_support/logger.rb +9 -60
- data/lib/active_support/logger_thread_safe_level.rb +11 -34
- data/lib/active_support/message_encryptor.rb +206 -56
- data/lib/active_support/message_encryptors.rb +141 -0
- data/lib/active_support/message_pack/cache_serializer.rb +23 -0
- data/lib/active_support/message_pack/extensions.rb +292 -0
- data/lib/active_support/message_pack/serializer.rb +63 -0
- data/lib/active_support/message_pack.rb +50 -0
- data/lib/active_support/message_verifier.rb +235 -84
- data/lib/active_support/message_verifiers.rb +135 -0
- data/lib/active_support/messages/codec.rb +65 -0
- data/lib/active_support/messages/metadata.rb +112 -46
- data/lib/active_support/messages/rotation_coordinator.rb +93 -0
- data/lib/active_support/messages/rotator.rb +34 -32
- data/lib/active_support/messages/serializer_with_fallback.rb +158 -0
- data/lib/active_support/multibyte/chars.rb +12 -11
- data/lib/active_support/multibyte/unicode.rb +9 -49
- data/lib/active_support/multibyte.rb +1 -1
- data/lib/active_support/notifications/fanout.rb +304 -114
- data/lib/active_support/notifications/instrumenter.rb +117 -35
- data/lib/active_support/notifications.rb +25 -25
- data/lib/active_support/number_helper/number_converter.rb +14 -7
- data/lib/active_support/number_helper/number_to_currency_converter.rb +11 -6
- data/lib/active_support/number_helper/number_to_delimited_converter.rb +1 -1
- data/lib/active_support/number_helper/number_to_human_size_converter.rb +4 -4
- data/lib/active_support/number_helper/number_to_phone_converter.rb +2 -1
- data/lib/active_support/number_helper/number_to_rounded_converter.rb +10 -6
- data/lib/active_support/number_helper/rounding_helper.rb +2 -6
- data/lib/active_support/number_helper.rb +379 -319
- data/lib/active_support/option_merger.rb +10 -18
- data/lib/active_support/ordered_hash.rb +4 -4
- data/lib/active_support/ordered_options.rb +15 -1
- data/lib/active_support/parameter_filter.rb +105 -81
- data/lib/active_support/proxy_object.rb +2 -0
- data/lib/active_support/railtie.rb +83 -21
- data/lib/active_support/reloader.rb +13 -5
- data/lib/active_support/rescuable.rb +18 -16
- data/lib/active_support/ruby_features.rb +7 -0
- data/lib/active_support/secure_compare_rotator.rb +18 -11
- data/lib/active_support/security_utils.rb +1 -1
- data/lib/active_support/string_inquirer.rb +3 -3
- data/lib/active_support/subscriber.rb +11 -40
- data/lib/active_support/syntax_error_proxy.rb +60 -0
- data/lib/active_support/tagged_logging.rb +65 -25
- data/lib/active_support/test_case.rb +166 -27
- data/lib/active_support/testing/assertions.rb +61 -15
- data/lib/active_support/testing/autorun.rb +0 -2
- data/lib/active_support/testing/constant_stubbing.rb +32 -0
- data/lib/active_support/testing/deprecation.rb +53 -2
- data/lib/active_support/testing/error_reporter_assertions.rb +107 -0
- data/lib/active_support/testing/isolation.rb +30 -29
- data/lib/active_support/testing/method_call_assertions.rb +24 -11
- data/lib/active_support/testing/parallelization/server.rb +4 -0
- data/lib/active_support/testing/parallelization/worker.rb +3 -0
- data/lib/active_support/testing/parallelization.rb +4 -0
- data/lib/active_support/testing/parallelize_executor.rb +81 -0
- data/lib/active_support/testing/setup_and_teardown.rb +2 -0
- data/lib/active_support/testing/stream.rb +4 -6
- data/lib/active_support/testing/strict_warnings.rb +39 -0
- data/lib/active_support/testing/tagged_logging.rb +1 -1
- data/lib/active_support/testing/time_helpers.rb +49 -16
- data/lib/active_support/time_with_zone.rb +39 -28
- data/lib/active_support/values/time_zone.rb +50 -18
- data/lib/active_support/version.rb +1 -1
- data/lib/active_support/xml_mini/jdom.rb +4 -11
- data/lib/active_support/xml_mini/libxml.rb +5 -5
- data/lib/active_support/xml_mini/libxmlsax.rb +1 -1
- data/lib/active_support/xml_mini/nokogiri.rb +5 -5
- data/lib/active_support/xml_mini/nokogirisax.rb +2 -2
- data/lib/active_support/xml_mini/rexml.rb +2 -2
- data/lib/active_support/xml_mini.rb +7 -6
- data/lib/active_support.rb +28 -1
- metadata +150 -18
- data/lib/active_support/core_ext/marshal.rb +0 -26
- data/lib/active_support/core_ext/range/include_time_with_zone.rb +0 -28
- data/lib/active_support/core_ext/range/overlaps.rb +0 -10
- data/lib/active_support/core_ext/uri.rb +0 -29
- data/lib/active_support/dependencies/zeitwerk_integration.rb +0 -117
- data/lib/active_support/per_thread_registry.rb +0 -60
@@ -18,378 +18,438 @@ module ActiveSupport
|
|
18
18
|
|
19
19
|
extend self
|
20
20
|
|
21
|
-
# Formats
|
22
|
-
# 123-9876). You can customize the format in the +options+ hash.
|
21
|
+
# Formats +number+ into a phone number.
|
23
22
|
#
|
24
|
-
#
|
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
|
-
#
|
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
|
-
#
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
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
|
58
|
-
#
|
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: "£", separator: ",", delimiter: "")
|
77
|
+
# # => "£1234567890,50"
|
59
78
|
#
|
60
79
|
# The currency unit and number formatting of the current locale will be used
|
61
|
-
# unless otherwise specified
|
62
|
-
#
|
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
|
66
|
-
#
|
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
|
-
#
|
71
|
-
#
|
72
|
-
#
|
73
|
-
#
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
83
|
-
#
|
84
|
-
#
|
85
|
-
#
|
86
|
-
#
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
90
|
-
#
|
91
|
-
#
|
92
|
-
#
|
93
|
-
#
|
94
|
-
#
|
95
|
-
#
|
96
|
-
#
|
97
|
-
#
|
98
|
-
#
|
99
|
-
#
|
100
|
-
#
|
101
|
-
#
|
102
|
-
#
|
103
|
-
#
|
104
|
-
#
|
105
|
-
#
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
109
|
-
#
|
110
|
-
#
|
111
|
-
#
|
112
|
-
#
|
113
|
-
#
|
114
|
-
#
|
115
|
-
#
|
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
|
+
#
|
116
139
|
def number_to_currency(number, options = {})
|
117
140
|
NumberToCurrencyConverter.convert(number, options)
|
118
141
|
end
|
119
142
|
|
120
|
-
# Formats
|
121
|
-
#
|
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%"
|
122
151
|
#
|
123
152
|
# ==== Options
|
124
153
|
#
|
125
|
-
#
|
126
|
-
#
|
127
|
-
#
|
128
|
-
#
|
129
|
-
#
|
130
|
-
#
|
131
|
-
#
|
132
|
-
# of
|
133
|
-
#
|
134
|
-
#
|
135
|
-
#
|
136
|
-
#
|
137
|
-
#
|
138
|
-
#
|
139
|
-
#
|
140
|
-
# +
|
141
|
-
#
|
142
|
-
#
|
143
|
-
#
|
144
|
-
#
|
145
|
-
#
|
146
|
-
#
|
147
|
-
#
|
148
|
-
#
|
149
|
-
#
|
150
|
-
#
|
151
|
-
#
|
152
|
-
#
|
153
|
-
#
|
154
|
-
#
|
155
|
-
#
|
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
|
+
#
|
156
201
|
def number_to_percentage(number, options = {})
|
157
202
|
NumberToPercentageConverter.convert(number, options)
|
158
203
|
end
|
159
204
|
|
160
|
-
# Formats
|
161
|
-
#
|
162
|
-
#
|
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"
|
163
214
|
#
|
164
215
|
# ==== Options
|
165
216
|
#
|
166
|
-
#
|
167
|
-
#
|
168
|
-
#
|
169
|
-
#
|
170
|
-
#
|
171
|
-
#
|
172
|
-
#
|
173
|
-
#
|
174
|
-
#
|
175
|
-
#
|
176
|
-
#
|
177
|
-
#
|
178
|
-
#
|
179
|
-
#
|
180
|
-
#
|
181
|
-
#
|
182
|
-
#
|
183
|
-
#
|
184
|
-
#
|
185
|
-
#
|
186
|
-
#
|
187
|
-
#
|
188
|
-
#
|
189
|
-
#
|
190
|
-
#
|
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
|
+
#
|
191
242
|
def number_to_delimited(number, options = {})
|
192
243
|
NumberToDelimitedConverter.convert(number, options)
|
193
244
|
end
|
194
245
|
|
195
|
-
# Formats
|
196
|
-
#
|
197
|
-
#
|
198
|
-
#
|
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"
|
199
252
|
#
|
200
253
|
# ==== Options
|
201
254
|
#
|
202
|
-
#
|
203
|
-
#
|
204
|
-
#
|
205
|
-
#
|
206
|
-
#
|
207
|
-
#
|
208
|
-
#
|
209
|
-
# of
|
210
|
-
#
|
211
|
-
#
|
212
|
-
#
|
213
|
-
#
|
214
|
-
#
|
215
|
-
#
|
216
|
-
#
|
217
|
-
#
|
218
|
-
#
|
219
|
-
#
|
220
|
-
#
|
221
|
-
#
|
222
|
-
#
|
223
|
-
#
|
224
|
-
#
|
225
|
-
#
|
226
|
-
#
|
227
|
-
#
|
228
|
-
#
|
229
|
-
#
|
230
|
-
#
|
231
|
-
#
|
232
|
-
#
|
233
|
-
#
|
234
|
-
#
|
235
|
-
#
|
236
|
-
#
|
237
|
-
#
|
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
|
+
#
|
238
298
|
def number_to_rounded(number, options = {})
|
239
299
|
NumberToRoundedConverter.convert(number, options)
|
240
300
|
end
|
241
301
|
|
242
|
-
# Formats
|
243
|
-
#
|
244
|
-
#
|
245
|
-
#
|
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"
|
246
313
|
#
|
247
|
-
# See
|
248
|
-
# generic number.
|
314
|
+
# See #number_to_human if you want to pretty-print a generic number.
|
249
315
|
#
|
250
316
|
# ==== Options
|
251
317
|
#
|
252
|
-
#
|
253
|
-
#
|
254
|
-
#
|
255
|
-
#
|
256
|
-
#
|
257
|
-
#
|
258
|
-
#
|
259
|
-
#
|
260
|
-
#
|
261
|
-
#
|
262
|
-
#
|
263
|
-
#
|
264
|
-
#
|
265
|
-
#
|
266
|
-
#
|
267
|
-
#
|
268
|
-
#
|
269
|
-
#
|
270
|
-
#
|
271
|
-
#
|
272
|
-
#
|
273
|
-
#
|
274
|
-
#
|
275
|
-
#
|
276
|
-
#
|
277
|
-
#
|
278
|
-
#
|
279
|
-
#
|
280
|
-
#
|
281
|
-
#
|
282
|
-
#
|
283
|
-
#
|
284
|
-
#
|
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
|
+
#
|
285
351
|
def number_to_human_size(number, options = {})
|
286
352
|
NumberToHumanSizeConverter.convert(number, options)
|
287
353
|
end
|
288
354
|
|
289
|
-
#
|
290
|
-
#
|
291
|
-
# Billion"). This is useful for numbers that can get very large
|
292
|
-
# (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.
|
293
357
|
#
|
294
|
-
#
|
295
|
-
#
|
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"
|
296
366
|
#
|
297
|
-
#
|
298
|
-
# to use other decimal units (e.g.: 1500 becomes "1.5
|
299
|
-
# kilometers", 0.150 becomes "150 milliliters", etc). You may
|
300
|
-
# define a wide range of unit quantifiers, even fractional ones
|
301
|
-
# (centi, deci, mili, etc).
|
367
|
+
# See #number_to_human_size if you want to pretty-print a file size.
|
302
368
|
#
|
303
369
|
# ==== Options
|
304
370
|
#
|
305
|
-
#
|
306
|
-
#
|
307
|
-
#
|
308
|
-
#
|
309
|
-
#
|
310
|
-
#
|
311
|
-
#
|
312
|
-
#
|
313
|
-
#
|
314
|
-
#
|
315
|
-
#
|
316
|
-
#
|
317
|
-
#
|
318
|
-
#
|
319
|
-
#
|
320
|
-
#
|
321
|
-
#
|
322
|
-
#
|
323
|
-
#
|
324
|
-
#
|
325
|
-
#
|
326
|
-
#
|
327
|
-
#
|
328
|
-
#
|
329
|
-
#
|
330
|
-
#
|
331
|
-
#
|
332
|
-
#
|
333
|
-
#
|
334
|
-
#
|
335
|
-
#
|
336
|
-
#
|
337
|
-
#
|
338
|
-
#
|
339
|
-
#
|
340
|
-
#
|
341
|
-
#
|
342
|
-
#
|
343
|
-
#
|
344
|
-
#
|
345
|
-
#
|
346
|
-
#
|
347
|
-
#
|
348
|
-
#
|
349
|
-
#
|
350
|
-
#
|
351
|
-
#
|
352
|
-
#
|
353
|
-
#
|
354
|
-
#
|
355
|
-
#
|
356
|
-
#
|
357
|
-
#
|
358
|
-
#
|
359
|
-
#
|
360
|
-
#
|
361
|
-
#
|
362
|
-
#
|
363
|
-
#
|
364
|
-
#
|
365
|
-
#
|
366
|
-
#
|
367
|
-
#
|
368
|
-
#
|
369
|
-
#
|
370
|
-
#
|
371
|
-
#
|
372
|
-
#
|
373
|
-
#
|
374
|
-
#
|
375
|
-
#
|
376
|
-
#
|
377
|
-
#
|
378
|
-
#
|
379
|
-
#
|
380
|
-
#
|
381
|
-
#
|
382
|
-
#
|
383
|
-
#
|
384
|
-
#
|
385
|
-
#
|
386
|
-
#
|
387
|
-
# number_to_human(543934, units: :distance) # => "544 kilometers"
|
388
|
-
# number_to_human(54393498, units: :distance) # => "54400 kilometers"
|
389
|
-
# number_to_human(54393498000, units: :distance) # => "54.4 gazillion-distance"
|
390
|
-
# number_to_human(343, units: :distance, precision: 1) # => "300 meters"
|
391
|
-
# number_to_human(1, units: :distance) # => "1 meter"
|
392
|
-
# 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
|
+
#
|
393
453
|
def number_to_human(number, options = {})
|
394
454
|
NumberToHumanConverter.convert(number, options)
|
395
455
|
end
|