diff --git a/Foundation/CPNumberFormatter.j b/Foundation/CPNumberFormatter.j index 18d70b900..174db6b39 100644 --- a/Foundation/CPNumberFormatter.j +++ b/Foundation/CPNumberFormatter.j @@ -26,6 +26,10 @@ @import @import +#define UPDATE_NUMBER_HANDLER_IF_NECESSARY() if (!_numberHandler) \ + _numberHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundingMode:_roundingMode scale:_maximumFractionalDigits raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES]; +#define SET_NEEDS_NUMBER_HANDLER_UPDATE() _numberHandler = nil; + CPNumberFormatterNoStyle = 0; CPNumberFormatterDecimalStyle = 1; CPNumberFormatterCurrencyStyle = 2; @@ -54,6 +58,9 @@ CPNumberFormatterRoundHalfUp = CPRoundPlain; CPNumberFormatterStyle _numberStyle @accessors(property=numberStyle); CPString _perMillSymbol @accessors(property=perMillSymbol); CPNumberFormatterRoundingMode _roundingMode @accessors(property=roundingMode); + CPUInteger _maximumFractionalDigits @accessors(property=maximalFractionalDigits); + + CPDecimalNumberHandler _numberHandler; } - (id)init @@ -72,11 +79,10 @@ CPNumberFormatterRoundHalfUp = CPRoundPlain; switch(_numberStyle) { case CPNumberFormatterDecimalStyle: - var dcmn = [CPDecimalNumber numberWithFloat:number], - roundingMode = [self roundingMode], - numberHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundingMode:roundingMode scale:3 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES]; + UPDATE_NUMBER_HANDLER_IF_NECESSARY(); - dcmn = [dcmn decimalNumberByRoundingAccordingToBehavior:numberHandler]; + var dcmn = [CPDecimalNumber numberWithFloat:number]; + dcmn = [dcmn decimalNumberByRoundingAccordingToBehavior:_numberHandler]; var output = [dcmn descriptionWithLocale:nil], parts = [output componentsSeparatedByString:"."], // FIXME Locale specific. @@ -143,6 +149,18 @@ CPNumberFormatterRoundHalfUp = CPRoundPlain; return _perMillSymbol; } +- (void)setRoundingMode:(CPNumberFormatterRoundingMode)aRoundingMode +{ + _roundingMode = aRoundingMode; + SET_NEEDS_NUMBER_HANDLER_UPDATE(); +} + +- (void)setMaximumFractionDigits:(CPUInteger)aNumber +{ + _maximumFractionalDigits = aNumber; + SET_NEEDS_NUMBER_HANDLER_UPDATE(); +} + @end var CPNumberFormatterStyleKey = "CPNumberFormatterStyleKey";