* Source/NSNumberFormatter.m ([-stringForObjectValue:]): Implement

handling of localizesFormat.
	Return string value of attributedStringForZero if applicable so that
	formatting for the common case is not short circuted for zero.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@26627 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
David Ayers 2008-06-11 17:00:55 +00:00
parent 112dfd96cf
commit ba368ae9e3
2 changed files with 41 additions and 7 deletions

View file

@ -1,3 +1,10 @@
2008-06-11 David Ayers <ayers@fsfe.org>
* Source/NSNumberFormatter.m ([-stringForObjectValue:]): Implement
handling of localizesFormat.
Return string value of attributedStringForZero if applicable so that
formatting for the common case is not short circuted for zero.
2008-06-10 Richard Frith-Macdonald <rfm@gnu.org> 2008-06-10 Richard Frith-Macdonald <rfm@gnu.org>
* Tools/AGSHtml.m: if something is scheduled for removal, mark it as * Tools/AGSHtml.m: if something is scheduled for removal, mark it as

View file

@ -36,6 +36,8 @@
#include "Foundation/NSUserDefaults.h" #include "Foundation/NSUserDefaults.h"
#include "Foundation/NSCharacterSet.h" #include "Foundation/NSCharacterSet.h"
#include "GNUstepBase/GSLocale.h"
@implementation NSNumberFormatter @implementation NSNumberFormatter
- (BOOL) allowsFloats - (BOOL) allowsFloats
@ -534,7 +536,26 @@
BOOL displayFractionalPart = NO; BOOL displayFractionalPart = NO;
BOOL negativeNumber = NO; BOOL negativeNumber = NO;
NSString *useFormat; NSString *useFormat;
NSString *defaultDecimalSeparator = nil;
NSString *defaultThousandsSeparator = nil;
if (_localizesFormat)
{
NSDictionary *defaultLocale = GSDomainFromDefaultLocale();
defaultDecimalSeparator
= [defaultLocale objectForKey: NSDecimalSeparator];
defaultThousandsSeparator
= [defaultLocale objectForKey: NSThousandsSeparator];
}
if (defaultDecimalSeparator == nil)
{
defaultDecimalSeparator = @".";
}
if (defaultThousandsSeparator == nil)
{
defaultThousandsSeparator = @",";
}
formattingCharacters = [NSCharacterSet formattingCharacters = [NSCharacterSet
characterSetWithCharactersInString: @"0123456789#.,_"]; characterSetWithCharactersInString: @"0123456789#.,_"];
placeHolders = [NSCharacterSet placeHolders = [NSCharacterSet
@ -546,7 +567,8 @@
return [[self attributedStringForNotANumber] string]; return [[self attributedStringForNotANumber] string];
if ([anObject isEqual: [NSDecimalNumber notANumber]]) if ([anObject isEqual: [NSDecimalNumber notANumber]])
return [[self attributedStringForNotANumber] string]; return [[self attributedStringForNotANumber] string];
if ([anObject isEqual: [NSDecimalNumber zero]]) if (_attributedStringForZero
&& [anObject isEqual: [NSDecimalNumber zero]])
return [[self attributedStringForZero] string]; return [[self attributedStringForZero] string];
useFormat = _positiveFormat; useFormat = _positiveFormat;
@ -560,7 +582,10 @@
// if no format specified, use the same default that Cocoa does // if no format specified, use the same default that Cocoa does
if (nil == useFormat) if (nil == useFormat)
{ {
useFormat = negativeNumber ? @"-#,###.##" : @"#,###.##"; useFormat = [NSString stringWithFormat: @"%@#%@###%@##",
negativeNumber ? @"-" : @"",
defaultThousandsSeparator,
defaultDecimalSeparator];
} }
prefixRange = [useFormat rangeOfCharacterFromSet: formattingCharacters]; prefixRange = [useFormat rangeOfCharacterFromSet: formattingCharacters];
@ -580,15 +605,16 @@
//should also set NSDecimalDigits? //should also set NSDecimalDigits?
if ([self hasThousandSeparators] if ([self hasThousandSeparators]
&& (0 != [useFormat rangeOfString:@","].length)) && (0 != [useFormat rangeOfString: defaultThousandsSeparator].length))
{ {
displayThousandsSeparators = YES; displayThousandsSeparators = YES;
} }
if ([self allowsFloats] if ([self allowsFloats]
&& (NSNotFound != [useFormat rangeOfString:@"." ].location)) && (NSNotFound
!= [useFormat rangeOfString: defaultDecimalSeparator].location))
{ {
decimalPlaceRange = [useFormat rangeOfString: @"." decimalPlaceRange = [useFormat rangeOfString: defaultDecimalSeparator
options: NSBackwardsSearch]; options: NSBackwardsSearch];
if (NSMaxRange(decimalPlaceRange) == [useFormat length]) if (NSMaxRange(decimalPlaceRange) == [useFormat length])
{ {
@ -636,14 +662,15 @@
while (([placeHolders characterIsMember: while (([placeHolders characterIsMember:
[useFormat characterAtIndex: NSMaxRange(intPartRange)]] [useFormat characterAtIndex: NSMaxRange(intPartRange)]]
|| [[useFormat substringFromRange: || [[useFormat substringFromRange:
NSMakeRange(NSMaxRange(intPartRange), 1)] isEqual: @","]) NSMakeRange(NSMaxRange(intPartRange), 1)] isEqual:
defaultThousandsSeparator])
&& NSMaxRange(intPartRange) < [useFormat length] - 1) && NSMaxRange(intPartRange) < [useFormat length] - 1)
{ {
intPartRange.length++; intPartRange.length++;
} }
} }
intPad = [[useFormat substringWithRange: intPartRange] mutableCopy]; intPad = [[useFormat substringWithRange: intPartRange] mutableCopy];
[intPad replaceOccurrencesOfString: @"," [intPad replaceOccurrencesOfString: defaultThousandsSeparator
withString: @"" withString: @""
options: 0 options: 0
range: NSMakeRange(0, [intPad length])]; range: NSMakeRange(0, [intPad length])];