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
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
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
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
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
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
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
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
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
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
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
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
Private Instance Methods
# File lib/bson/decimal128.rb, line 186 def set_bits(low, high) @low = low @high = high end