class XSD::XSDDecimal

Constants

Type

Public Class Methods

new(value = nil) click to toggle source
# File lib/xsd/datatypes.rb, line 246
def initialize(value = nil)
  init(Type, value)
end

Public Instance Methods

nonzero?() click to toggle source
# File lib/xsd/datatypes.rb, line 250
def nonzero?
  (@number != '0')
end

Private Instance Methods

_set(data) click to toggle source
# File lib/xsd/datatypes.rb, line 287
def _set(data)
  if data.nil?
    @sign = @point = @number = @data = nil
    return
  end
  @sign, @point, @number = data
  @data = _to_s
  @data.freeze
end
_to_s() click to toggle source

0.0 -> 0; right?

# File lib/xsd/datatypes.rb, line 298
def _to_s
  str = @number.dup
  if @point.nonzero?
    str[@number.size + @point, 0] = '.'
  end
  @sign + str
end
screen_data(d) click to toggle source
# File lib/xsd/datatypes.rb, line 256
def screen_data(d)
  if d.is_a?(String)
    # Integer("00012") => 10 in Ruby.
    d.sub!(/^([+\-]?)0*(?=\d)/, "\\1")
  end
  screen_data_str(d)
end
screen_data_str(str) click to toggle source
# File lib/xsd/datatypes.rb, line 264
def screen_data_str(str)
  /^([+\-]?)(\d*)(?:\.(\d*)?)?$/ =~ str.to_s.strip
  unless Regexp.last_match
    raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
  end
  sign = $1 || '+'
  int_part = $2
  frac_part = $3
  int_part = '0' if int_part.empty?
  frac_part = frac_part ? frac_part.sub(/0+$/, '') : ''
  point = - frac_part.size
  number = int_part + frac_part
  # normalize
  if sign == '+'
    sign = ''
  elsif sign == '-'
    if number == '0'
      sign = ''
    end
  end
  [sign, point, number]
end