Class XSD::XSDFloat
In: lib/xsd/datatypes.rb
Parent: XSDAnySimpleType

Methods

_to_s   narrow32bit   new   positive?   screen_data  

Included Modules

FloatConstants

Constants

Type = QName.new(Namespace, FloatLiteral)

Public Class methods

[Source]

     # File lib/xsd/datatypes.rb, line 306
306:   def initialize(value = nil)
307:     init(Type, value)
308:   end

Private Class methods

[Source]

     # File lib/xsd/datatypes.rb, line 362
362:   def self.positive?(value)
363:     (1 / value) > 0.0
364:   end

Private Instance methods

[Source]

     # File lib/xsd/datatypes.rb, line 338
338:   def _to_s
339:     if @data.nan?
340:       'NaN'
341:     elsif @data.infinite? == 1
342:       'INF'
343:     elsif @data.infinite? == -1
344:       '-INF'
345:     else
346:       sign = XSDFloat.positive?(@data) ? '+' : '-'
347:       sign + sprintf("%.10g", @data.abs).sub(/[eE]([+-])?0+/) { 'e' + $1 }
348:     end
349:   end

Convert to single-precision 32-bit floating point value.

[Source]

     # File lib/xsd/datatypes.rb, line 352
352:   def narrow32bit(f)
353:     if f.nan? || f.infinite?
354:       f
355:     elsif f.abs < MIN_POSITIVE_SINGLE
356:       XSDFloat.positive?(f) ? POSITIVE_ZERO : NEGATIVE_ZERO
357:     else
358:       f
359:     end
360:   end

[Source]

     # File lib/xsd/datatypes.rb, line 312
312:   def screen_data(value)
313:     # "NaN".to_f => 0 in some environment.  libc?
314:     if value.is_a?(Float)
315:       return narrow32bit(value)
316:     end
317:     str = value.to_s.strip
318:     if str == 'NaN'
319:       NaN
320:     elsif str == 'INF'
321:       POSITIVE_INF
322:     elsif str == '-INF'
323:       NEGATIVE_INF
324:     else
325:       if /^[+\-\.\deE]+$/ !~ str
326:         raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
327:       end
328:       # Float("-1.4E") might fail on some system.
329:       str << '0' if /e$/i =~ str
330:       begin
331:         return narrow32bit(Float(str))
332:       rescue ArgumentError
333:         raise ValueSpaceError.new("#{ type }: cannot accept '#{ str }'.")
334:       end
335:     end
336:   end

[Validate]