xquery/XQuery__XQueryNumberFormatter.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 02 Jul 2018 08:46:01 +0200
changeset 305 bad21c4f64bf
parent 296 ea3dbc023c80
permissions -rw-r--r--
Tagged Smalltalk/X 8.0.0

"{ Package: 'stx:goodies/xmlsuite/xquery' }"

"{ NameSpace: XQuery }"

Object subclass:#XQueryNumberFormatter
	instanceVariableNames:'number exponent mantissa fractionDigits'
	classVariableNames:''
	poolDictionaries:''
	category:'XQuery-Types'
!


!XQueryNumberFormatter class methodsFor:'instance creation'!

withValue: value
    ^ (self new)
        number: value;
        yourself.

    "Created: / 10-11-2009 / 17:12:17 / Jan Kurs <kursj1@fel.cvut.cz>"
! !

!XQueryNumberFormatter class methodsFor:'number formatting'!

toCanonicalLexicalForm: value
    ^ (self withValue: value) toCanonicalLexicalForm.

    "Created: / 17-11-2009 / 18:25:50 / Jan Kurs <kursj1@fel.cvut.cz>"
! !

!XQueryNumberFormatter methodsFor:'accessing'!

exponent
    exponent ifNil:
    [
        self setExponentAndMantissa.
    ].

    ^ exponent.

    "Created: / 10-11-2009 / 17:02:16 / Jan Kurs <kursj1@fel.cvut.cz>"
!

fractionDigits
    | num digits |

    num := number abs.
    digits := 0.

    [ (num fractionPart < 0.000001)] whileFalse:
    [
        digits := digits + 1.
        num := number abs * (10 raisedTo: digits).
    ].

    ^ digits.

    "Created: / 10-11-2009 / 17:06:23 / Jan Kurs <kursj1@fel.cvut.cz>"
    "Modified: / 17-11-2009 / 19:08:10 / Jan Kurs <kursj1@fel.cvut.cz>"
!

mantissa
    mantissa ifNil:
    [
        self setExponentAndMantissa.
"/        | scientificNotation expPosition |
"/        "TODO: this is ugly and dirty solution - should be rewritten"
"/        scientificNotation := number printStringFormat: '%E'.
"/        expPosition := scientificNotation findFirst: [:char | char = $E ].
"/
"/        ^ (scientificNotation copyFrom: 1 to: (expPosition - 1)) asNumber.
    ].

    ^ mantissa.

    "Created: / 10-11-2009 / 17:03:35 / Jan Kurs <kursj1@fel.cvut.cz>"
!

number
    ^ number
!

number:something
    number := something.
! !

!XQueryNumberFormatter methodsFor:'accessing - private'!

setExponentAndMantissa
    | exp inc num |
    num := number.
    exp := 0.

    (number abs < 1) ifTrue: [
        inc := -1.
    ] ifFalse: [
        inc := 1.
    ].

    (number = 0.0) ifFalse:
    [
        [num abs >= 1 and: [num abs < 10]] whileFalse:
        [
            num := num * (10 raisedTo: (0 - inc)).
            exp := exp + inc.
        ].
    ].

    mantissa := num.
    exponent := exp.

    "Created: / 10-11-2009 / 17:18:28 / Jan Kurs <kursj1@fel.cvut.cz>"
    "Modified: / 17-11-2009 / 18:54:51 / Jan Kurs <kursj1@fel.cvut.cz>"
! !

!XQueryNumberFormatter methodsFor:'number formatting'!

isStandardNumber
    ^ ((number isNil) or: [number isNaN] or: [number isInfinite]) not.

    "Created: / 16-11-2009 / 18:18:17 / Jan Kurs <kursj1@fel.cvut.cz>"
!

nonStandardCanonicalLexicalForm
    self subclassResponsibility.

    "Created: / 16-11-2009 / 18:19:20 / Jan Kurs <kursj1@fel.cvut.cz>"
    "Modified: / 17-11-2009 / 17:36:31 / Jan Kurs <kursj1@fel.cvut.cz>"
!

standardCanonicalLexicalForm
    self subclassResponsibility.

    "Created: / 16-11-2009 / 18:19:11 / Jan Kurs <kursj1@fel.cvut.cz>"
    "Modified: / 17-11-2009 / 17:36:45 / Jan Kurs <kursj1@fel.cvut.cz>"
!

toCanonicalLexicalForm
    self isStandardNumber ifTrue:
    [
        ^ self standardCanonicalLexicalForm.
    ]
    ifFalse:
    [
        ^ self nonStandardCanonicalLexicalForm.
    ]

    "Created: / 17-11-2009 / 18:18:36 / Jan Kurs <kursj1@fel.cvut.cz>"
! !

!XQueryNumberFormatter class methodsFor:'documentation'!

version_SVN
    ^ '$Id$'
! !