Hello Everyone, I here is a patch I have hat locally but never had the chance to verify. I'm personally uneasy about committing merely because of the timing. But I thought I'd bring it up for review just in case folk believe it is obviously correct.
It matches the decoding key for thousands separator with the encoding key. (Maybe the correct fix is the other way around wrt compatibility). It also fixes stringForObjectValue: to respect the current locale wrt thousands and decimal separators. There may be optimization possibilities and it may be incomplete... I just happened to stumble over it. But I've been using it for quite some time. Cheers, David
Index: Source/NSNumberFormatter.m =================================================================== --- Source/NSNumberFormatter.m (Revision 26624) +++ Source/NSNumberFormatter.m (Arbeitskopie) @@ -36,6 +36,8 @@ #include "Foundation/NSUserDefaults.h" #include "Foundation/NSCharacterSet.h" +#include "GNUstepBase/GSLocale.h" + @implementation NSNumberFormatter - (BOOL) allowsFloats @@ -256,10 +258,10 @@ [self setDecimalSeparator: [decoder decodeObjectForKey: @"NS.decimal"]]; } - if ([decoder containsValueForKey: @"NS.hasthousands"]) + if ([decoder containsValueForKey: @"NS.hasthousand"]) { [self setHasThousandSeparators: - [decoder decodeBoolForKey: @"NS.hasthousands"]]; + [decoder decodeBoolForKey: @"NS.hasthousand"]]; } if ([decoder containsValueForKey: @"NS.localized"]) { @@ -534,7 +536,26 @@ BOOL displayFractionalPart = NO; BOOL negativeNumber = NO; 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 characterSetWithCharactersInString: @"0123456789#.,_"]; placeHolders = [NSCharacterSet @@ -546,7 +567,8 @@ return [[self attributedStringForNotANumber] string]; if ([anObject isEqual: [NSDecimalNumber notANumber]]) return [[self attributedStringForNotANumber] string]; - if ([anObject isEqual: [NSDecimalNumber zero]]) + if (_attributedStringForZero + && [anObject isEqual: [NSDecimalNumber zero]]) return [[self attributedStringForZero] string]; useFormat = _positiveFormat; @@ -560,7 +582,10 @@ // if no format specified, use the same default that Cocoa does if (nil == useFormat) { - useFormat = negativeNumber ? @"-#,###.##" : @"#,###.##"; + useFormat = [NSString stringWithFormat: @"[EMAIL PROTECTED]@[EMAIL PROTECTED]", + negativeNumber ? @"-" : @"", + defaultThousandsSeparator, + defaultDecimalSeparator]; } prefixRange = [useFormat rangeOfCharacterFromSet: formattingCharacters]; @@ -580,15 +605,16 @@ //should also set NSDecimalDigits? if ([self hasThousandSeparators] - && (0 != [useFormat rangeOfString:@","].length)) + && (0 != [useFormat rangeOfString: defaultThousandsSeparator].length)) { displayThousandsSeparators = YES; } if ([self allowsFloats] - && (NSNotFound != [useFormat rangeOfString:@"." ].location)) + && (NSNotFound + != [useFormat rangeOfString: defaultDecimalSeparator].location)) { - decimalPlaceRange = [useFormat rangeOfString: @"." + decimalPlaceRange = [useFormat rangeOfString: defaultDecimalSeparator options: NSBackwardsSearch]; if (NSMaxRange(decimalPlaceRange) == [useFormat length]) { @@ -636,14 +662,15 @@ while (([placeHolders characterIsMember: [useFormat characterAtIndex: NSMaxRange(intPartRange)]] || [[useFormat substringFromRange: - NSMakeRange(NSMaxRange(intPartRange), 1)] isEqual: @","]) + NSMakeRange(NSMaxRange(intPartRange), 1)] isEqual: + defaultThousandsSeparator]) && NSMaxRange(intPartRange) < [useFormat length] - 1) { intPartRange.length++; } } intPad = [[useFormat substringWithRange: intPartRange] mutableCopy]; - [intPad replaceOccurrencesOfString: @"," + [intPad replaceOccurrencesOfString: defaultThousandsSeparator withString: @"" options: 0 range: NSMakeRange(0, [intPad length])];
_______________________________________________ Gnustep-dev mailing list Gnustep-dev@gnu.org http://lists.gnu.org/mailman/listinfo/gnustep-dev