CPNumberFormatter maximum fractional digits support. Optimise by only creating CPDecimalNumberHandler when needed and caching the result.

This commit is contained in:
Alexander Ljungberg committed 2011-06-13 23:19:06 -07:00
1 parent 91509e7d36
commit 42220e057b
1 file changed
+22 -4
+22 -4
View File
@@ -26,6 +26,10 @@
@import <Foundation/CPFormatter.j>
@import <Foundation/CPDecimalNumber.j>
#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";