26 #define UPDATE_NUMBER_HANDLER_IF_NECESSARY() if (!_numberHandler) \
27 _numberHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundingMode:_roundingMode scale:_maximumFractionDigits raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
28 #define SET_NEEDS_NUMBER_HANDLER_UPDATE() _numberHandler = nil;
55 CPNumberFormatterStyle _numberStyle;
58 CPNumberFormatterRoundingMode _roundingMode;
59 CPUInteger _minimumFractionDigits;
60 CPUInteger _maximumFractionDigits;
63 BOOL _generatesDecimalNumbers;
72 if (
self = [super init])
75 _minimumFractionDigits = 0;
76 _maximumFractionDigits = 0;
77 _groupingSeparator =
@",";
78 _generatesDecimalNumbers = YES;
81 _currencyCode =
@"USD";
82 _currencySymbol =
@"$";
105 dcmn = [dcmn decimalNumberByRoundingAccordingToBehavior:_numberHandler];
107 var output = [dcmn descriptionWithLocale:nil],
108 parts = [output componentsSeparatedByString:"."],
109 preFraction = parts[0],
110 fraction = parts.length > 1 ? parts[1] :
"",
111 preFractionLength = [preFraction length],
114 while (fraction.length < _minimumFractionDigits)
119 if (_groupingSeparator)
121 for (var commaPosition = 3, prefLength = [preFraction length]; commaPosition < prefLength; commaPosition += 4)
123 preFraction = [preFraction stringByReplacingCharactersInRange:CPMakeRange(prefLength - commaPosition, 0) withString:_groupingSeparator];
128 var
string = preFraction;
130 string +=
"." + fraction;
135 string = _currencySymbol + string;
137 string = _currencyCode + string;
153 if (_generatesDecimalNumbers)
156 return parseFloat(aString);
161 if ([anObject isKindOfClass:[
CPNumber class]])
164 return [anObject description];
167 - (
CPString)editingStringForObjectValue:(
id)anObject
172 - (BOOL)getObjectValue:(
id)anObject forString:(
CPString)aString errorDescription:(
CPString)anError
176 AT_DEREF(anObject, value);
181 - (void)setNumberStyle:(CPNumberFormatterStyle)aStyle
183 _numberStyle = aStyle;
188 _minimumFractionDigits = 0;
189 _maximumFractionDigits = 3;
193 _minimumFractionDigits = 2;
194 _maximumFractionDigits = 2;
200 - (void)setRoundingMode:(CPNumberFormatterRoundingMode)aRoundingMode
202 _roundingMode = aRoundingMode;
206 - (void)setMinimumFractionDigits:(CPUInteger)aNumber
208 _minimumFractionDigits = aNumber;
212 - (void)setMaximumFractionDigits:(CPUInteger)aNumber
214 _maximumFractionDigits = aNumber;
237 _numberStyle = [aCoder decodeIntForKey:CPNumberFormatterStyleKey];
238 _minimumFractionDigits = [aCoder decodeIntForKey:CPNumberFormatterMinimumFractionDigitsKey];
239 _maximumFractionDigits = [aCoder decodeIntForKey:CPNumberFormatterMaximumFractionDigitsKey];
240 _roundingMode = [aCoder decodeIntForKey:CPNumberFormatterRoundingModeKey];
241 _groupingSeparator = [aCoder decodeObjectForKey:CPNumberFormatterGroupingSeparatorKey];
242 _currencyCode = [aCoder decodeObjectForKey:CPNumberFormatterCurrencyCodeKey];
243 _currencySymbol = [aCoder decodeObjectForKey:CPNumberFormatterCurrencySymbolKey];
244 _generatesDecimalNumbers = [aCoder decodeBoolForKey:CPNumberFormatterGeneratesDecimalNumbers];
254 [aCoder encodeInt:_numberStyle forKey:CPNumberFormatterStyleKey];
255 [aCoder encodeInt:_minimumFractionDigits forKey:CPNumberFormatterMinimumFractionDigitsKey];
256 [aCoder encodeInt:_maximumFractionDigits forKey:CPNumberFormatterMaximumFractionDigitsKey];
257 [aCoder encodeInt:_roundingMode forKey:CPNumberFormatterRoundingModeKey];
258 [aCoder encodeObject:_groupingSeparator forKey:CPNumberFormatterGroupingSeparatorKey];
259 [aCoder encodeObject:_currencyCode forKey:CPNumberFormatterCurrencyCodeKey];
260 [aCoder encodeObject:_currencySymbol forKey:CPNumberFormatterCurrencySymbolKey];
261 [aCoder encodeBool:_generatesDecimalNumbers forKey:CPNumberFormatterGeneratesDecimalNumbers];
271 - (CPNumberFormatterStyle)numberStyle
279 - (void)setNumberStyle:(CPNumberFormatterStyle)aValue
281 _numberStyle = aValue;
289 return _perMillSymbol;
297 _perMillSymbol = aValue;
305 return _groupingSeparator;
313 _groupingSeparator = aValue;
319 - (CPNumberFormatterRoundingMode)roundingMode
321 return _roundingMode;
327 - (void)setRoundingMode:(CPNumberFormatterRoundingMode)aValue
329 _roundingMode = aValue;
335 - (CPUInteger)minimumFractionDigits
337 return _minimumFractionDigits;
343 - (void)setMinimumFractionDigits:(CPUInteger)aValue
345 _minimumFractionDigits = aValue;
351 - (CPUInteger)maximumFractionDigits
353 return _maximumFractionDigits;
359 - (void)setMaximumFractionDigits:(CPUInteger)aValue
361 _maximumFractionDigits = aValue;
369 return _currencyCode;
377 _currencyCode = aValue;
385 return _currencySymbol;
393 _currencySymbol = aValue;
399 - (BOOL)generatesDecimalNumbers
401 return _generatesDecimalNumbers;
407 - (void)setGeneratesDecimalNumbers:(BOOL)aValue
409 _generatesDecimalNumbers = aValue;