5.3 printShowingDecimalPlaces: 2 displays '5.29' insteadof'5.30'

Sebastian Sastre ssastre at seaswork.com
Thu Nov 22 20:39:10 UTC 2007


Ok, don't beat me.. I'm not proud of this but I have to use until I manage
to have something better.
 
String>>asScaledDecimal: aQuantityOfDigits
 "Answers the scaled decimal with aQuantityOfDigits 
 of precision represented by the receiver."
 
 ^ [:number|
  number isZero
   ifTrue:[0 asFloat asScaledDecimal: aQuantityOfDigits]
   ifFalse:[number asScaledDecimal: aQuantityOfDigits]] value: self asNumber

 
so my converter can do this depending on it's own configuration (not only
used for money):
 
MVPNumberToText>>rightToLeft: aString
 "Answers the result of converting aString to a Number or aScaledDecimal."
 
 ^self hasInputDigits
  ifTrue:[aString asScaledDecimal: inputDigits]
  ifFalse:[aString asNumber]
 
Adding the horrible hack:
 
ScaledDecimal>>printOn: aStream 
 "Reimplementation - Object 'printing' method."
 | aFraction tmpFractionPart |
 self < 0 ifTrue: [aStream nextPut: $-].
 aFraction := fraction abs.
 aStream nextPutAll: aFraction rounded printString.
 scale = 0 ifTrue: [^ aStream nextPutAll: 's0'].
 aStream nextPut: $..
 tmpFractionPart := aFraction fractionPart.
 1 to: scale
  do: 
   [:dummy | 
   tmpFractionPart := tmpFractionPart * 10.
   (10 <= tmpFractionPart rounded)
    ifTrue:[aStream nextPut: $0]
    ifFalse:[aStream nextPut: (Character digitValue: tmpFractionPart
rounded)].
   tmpFractionPart := tmpFractionPart fractionPart].
 
I was able to make the values to behave,
 
    thanks,
 
Sebastian Sastre

 


  _____  

De: squeak-dev-bounces at lists.squeakfoundation.org
[mailto:squeak-dev-bounces at lists.squeakfoundation.org] En nombre de tim
Rowledge
Enviado el: Jueves, 22 de Noviembre de 2007 17:10
Para: The general-purpose Squeak developers list
Asunto: Re: 5.3 printShowingDecimalPlaces: 2 displays '5.29' insteadof'5.30'



On 22-Nov-07, at 11:00 AM, Sebastian Sastre wrote:


Thanks Tim,
    
    may be I should clarify that it's only for presentation. The mone value
is stored as anMeasure of it's monetary unit in the Aconcagua framework.
 
    But I'm curious about your answer. Let's supose the user enters in some
input widget with keyboard the '5.30' value. That will end as a Float at
some point. Do you suggest I convert that to a ScaledDecimal? (to
store/comare, etc)?
 
    I'm evaluating this:
 
 (5.3 asScaledDecimal: 2) 

    and also obtainig:  ' 5.29s2'


That must surely count as a bug and I'd hazard a guess that it happens
because some code is comparing floats; I've not looked at the code but I've
seen it too many times not to suspect it.

As for your input widget, I'd try to make it give you the string and
directly convert that to a 2dp scaled decimal rather than letting it give
you a float. If there isn't a String>asScaledFloat: type method then I guess
you get to write it :-)



tim
--
tim Rowledge; tim at rowledge.org; http://www.rowledge.org/tim
All the simple programs have been written, and all the good names taken.



-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20071122/74cff927/attachment.htm


More information about the Squeak-dev mailing list