CPNumberFormatter rounding mode support.

This commit is contained in:
Alexander Ljungberg
2011-06-10 11:41:23 -07:00
parent 4e9b975ca8
commit 445adcb47f
3 changed files with 58 additions and 3 deletions
+5
View File
@@ -72,6 +72,7 @@ CPRoundPlain = 1;
CPRoundDown = 2;
CPRoundUp = 3;
CPRoundBankers = 4;
_CPRoundHalfDown = 5; // Private API rounding mode used by CPNumberFormatter.
//Exceptions
CPDecimalNumberOverflowException = @"CPDecimalNumberOverflowException";
@@ -1330,6 +1331,10 @@ function CPDecimalRound(result, dcm, scale ,roundingMode)
n = result._mantissa[l];
up = (n >= 5);
break;
case _CPRoundHalfDown:
n = result._mantissa[l];
up = (n > 5);
break;
case CPRoundBankers:
n = result._mantissa[l];
if (n > 5)
+24 -3
View File
@@ -23,6 +23,7 @@
@import <Foundation/CPString.j>
@import <Foundation/CPFormatter.j>
@import <Foundation/CPDecimalNumber.j>
CPNumberFormatterNoStyle = 0;
CPNumberFormatterDecimalStyle = 1;
@@ -31,6 +32,14 @@ CPNumberFormatterPercentStyle = 3;
CPNumberFormatterScientificStyle = 4;
CPNumberFormatterSpellOutStyle = 5;
CPNumberFormatterRoundCeiling = CPRoundUp;
CPNumberFormatterRoundFloor = CPRoundDown;
CPNumberFormatterRoundDown = CPRoundDown;
CPNumberFormatterRoundUp = CPRoundUp;
CPNumberFormatterRoundHalfEven = CPRoundBankers;
CPNumberFormatterRoundHalfDown = _CPRoundHalfDown;
CPNumberFormatterRoundHalfUp = CPRoundPlain;
/*!
@ingroup foundation
@class CPNumberFormatter
@@ -41,8 +50,19 @@ CPNumberFormatterSpellOutStyle = 5;
*/
@implementation CPNumberFormatter : CPFormatter
{
CPNumberFormatterStyle _numberStyle @accessors(property=numberStyle);
CPString _perMillSymbol @accessors(property=perMillSymbol);
CPNumberFormatterStyle _numberStyle @accessors(property=numberStyle);
CPString _perMillSymbol @accessors(property=perMillSymbol);
CPNumberFormatterRoundingMode _roundingMode @accessors(property=roundingMode);
}
- (id)init
{
if (self = [super init])
{
_roundingMode = CPNumberFormatterRoundHalfUp;
}
return self;
}
- (CPString)stringFromNumber:(CPNumber)number
@@ -52,7 +72,8 @@ CPNumberFormatterSpellOutStyle = 5;
{
case CPNumberFormatterDecimalStyle:
var dcmn = [CPDecimalNumber numberWithFloat:number],
numberHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundingMode:CPRoundPlain scale:3 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
roundingMode = [self roundingMode],
numberHandler = [CPDecimalNumberHandler decimalNumberHandlerWithRoundingMode:roundingMode scale:3 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:YES];
dcmn = [dcmn decimalNumberByRoundingAccordingToBehavior:numberHandler];
+29
View File
@@ -16,4 +16,33 @@
[self assert:@"122,344.456" equals:formattedNumberString];
}
- (void)testRoundingMode
{
var numberFormatter = [[CPNumberFormatter alloc] init],
formattedNumberString;
[numberFormatter setNumberStyle:CPNumberFormatterDecimalStyle];
[numberFormatter setRoundingMode:CPNumberFormatterRoundUp];
formattedNumberString = [numberFormatter stringFromNumber:[CPNumber numberWithFloat:123.5672]];
[self assert:@"123.568" equals:formattedNumberString];
[numberFormatter setRoundingMode:CPNumberFormatterRoundDown];
formattedNumberString = [numberFormatter stringFromNumber:[CPNumber numberWithFloat:123.5679]];
[self assert:@"123.567" equals:formattedNumberString];
[numberFormatter setRoundingMode:CPNumberFormatterRoundHalfEven];
formattedNumberString = [numberFormatter stringFromNumber:[CPNumber numberWithFloat:123.5675]];
[self assert:@"123.568" equals:formattedNumberString];
formattedNumberString = [numberFormatter stringFromNumber:[CPNumber numberWithFloat:123.5665]];
[self assert:@"123.566" equals:formattedNumberString];
[numberFormatter setRoundingMode:CPNumberFormatterRoundHalfDown];
formattedNumberString = [numberFormatter stringFromNumber:[CPNumber numberWithFloat:123.5675]];
[self assert:@"123.567" equals:formattedNumberString];
[numberFormatter setRoundingMode:CPNumberFormatterRoundHalfUp];
formattedNumberString = [numberFormatter stringFromNumber:[CPNumber numberWithFloat:123.5675]];
[self assert:@"123.568" equals:formattedNumberString];
}
@end