Hi,

VA Smalltalk comes with ScaledDecimal, and as far as I know, it always print out the scale of a number, because it could be something like 0.5s3. And I'd guess ScaledDecimal or FixedPoint are pretty common, because the use of this class has been encouraged for the modelling of monetary amounts for decades now.

Joachim

Am 02.06.14 01:51, schrieb José Comesaña:
Hi Sven.

First of all, I know that in VisualWorks there exists a class called FixedPoint, that is (more or less) similar to ScaledDecimal (is what the class comment says). But, instead of 123.45s2, VWs writes 123.45s. NEVERTHELESS, it can read 123.45s2 with no pain.

There exists a Fraction type also in VW, which, I believe, uses the same notation as in Pharo.

I know that portability is an important issue, but, at least for me, portability from Pharo to Pharo is the most important. I depend on ScaledDecimal for an application (for storing money values -changing the storage mode is not an option now-) and need the possibility of converting it to string and reading it back. The string version is my database, that gets loaded into memory upon program start.

You can see here the changes I have made to STONReader >>#parseNumber:

parseNumber
| negated number |
negated := readStream peekFor: $-.
number := self parseNumberInteger.
(readStream peekFor: $.)
ifTrue: [ number := number + self parseNumberFraction ].
" -------------- New from here -------------- "
(readStream peekFor: $s)
ifTrue: [ | scale |
scale := self parseNumberInteger.
number := ScaledDecimal newFromNumber:  number scale: scale  ].
(readStream peekFor: $/)
ifTrue: [ | denominator |
denominator := self parseNumberInteger.
number := Fraction numerator: number denominator: denominator  ].
" -------------- to here -------------- "
((readStream peekFor: $e) or: [ readStream peekFor: $E ])
ifTrue: [ number := number * self parseNumberExponent ].
negated
ifTrue: [ number := number negated ].
self consumeWhitespace.
^ number
​
I am a newbie about STON. I don't know if it is correct, but it works for me, at least for some tests I have made. I know it needs improvements, thinking about strange strings we could receive. But I trust the writer not to create such weird things.

I could suggest another way of making the function of parseNumber (OK, OK, I know I am thinking from a Pharo-only perspective...). Seeing that number parsing always ends with this condition:

readStream atEnd not and: [ readStream peek isDigit ]

why not create a temporary string (including possibility of $e, $s, $/, even $@ ...) to that point (tmpString) and do:

number := Number readFromString: tmpString

That way, we would have a "native" parsing in each language

Hope this helps. If someone needs more information, pleas ask.

Best regards



2014-05-31 21:29 GMT+02:00 Sven Van Caekenberghe <s...@stfx.eu <mailto:s...@stfx.eu>>:

    Hi José,

    On 31 May 2014, at 01:32, José Comesaña <jose.comes...@gmail.com
    <mailto:jose.comes...@gmail.com>> wrote:

    > Wouldn't it be good if STON could save ScaledDecimals as
    12345.678s?. That way, we could read them back again as
    ScaledDecimal, instead of Float. I have tried and it seems quite
    useful.
    >
    > Regards

    That is an interesting idea and it is probably nice to have for
    those relying on ScaledDecimals.

    One of the ideas of STON is to be portable across dialects, so I
    am wondering if ScaledDecimals exists everywhere ?

    I am curious as to how you did it though, since STONReader
    basically contains its own number parser. Could you share your code ?

    Sven




--
-----------------------------------------------------------------------
Objektfabrik Joachim Tuchel          mailto:jtuc...@objektfabrik.de
Fliederweg 1                         http://www.objektfabrik.de
D-71640 Ludwigsburg                  http://joachimtuchel.wordpress.com
Telefon: +49 7141 56 10 86 0         Fax: +49 7141 56 10 86 1

Reply via email to