Class: OpenHAB::Core::Types::DecimalType

Inherits:
Object
  • Object
show all
Includes:
NumericType
Defined in:
lib/openhab/core/types/decimal_type.rb

Overview

DecimalType uses a javajava.mathjava.math.BigDecimal internally and thus can be used for integers, longs and floating point numbers alike.

Examples:

DecimalType can be used in case statements with ranges

# Check if number item is less than 50
case NumberOne.state
when (0...50)
  logger.info("#{NumberOne} is less than 50")
when (50..100)
  logger.info("#{NumberOne} is greater than 50")
end

DecimalType can be compared directly against Numeric

if NumberOne.state > 10
  logger.info("Item #{NumberOne.name} is greater than 10")
end

DecimalType can be compared against the value of another DecimalType

if NumberOne.state > NumberTwo.state
  logger.info("Item #{NumberOne} (#{NumberOne.state}) is greater than #{NumberTwo} (#{NumberTwo.state})")
end

Direct Known Subclasses

PercentType

Instance Method Summary collapse

Methods included from NumericType

#+@, #eql?, #to_d, #to_f, #to_i

Constructor Details

#initialize(value) ⇒ DecimalType

Create a new instance of DecimalType

Parameters:

  • value (java.math.BigDecimal, Numeric)

    Create a DecimalType from the given value



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/openhab/core/types/decimal_type.rb', line 48

def initialize(*args)
  unless args.length == 1
    super
    return
  end

  value = args.first
  if value.is_a?(java.math.BigDecimal)
    super
  elsif value.is_a?(BigDecimal)
    super(value.to_java.strip_trailing_zeros)
  elsif value.is_a?(DecimalType)
    super(value.to_big_decimal)
  elsif value.respond_to?(:to_d)
    super(value.to_d.to_java.strip_trailing_zeros)
  else # rubocop:disable Lint/DuplicateBranch
    # duplicates the Java BigDecimal branch, but that needs to go first
    # in order to avoid unnecessary conversions
    super
  end
end

Instance Method Details

#-@DecimalType

Unary minus

Negates self

Returns:



130
131
132
# File 'lib/openhab/core/types/decimal_type.rb', line 130

def -@
  self.class.new(to_big_decimal.negate)
end

#<=>(other) ⇒ Integer?

Comparison

Parameters:

Returns:

  • (Integer, nil)

    -1, 0, +1 depending on whether ‘other` is less than, equal to, or greater than self

    ‘nil` is returned if the two values are incomparable.



93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/openhab/core/types/decimal_type.rb', line 93

def <=>(other)
  logger.trace("(#{self.class}) #{self} <=> #{other} (#{other.class})")
  if other.is_a?(QuantityType) || other.is_a?(HSBType)
    (other <=> self)&.-@
  elsif other.is_a?(self.class)
    compare_to(other)
  elsif other.respond_to?(:to_d)
    to_d <=> other.to_d
  elsif other.respond_to?(:coerce)
    return nil unless (lhs, rhs = other.coerce(self))

    lhs <=> rhs
  end
end

#coerce(other) ⇒ Array<(DecimalType, DecimalType)>?

Type Coercion

Coerce object to a DecimalType

Parameters:

Returns:



117
118
119
120
121
122
# File 'lib/openhab/core/types/decimal_type.rb', line 117

def coerce(other)
  logger.trace("Coercing #{self} as a request from #{other.class}")
  return unless other.respond_to?(:to_d)

  [self.class.new(other.to_d), self]
end

#|(other) ⇒ QuantityType

Convert DecimalType to a QuantityType

Parameters:

  • other (String, javax.measure.Unit)

Returns:



77
78
79
80
# File 'lib/openhab/core/types/decimal_type.rb', line 77

def |(other)
  other = org.openhab.core.types.util.UnitUtils.parse_unit(other.to_str) if other.respond_to?(:to_str)
  QuantityType.new(to_big_decimal, other)
end