diff --git a/ChangeLog b/ChangeLog index c143a920b..d8240210d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2015-12-30 Marcus Mueller + + * Source/NSNumberFormatter.m: fixed a subtle off-by-one formatter + bug in conjunction with zero padding and NSNumberFormatterBehavior10_0. + + * Tests/base/NSNumberFormatter/basic.m: added a test for this + particular issue + 2015-12-29 Marcus Mueller * Source/NSUserNotification.m: "NSUserNotificationDefaultSoundName" diff --git a/Source/NSNumberFormatter.m b/Source/NSNumberFormatter.m index 85699d65e..4f03666a3 100644 --- a/Source/NSNumberFormatter.m +++ b/Source/NSNumberFormatter.m @@ -1271,16 +1271,18 @@ static NSUInteger _defaultBehavior = NSNumberFormatterBehavior10_4; //sort out the padding for the integer part intPartRange = [useFormat rangeOfCharacterFromSet: placeHolders]; - if (NSMaxRange(intPartRange) < ([useFormat length] - 1)) + if (intPartRange.location != NSNotFound) { + int nextFormatCharLoc = intPartRange.location; while (([placeHolders characterIsMember: - [useFormat characterAtIndex: NSMaxRange(intPartRange)]] + [useFormat characterAtIndex: nextFormatCharLoc]] || [[useFormat substringWithRange: - NSMakeRange(NSMaxRange(intPartRange), 1)] isEqual: + NSMakeRange(nextFormatCharLoc, 1)] isEqual: defaultThousandsSeparator]) - && NSMaxRange(intPartRange) < [useFormat length] - 1) + && nextFormatCharLoc < [useFormat length] - 1) { intPartRange.length++; + nextFormatCharLoc++; } } intPad = [[[useFormat substringWithRange: intPartRange] @@ -1298,7 +1300,7 @@ static NSUInteger _defaultBehavior = NSNumberFormatterBehavior10_4; NSRange ipRange; ipRange = - NSMakeRange(0, [intPad length] - [intPartString length] + 1); + NSMakeRange(0, [intPad length] - [intPartString length]); [intPartString insertString: [intPad substringWithRange: ipRange] atIndex: 0]; [intPartString replaceOccurrencesOfString: @"_" diff --git a/Tests/base/NSNumberFormatter/basic.m b/Tests/base/NSNumberFormatter/basic.m index bfaec3be5..7858b7557 100644 --- a/Tests/base/NSNumberFormatter/basic.m +++ b/Tests/base/NSNumberFormatter/basic.m @@ -49,6 +49,11 @@ int main() PASS_EQUAL([fmt stringForObjectValue: num], @" 001234", "numeric and space padding OK") + [fmt setFormat: @"000"]; + num = [[[NSNumber alloc] initWithInt: 10] autorelease]; + PASS_EQUAL([fmt stringForObjectValue: num], @"010", + "numeric padding OK") + [fmt setAllowsFloats: YES]; num = [[[NSNumber alloc] initWithFloat: 1234.56] autorelease];