| Class | XSD::XSDDecimal |
| In: |
lib/xsd/datatypes.rb
|
| Parent: | XSDAnySimpleType |
| Type | = | QName.new(Namespace, DecimalLiteral) |
# File lib/xsd/datatypes.rb, line 232
232: def initialize(value = nil)
233: init(Type, value)
234: end
# File lib/xsd/datatypes.rb, line 273
273: def _set(data)
274: if data.nil?
275: @sign = @point = @number = @data = nil
276: return
277: end
278: @sign, @point, @number = data
279: @data = _to_s
280: @data.freeze
281: end
0.0 -> 0; right?
# File lib/xsd/datatypes.rb, line 284
284: def _to_s
285: str = @number.dup
286: if @point.nonzero?
287: str[@number.size + @point, 0] = '.'
288: end
289: @sign + str
290: end
# File lib/xsd/datatypes.rb, line 242
242: def screen_data(d)
243: if d.is_a?(String)
244: # Integer("00012") => 10 in Ruby.
245: d.sub!(/^([+\-]?)0*(?=\d)/, "\\1")
246: end
247: screen_data_str(d)
248: end
# File lib/xsd/datatypes.rb, line 250
250: def screen_data_str(str)
251: /^([+\-]?)(\d*)(?:\.(\d*)?)?$/ =~ str.to_s.strip
252: unless Regexp.last_match
253: raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
254: end
255: sign = $1 || '+'
256: int_part = $2
257: frac_part = $3
258: int_part = '0' if int_part.empty?
259: frac_part = frac_part ? frac_part.sub(/0+$/, '') : ''
260: point = - frac_part.size
261: number = int_part + frac_part
262: # normalize
263: if sign == '+'
264: sign = ''
265: elsif sign == '-'
266: if number == '0'
267: sign = ''
268: end
269: end
270: [sign, point, number]
271: end