Class: Numeric
- Defined in:
- lib/active_support/core_ext/object/blank.rb,
lib/active_support/core_ext/object/json.rb,
lib/active_support/core_ext/numeric/time.rb,
lib/active_support/core_ext/numeric/bytes.rb,
lib/active_support/core_ext/object/duplicable.rb,
lib/active_support/core_ext/numeric/conversions.rb,
lib/active_support/core_ext/string/output_safety.rb
Overview
:nodoc:
Constant Summary collapse
- KILOBYTE =
1024
- MEGABYTE =
KILOBYTE * 1024
- GIGABYTE =
MEGABYTE * 1024
- TERABYTE =
GIGABYTE * 1024
- PETABYTE =
TERABYTE * 1024
- EXABYTE =
PETABYTE * 1024
Instance Method Summary collapse
-
#ago(time = ::Time.current) ⇒ Object
(also: #until)
Reads best without arguments: 10.minutes.ago.
-
#as_json(options = nil) ⇒ Object
:nodoc:.
-
#blank? ⇒ false
No number is blank:.
-
#bytes ⇒ Object
(also: #byte)
Enables the use of byte calculations and declarations, like 45.bytes + 2.6.megabytes.
- #days ⇒ Object (also: #day)
-
#duplicable? ⇒ Boolean
Numbers are not duplicable:.
- #exabytes ⇒ Object (also: #exabyte)
- #fortnights ⇒ Object (also: #fortnight)
- #gigabytes ⇒ Object (also: #gigabyte)
- #hours ⇒ Object (also: #hour)
- #html_safe? ⇒ Boolean
-
#in_milliseconds ⇒ Object
Used with the standard time durations, like 1.hour.in_milliseconds – so we can feed them to JavaScript functions like getTime().
- #kilobytes ⇒ Object (also: #kilobyte)
- #megabytes ⇒ Object (also: #megabyte)
- #minutes ⇒ Object (also: #minute)
- #petabytes ⇒ Object (also: #petabyte)
-
#seconds ⇒ Object
(also: #second)
Enables the use of time calculations and declarations, like 45.minutes + 2.hours + 4.years.
-
#since(time = ::Time.current) ⇒ Object
(also: #from_now)
Reads best with argument: 10.minutes.since(time).
- #terabytes ⇒ Object (also: #terabyte)
-
#to_formatted_s(format = :default, options = {}) ⇒ Object
Provides options for converting numbers into formatted strings.
- #weeks ⇒ Object (also: #week)
Instance Method Details
#ago(time = ::Time.current) ⇒ Object Also known as: until
Reads best without arguments: 10.minutes.ago
65 66 67 68 |
# File 'lib/active_support/core_ext/numeric/time.rb', line 65 def ago(time = ::Time.current) ActiveSupport::Deprecation.warn "Calling #ago or #until on a number (e.g. 5.ago) is deprecated and will be removed in the future, use 5.seconds.ago instead" time - self end |
#as_json(options = nil) ⇒ Object
:nodoc:
92 93 94 |
# File 'lib/active_support/core_ext/object/json.rb', line 92 def as_json( = nil) #:nodoc: self end |
#blank? ⇒ false
No number is blank:
1.blank? # => false
0.blank? # => false
128 129 130 |
# File 'lib/active_support/core_ext/object/blank.rb', line 128 def blank? false end |
#bytes ⇒ Object Also known as: byte
Enables the use of byte calculations and declarations, like 45.bytes + 2.6.megabytes
10 11 12 |
# File 'lib/active_support/core_ext/numeric/bytes.rb', line 10 def bytes self end |
#days ⇒ Object Also known as: day
49 50 51 |
# File 'lib/active_support/core_ext/numeric/time.rb', line 49 def days ActiveSupport::Duration.new(self * 24.hours, [[:days, self]]) end |
#duplicable? ⇒ Boolean
Numbers are not duplicable:
3.duplicable? # => false
3.dup # => TypeError: can't dup Fixnum
74 75 76 |
# File 'lib/active_support/core_ext/object/duplicable.rb', line 74 def duplicable? false end |
#exabytes ⇒ Object Also known as: exabyte
40 41 42 |
# File 'lib/active_support/core_ext/numeric/bytes.rb', line 40 def exabytes self * EXABYTE end |
#fortnights ⇒ Object Also known as: fortnight
59 60 61 |
# File 'lib/active_support/core_ext/numeric/time.rb', line 59 def fortnights ActiveSupport::Duration.new(self * 2.weeks, [[:days, self * 14]]) end |
#gigabytes ⇒ Object Also known as: gigabyte
25 26 27 |
# File 'lib/active_support/core_ext/numeric/bytes.rb', line 25 def gigabytes self * GIGABYTE end |
#hours ⇒ Object Also known as: hour
44 45 46 |
# File 'lib/active_support/core_ext/numeric/time.rb', line 44 def hours ActiveSupport::Duration.new(self * 3600, [[:seconds, self * 3600]]) end |
#html_safe? ⇒ Boolean
118 119 120 |
# File 'lib/active_support/core_ext/string/output_safety.rb', line 118 def html_safe? true end |
#in_milliseconds ⇒ Object
Used with the standard time durations, like 1.hour.in_milliseconds – so we can feed them to JavaScript functions like getTime().
84 85 86 |
# File 'lib/active_support/core_ext/numeric/time.rb', line 84 def in_milliseconds self * 1000 end |
#kilobytes ⇒ Object Also known as: kilobyte
15 16 17 |
# File 'lib/active_support/core_ext/numeric/bytes.rb', line 15 def kilobytes self * KILOBYTE end |
#megabytes ⇒ Object Also known as: megabyte
20 21 22 |
# File 'lib/active_support/core_ext/numeric/bytes.rb', line 20 def megabytes self * MEGABYTE end |
#minutes ⇒ Object Also known as: minute
39 40 41 |
# File 'lib/active_support/core_ext/numeric/time.rb', line 39 def minutes ActiveSupport::Duration.new(self * 60, [[:seconds, self * 60]]) end |
#petabytes ⇒ Object Also known as: petabyte
35 36 37 |
# File 'lib/active_support/core_ext/numeric/bytes.rb', line 35 def petabytes self * PETABYTE end |
#seconds ⇒ Object Also known as: second
Enables the use of time calculations and declarations, like 45.minutes + 2.hours + 4.years.
These methods use Time#advance for precise date calculations when using from_now, ago, etc. as well as adding or subtracting their results from a Time object. For example:
# equivalent to Time.current.advance(months: 1)
1.month.from_now
# equivalent to Time.current.advance(years: 2)
2.years.from_now
# equivalent to Time.current.advance(months: 4, years: 5)
(4.months + 5.years).from_now
While these methods provide precise calculation when used as in the examples above, care should be taken to note that this is not true if the result of ‘months’, ‘years’, etc is converted before use:
# equivalent to 30.days.to_i.from_now
1.month.to_i.from_now
# equivalent to 365.25.days.to_f.from_now
1.year.to_f.from_now
In such cases, Ruby’s core Date and Time should be used for precision date and time arithmetic.
34 35 36 |
# File 'lib/active_support/core_ext/numeric/time.rb', line 34 def seconds ActiveSupport::Duration.new(self, [[:seconds, self]]) end |
#since(time = ::Time.current) ⇒ Object Also known as: from_now
Reads best with argument: 10.minutes.since(time)
74 75 76 77 |
# File 'lib/active_support/core_ext/numeric/time.rb', line 74 def since(time = ::Time.current) ActiveSupport::Deprecation.warn "Calling #since or #from_now on a number (e.g. 5.since) is deprecated and will be removed in the future, use 5.seconds.since instead" time + self end |
#terabytes ⇒ Object Also known as: terabyte
30 31 32 |
# File 'lib/active_support/core_ext/numeric/bytes.rb', line 30 def terabytes self * TERABYTE end |
#to_formatted_s(format = :default, options = {}) ⇒ Object
Provides options for converting numbers into formatted strings. Options are provided for phone numbers, currency, percentage, precision, positional notation, file size and pretty printing.
Options
For details on which formats use which options, see ActiveSupport::NumberHelper
Examples
Phone Numbers:
5551234.to_s(:phone) # => 555-1234
1235551234.to_s(:phone) # => 123-555-1234
1235551234.to_s(:phone, area_code: true) # => (123) 555-1234
1235551234.to_s(:phone, delimiter: ' ') # => 123 555 1234
1235551234.to_s(:phone, area_code: true, extension: 555) # => (123) 555-1234 x 555
1235551234.to_s(:phone, country_code: 1) # => +1-123-555-1234
1235551234.to_s(:phone, country_code: 1, extension: 1343, delimiter: '.')
# => +1.123.555.1234 x 1343
Currency:
1234567890.50.to_s(:currency) # => $1,234,567,890.50
1234567890.506.to_s(:currency) # => $1,234,567,890.51
1234567890.506.to_s(:currency, precision: 3) # => $1,234,567,890.506
1234567890.506.to_s(:currency, locale: :fr) # => 1 234 567 890,51 €
-1234567890.50.to_s(:currency, negative_format: '(%u%n)')
# => ($1,234,567,890.50)
1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '')
# => £1234567890,50
1234567890.50.to_s(:currency, unit: '£', separator: ',', delimiter: '', format: '%n %u')
# => 1234567890,50 £
Percentage:
100.to_s(:percentage) # => 100.000%
100.to_s(:percentage, precision: 0) # => 100%
1000.to_s(:percentage, delimiter: '.', separator: ',') # => 1.000,000%
302.24398923423.to_s(:percentage, precision: 5) # => 302.24399%
1000.to_s(:percentage, locale: :fr) # => 1 000,000%
100.to_s(:percentage, format: '%n %') # => 100 %
Delimited:
12345678.to_s(:delimited) # => 12,345,678
12345678.05.to_s(:delimited) # => 12,345,678.05
12345678.to_s(:delimited, delimiter: '.') # => 12.345.678
12345678.to_s(:delimited, delimiter: ',') # => 12,345,678
12345678.05.to_s(:delimited, separator: ' ') # => 12,345,678 05
12345678.05.to_s(:delimited, locale: :fr) # => 12 345 678,05
98765432.98.to_s(:delimited, delimiter: ' ', separator: ',')
# => 98 765 432,98
Rounded:
111.2345.to_s(:rounded) # => 111.235
111.2345.to_s(:rounded, precision: 2) # => 111.23
13.to_s(:rounded, precision: 5) # => 13.00000
389.32314.to_s(:rounded, precision: 0) # => 389
111.2345.to_s(:rounded, significant: true) # => 111
111.2345.to_s(:rounded, precision: 1, significant: true) # => 100
13.to_s(:rounded, precision: 5, significant: true) # => 13.000
111.234.to_s(:rounded, locale: :fr) # => 111,234
13.to_s(:rounded, precision: 5, significant: true, strip_insignificant_zeros: true)
# => 13
389.32314.to_s(:rounded, precision: 4, significant: true) # => 389.3
1111.2345.to_s(:rounded, precision: 2, separator: ',', delimiter: '.')
# => 1.111,23
Human-friendly size in Bytes:
123.to_s(:human_size) # => 123 Bytes
1234.to_s(:human_size) # => 1.21 KB
12345.to_s(:human_size) # => 12.1 KB
1234567.to_s(:human_size) # => 1.18 MB
1234567890.to_s(:human_size) # => 1.15 GB
1234567890123.to_s(:human_size) # => 1.12 TB
1234567.to_s(:human_size, precision: 2) # => 1.2 MB
483989.to_s(:human_size, precision: 2) # => 470 KB
1234567.to_s(:human_size, precision: 2, separator: ',') # => 1,2 MB
1234567890123.to_s(:human_size, precision: 5) # => "1.1229 TB"
524288000.to_s(:human_size, precision: 5) # => "500 MB"
Human-friendly format:
123.to_s(:human) # => "123"
1234.to_s(:human) # => "1.23 Thousand"
12345.to_s(:human) # => "12.3 Thousand"
1234567.to_s(:human) # => "1.23 Million"
1234567890.to_s(:human) # => "1.23 Billion"
1234567890123.to_s(:human) # => "1.23 Trillion"
1234567890123456.to_s(:human) # => "1.23 Quadrillion"
1234567890123456789.to_s(:human) # => "1230 Quadrillion"
489939.to_s(:human, precision: 2) # => "490 Thousand"
489939.to_s(:human, precision: 4) # => "489.9 Thousand"
1234567.to_s(:human, precision: 4,
significant: false) # => "1.2346 Million"
1234567.to_s(:human, precision: 1,
separator: ',',
significant: false) # => "1,2 Million"
100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
# File 'lib/active_support/core_ext/numeric/conversions.rb', line 100 def to_formatted_s(format = :default, = {}) case format when :phone return ActiveSupport::NumberHelper.number_to_phone(self, ) when :currency return ActiveSupport::NumberHelper.number_to_currency(self, ) when :percentage return ActiveSupport::NumberHelper.number_to_percentage(self, ) when :delimited return ActiveSupport::NumberHelper.number_to_delimited(self, ) when :rounded return ActiveSupport::NumberHelper.number_to_rounded(self, ) when :human return ActiveSupport::NumberHelper.number_to_human(self, ) when :human_size return ActiveSupport::NumberHelper.number_to_human_size(self, ) else self.to_default_s end end |
#weeks ⇒ Object Also known as: week
54 55 56 |
# File 'lib/active_support/core_ext/numeric/time.rb', line 54 def weeks ActiveSupport::Duration.new(self * 7.days, [[:days, self * 7]]) end |