From 1f0ab2ab49cf206221aec2ce7286dd356be50750 Mon Sep 17 00:00:00 2001 From: Alexander Ljungberg Date: Wed, 23 Jan 2013 22:23:50 +0000 Subject: [PATCH] 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. --- Foundation/CPNumberFormatter.j | 15 ++++++++++----- Tests/Foundation/CPNumberFormatterTest.j | 12 ++++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/Foundation/CPNumberFormatter.j b/Foundation/CPNumberFormatter.j index bcede4ff9..65375c96e 100644 --- a/Foundation/CPNumberFormatter.j +++ b/Foundation/CPNumberFormatter.j @@ -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: diff --git a/Tests/Foundation/CPNumberFormatterTest.j b/Tests/Foundation/CPNumberFormatterTest.j index 63380122a..6063d881e 100644 --- a/Tests/Foundation/CPNumberFormatterTest.j +++ b/Tests/Foundation/CPNumberFormatterTest.j @@ -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"]]];