24 @
typedef CPNumberFormatterStyle
32 @
typedef CPNumberFormatterRoundingMode
43 #define SET_NEEDS_NUMBER_HANDLER_UPDATE() _numberHandler = nil 55 CPNumberFormatterStyle _numberStyle;
58 CPNumberFormatterRoundingMode _roundingMode;
59 CPUInteger _minimumFractionDigits;
60 CPUInteger _maximumFractionDigits;
65 BOOL _generatesDecimalNumbers;
74 if (
self = [super
init])
77 _minimumFractionDigits = 0;
78 _maximumFractionDigits = 0;
79 _groupingSeparator =
@",";
80 _generatesDecimalNumbers = YES;
85 _currencyCode =
@"USD";
86 _currencySymbol =
@"$";
102 switch (_numberStyle)
107 [
self _updateNumberHandlerIfNecessary];
109 dcmn = [dcmn decimalNumberByRoundingAccordingToBehavior:_numberHandler];
111 var output = [dcmn descriptionWithLocale:nil],
113 parts = output.match(
NumberRegex) || ["", undefined, "", undefined, undefined],
114 negativePrefix = parts[1] ||
"",
115 preFraction = parts[2] ||
"",
116 fraction = parts[4] ||
"",
117 preFractionLength = [preFraction length],
120 while (fraction.length < _minimumFractionDigits)
125 if (_groupingSeparator)
127 for (var commaPosition = 3, prefLength = [preFraction length]; commaPosition < prefLength; commaPosition += 4)
129 preFraction = [preFraction stringByReplacingCharactersInRange:CPMakeRange(prefLength - commaPosition, 0) withString:_groupingSeparator];
134 var
string = preFraction;
137 string +=
"." + fraction;
142 string = _currencySymbol + string;
144 string = _currencyCode + string;
151 string = negativePrefix + string;
160 + (
CPString)localizedStringFromNumber:(
CPNumber)num numberStyle:(CPNumberFormatterStyle)localizationStyle
163 [formatter setNumberStyle:localizationStyle];
165 return [formatter stringFromNumber:num];
170 if (_generatesDecimalNumbers)
173 return parseFloat(aString);
178 if ([anObject isKindOfClass:[
CPNumber class]])
181 return [anObject description];
184 - (
CPString)editingStringForObjectValue:(
id)anObject
189 - (BOOL)getObjectValue:(idRef)anObjectRef forString:(
CPString)aString errorDescription:(CPStringRef)anErrorRef
194 @deref(anObjectRef) = nil;
202 if (!isFinite(value))
203 error =
@"Value is not a number";
204 else if (_minimum !== nil && value < _minimum)
205 error =
@"Value is less than the minimum allowed value";
206 else if (_maximum !== nil && value > _maximum)
207 error =
@"Value is greater than the maximum allowed value";
212 @deref(anErrorRef) = error;
217 @deref(anObjectRef) = value;
222 - (void)setNumberStyle:(CPNumberFormatterStyle)aStyle
224 _numberStyle = aStyle;
229 _minimumFractionDigits = 0;
230 _maximumFractionDigits = 3;
235 _minimumFractionDigits = 2;
236 _maximumFractionDigits = 2;
242 - (void)setRoundingMode:(CPNumberFormatterRoundingMode)aRoundingMode
244 _roundingMode = aRoundingMode;
248 - (void)setMinimumFractionDigits:(CPUInteger)aNumber
250 _minimumFractionDigits = aNumber;
254 - (void)setMaximumFractionDigits:(CPUInteger)aNumber
256 _maximumFractionDigits = aNumber;
260 - (void)setMinimum:(CPUInteger)aNumber
266 - (void)setMaximum:(CPUInteger)aNumber
274 - (void)_updateNumberHandlerIfNecessary
278 scale:_maximumFractionDigits
306 _numberStyle = [aCoder decodeIntForKey:CPNumberFormatterStyleKey];
307 _minimumFractionDigits = [aCoder decodeIntForKey:CPNumberFormatterMinimumFractionDigitsKey];
308 _maximumFractionDigits = [aCoder decodeIntForKey:CPNumberFormatterMaximumFractionDigitsKey];
309 _roundingMode = [aCoder decodeIntForKey:CPNumberFormatterRoundingModeKey];
310 _groupingSeparator = [aCoder decodeObjectForKey:CPNumberFormatterGroupingSeparatorKey];
311 _currencyCode = [aCoder decodeObjectForKey:CPNumberFormatterCurrencyCodeKey];
312 _currencySymbol = [aCoder decodeObjectForKey:CPNumberFormatterCurrencySymbolKey];
313 _generatesDecimalNumbers = [aCoder decodeBoolForKey:CPNumberFormatterGeneratesDecimalNumbers];
317 _minimum = [aCoder decodeObjectForKey:CPNumberFormatterMinimumKey];
318 _maximum = [aCoder decodeObjectForKey:CPNumberFormatterMaximumKey];
328 [aCoder encodeInt:_numberStyle forKey:CPNumberFormatterStyleKey];
329 [aCoder encodeInt:_minimumFractionDigits forKey:CPNumberFormatterMinimumFractionDigitsKey];
330 [aCoder encodeInt:_maximumFractionDigits forKey:CPNumberFormatterMaximumFractionDigitsKey];
331 [aCoder encodeInt:_minimum forKey:CPNumberFormatterMinimumKey];
332 [aCoder encodeInt:_maximum forKey:CPNumberFormatterMaximumKey];
333 [aCoder encodeInt:_roundingMode forKey:CPNumberFormatterRoundingModeKey];
334 [aCoder encodeObject:_groupingSeparator forKey:CPNumberFormatterGroupingSeparatorKey];
335 [aCoder encodeObject:_currencyCode forKey:CPNumberFormatterCurrencyCodeKey];
336 [aCoder encodeObject:_currencySymbol forKey:CPNumberFormatterCurrencySymbolKey];
337 [aCoder encodeBool:_generatesDecimalNumbers forKey:CPNumberFormatterGeneratesDecimalNumbers];
347 - (CPNumberFormatterStyle)numberStyle
355 - (void)setNumberStyle:(CPNumberFormatterStyle)aValue
357 _numberStyle = aValue;
365 return _perMillSymbol;
373 _perMillSymbol = aValue;
381 return _groupingSeparator;
389 _groupingSeparator = aValue;
395 - (CPNumberFormatterRoundingMode)roundingMode
397 return _roundingMode;
403 - (void)setRoundingMode:(CPNumberFormatterRoundingMode)aValue
405 _roundingMode = aValue;
411 - (CPUInteger)minimumFractionDigits
413 return _minimumFractionDigits;
419 - (void)setMinimumFractionDigits:(CPUInteger)aValue
421 _minimumFractionDigits = aValue;
427 - (CPUInteger)maximumFractionDigits
429 return _maximumFractionDigits;
435 - (void)setMaximumFractionDigits:(CPUInteger)aValue
437 _maximumFractionDigits = aValue;
443 - (CPUInteger)minimum
451 - (void)setMinimum:(CPUInteger)aValue
459 - (CPUInteger)maximum
467 - (void)setMaximum:(CPUInteger)aValue
477 return _currencyCode;
485 _currencyCode = aValue;
493 return _currencySymbol;
501 _currencySymbol = aValue;
507 - (BOOL)generatesDecimalNumbers
509 return _generatesDecimalNumbers;
515 - (void)setGeneratesDecimalNumbers:(BOOL)aValue
517 _generatesDecimalNumbers = aValue;
CPDecimalNumber decimalNumberWithString:(CPString numberValue)
An immutable string (collection of characters).
Decimal floating point number.
Decimal floating point number exception and rounding behavior. This class is mutable.
BOOL isKindOfClass:(Class aClass)
Defines methods for use when archiving & restoring (enc/decoding).
id decimalNumberHandlerWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:(CPRoundingMode roundingMode, [scale] short scale, [raiseOnExactness] BOOL exact, [raiseOnOverflow] BOOL overflow, [raiseOnUnderflow] BOOL underflow, [raiseOnDivideByZero] BOOL divideByZero)
CPRoundingMode CPRoundPlain
A bridged object to native Javascript numbers.