Fixes #1721. Fixed: bad negative numbers from CPNumberFormatter.

Without this fix, CPNumberFormatter didn't format negative values well. E.g. with thousands separators on it could generate, "-,999.00".

This fix generally improves handling of negative numbers by CPNumberFormatter.
This commit is contained in:
Alexander Ljungberg committed 2013-01-23 22:23:50 +00:00
1 parent fcad7a7fe4
commit 1f0ab2ab49
2 files changed
+22 -5

No files matched your search

+10 -5
View File
@@ -45,6 +45,8 @@ CPNumberFormatterRoundHalfEven = CPRoundBankers;
CPNumberFormatterRoundHalfDown = _CPRoundHalfDown;
CPNumberFormatterRoundHalfUp = CPRoundPlain;
var NumberRegex = new RegExp('(-)?(\\d*)(\\.(\\d*))?');
/*!
@ingroup foundation
@class CPNumberFormatter
@@ -108,9 +110,11 @@ CPNumberFormatterRoundHalfUp = CPRoundPlain;
dcmn = [dcmn decimalNumberByRoundingAccordingToBehavior:_numberHandler];
var output = [dcmn descriptionWithLocale:nil],
parts = [output componentsSeparatedByString:"."], // FIXME Locale specific.
preFraction = parts[0],
fraction = parts.length > 1 ? parts[1] : "",
// FIXME this is probably locale dependent.
parts = output.match(NumberRegex) || ["", undefined, "", undefined, undefined],
negativePrefix = parts[1] || "",
preFraction = parts[2] || "",
fraction = parts[4] || "",
preFractionLength = [preFraction length],
commaPosition = 3;
@@ -141,9 +145,10 @@ CPNumberFormatterRoundHalfUp = CPRoundPlain;
}
if (_numberStyle == CPNumberFormatterPercentStyle)
{
string += "%";
}
if (negativePrefix)
string = negativePrefix + string;
return string;
default:
+12
View File
@@ -30,6 +30,14 @@
[self assert:@"123,456" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:123456]]];
[self assert:@"1,234,567" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:1234567]]];
[self assert:@"-1" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:-1]]];
[self assert:@"-12" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:-12]]];
[self assert:@"-123" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:-123]]];
[self assert:@"-1,234" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:-1234]]];
[self assert:@"-12,345" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:-12345]]];
[self assert:@"-123,456" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:-123456]]];
[self assert:@"-1,234,567" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:-1234567]]];
[numberFormatter setGroupingSeparator:@" "];
[self assert:@"1" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:1]]];
[self assert:@"12" equals:[numberFormatter stringFromNumber:[CPNumber numberWithInt:12]]];
@@ -78,6 +86,7 @@
[self assert:@"1" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"1"]]];
[self assert:@"0.4" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"0.4467"]]];
[self assert:@"-0.4" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"-0.4467"]]];
}
- (void)testSetMinimumFractionDigits_
@@ -89,6 +98,7 @@
[self assert:@"1.000" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"1"]]];
[self assert:@"1.100" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"1.1"]]];
[self assert:@"-1.100" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"-1.1"]]];
[self assert:@"0.4467" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"0.4467"]]];
}
@@ -121,6 +131,7 @@
[numberFormatter setCurrencyCode:@"USD"];
[self assert:@"$1.00" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"1"]]];
[self assert:@"-$1.00" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"-1"]]];
[self assert:@"$12.00" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"12"]]];
[self assert:@"$12.10" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"12.1"]]];
[self assert:@"$12.10" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"12.10"]]];
@@ -149,6 +160,7 @@
[numberFormatter setNumberStyle:CPNumberFormatterPercentStyle];
[self assert:@"1%" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"0.01"]]];
[self assert:@"-1%" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"-0.01"]]];
[self assert:@"100%" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"1.0"]]];
[self assert:@"150%" equals:[numberFormatter stringFromNumber:[CPDecimalNumber decimalNumberWithString:@"1.5"]]];