class BSON::Decimal128

Constants

BSON_TYPE

A Decimal128 is type 0x13 in the BSON spec.

@since 4.2.0

EXPONENT_OFFSET

Exponent offset.

@since 4.2.0

EXTENDED_JSON_KEY

Key for this type when converted to extended json.

@since 4.2.0

MAX_DIGITS_OF_PRECISION

Maximum digits of precision.

@since 4.2.0

MAX_EXPONENT

Maximum exponent.

@since 4.2.0

MIN_EXPONENT

Minimum exponent.

@since 4.2.0

NATIVE_TYPE

The native type to which this object can be converted.

@since 4.2.0

Public Class Methods

new(object) click to toggle source

Create a new Decimal128 from a BigDecimal.

@example Create a Decimal128 from a BigDecimal.

Decimal128.new(big_decimal)

@param [ String, BigDecimal ] object The BigDecimal or String to use for

instantiating a Decimal128.

@raise [ InvalidBigDecimal ] Raise error unless object argument is a BigDecimal.

@since 4.2.0

# File lib/bson/decimal128.rb, line 98
def initialize(object)
  if object.is_a?(String)
    set_bits(*Builder::FromString.new(object).bits)
  elsif object.is_a?(BigDecimal)
    set_bits(*Builder::FromBigDecimal.new(object).bits)
  else
    raise InvalidArgument.new
  end
end

Private Class Methods

from_bits(low, high) click to toggle source

Instantiate a Decimal128 from high and low bits.

@example Create a Decimal128 from high and low bits.

BSON::Decimal128.from_bits(high, low)

@param [ Integer ] high The high order bits. @param [ Integer ] low The low order bits.

@return [ BSON::Decimal128 ] The new decimal128.

@since 4.2.0

# File lib/bson/decimal128.rb, line 234
def from_bits(low, high)
  decimal = allocate
  decimal.send(:set_bits, low, high)
  decimal
end
from_bson(buffer) click to toggle source

Deserialize the decimal128 from raw BSON bytes.

@example Get the decimal128 from BSON.

Decimal128.from_bson(bson)

@param [ ByteBuffer ] buffer The byte buffer.

@return [ BSON::Decimal128 ] The decimal object.

@since 4.2.0

# File lib/bson/decimal128.rb, line 203
def from_bson(buffer)
  from_bits(*buffer.get_decimal128_bytes.unpack('Q<*'))
end
from_string(string) click to toggle source

Instantiate a Decimal128 from a string.

@example Create a Decimal128 from a string.

BSON::Decimal128.from_string("1.05E+3")

@param [ String ] string The string to parse.

@raise [ BSON::Decimal128::InvalidString ] If the provided string is invalid.

@return [ BSON::Decimal128 ] The new decimal128.

@since 4.2.0

# File lib/bson/decimal128.rb, line 219
def from_string(string)
  from_bits(*Builder::FromString.new(string).bits)
end

Public Instance Methods

==(other) click to toggle source

Check equality of the decimal128 object with another object.

@example Check if the decimal128 object is equal to the other.

decimal == other

@param [ Object ] other The object to check against.

@return [ true, false ] If the objects are equal.

@since 4.2.0

# File lib/bson/decimal128.rb, line 80
def ==(other)
  return false unless other.is_a?(Decimal128)
  @high == other.instance_variable_get(:@high) &&
      @low == other.instance_variable_get(:@low)
end
Also aliased as: eql?
as_json(*args) click to toggle source

Get the Decimal128 as JSON hash data.

@example Get the Decimal128 as a JSON hash.

decimal.as_json

@return [ Hash ] The number as a JSON hash.

@since 4.2.0

# File lib/bson/decimal128.rb, line 66
def as_json(*args)
  { EXTENDED_JSON_KEY => to_s }
end
eql?(other)
Alias for: ==
hash() click to toggle source

Get the hash value for the decimal128.

@example Get the hash value.

decimal.hash

@return [ Integer ] The hash value.

@since 4.2.0

# File lib/bson/decimal128.rb, line 130
def hash
  num = @high << 64
  num |= @low
  num.hash
end
inspect() click to toggle source

Get a nice string for use with object inspection.

@example Inspect the decimal128 object.

decimal128.inspect

@return [ String ] The decimal as a string.

@since 4.2.0

# File lib/bson/decimal128.rb, line 144
def inspect
  "BSON::Decimal128('#{to_s}')"
end
to_big_decimal() click to toggle source

Get a Ruby BigDecimal object corresponding to this Decimal128. Note that, when converting to a Ruby BigDecimal, non-zero significant digits are preserved but trailing zeroes may be lost. See the following example:

@example

decimal128 = BSON::Decimal128.new("0.200")
  => BSON::Decimal128('0.200')
big_decimal = decimal128.to_big_decimal
  => #<BigDecimal:7fc619c95388,'0.2E0',9(18)>
big_decimal.to_s
  => "0.2E0"

Note that the the BSON::Decimal128 object can represent -NaN, sNaN, and -sNaN while Ruby's BigDecimal cannot.

@return [ BigDecimal ] The decimal as a BigDecimal.

@since 4.2.0

# File lib/bson/decimal128.rb, line 180
def to_big_decimal
  @big_decimal ||= BigDecimal(to_s)
end
to_bson(buffer = ByteBuffer.new, validating_keys = Config.validating_keys?) click to toggle source

Get the decimal128 as its raw BSON data.

@example Get the raw bson bytes in a buffer.

decimal.to_bson

@return [ BSON::ByteBuffer ] The buffer with the encoded object.

@see bsonspec.org/#/specification

@since 4.2.0

# File lib/bson/decimal128.rb, line 118
def to_bson(buffer = ByteBuffer.new, validating_keys = Config.validating_keys?)
  buffer.put_decimal128(@low, @high)
end
to_s() click to toggle source

Get the string representation of the decimal128.

@example Get the decimal128 as a string.

decimal128.to_s

@return [ String ] The decimal128 as a string.

@since 4.2.0

# File lib/bson/decimal128.rb, line 156
def to_s
  @string ||= Builder::ToString.new(self).string
end
Also aliased as: to_str
to_str()
Alias for: to_s

Private Instance Methods

set_bits(low, high) click to toggle source
# File lib/bson/decimal128.rb, line 186
def set_bits(low, high)
  @low = low
  @high = high
end