得到一个高精度的大NSDecimal
。像这样:
NSString *decStr = @"999999999999.999999999999";
NSDecimal dec;
NSScanner *scanner = [[NSScanner alloc] initWithString:decStr];
[scanner scanDecimal:&dec];
NSDecimalNumber *decNum = [[NSDecimalNumber alloc] initWithDecimal:*dec];
我可以轻松地获取NSDecimal
的字符串表示形式:
NSString *output = [decNum stringValue];
或者
NSString *output = [decNum descriptionWithLocale:nil];
但是屏幕上的输出从未正确格式化:
output = 999999999999.999999999999
我希望它有像999,999,999,999.999999999999
这样的分组所以我尝试了NSNumberFormatter
:
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setAllowsFloats:YES];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:kCFNumberFormatterDecimalStyle];
NSString *output = [formatter stringFromNumber:resultDecNum];
最终结果如下:
output = 1,000,000,000,000
有没有办法根据用户区域设置正确地格式化高精度NSDecimal
而不会丢失精度?
答案 0 :(得分:1)
正如您已经注意到的,NSNumberFormatter转换为float。 遗憾的是,只有descriptionWithLocale作为替代方案,它没有提供改变你想要的行为的方法。 最好的方法应该是编写自己的格式化程序,Apple甚至为此提供了指南:
我将把descriptionWithLocale作为起点并寻找分隔符。 然后在它前面每3位数加上一个comas。
编辑:
另一个想法是将字符串拆分为整数部分和分隔符后面的东西, 然后使用格式化程序格式化整数部分,然后将其与其余部分组合。
// Get the number from the substring before the seperator
NSString *output = [number descriptionWithLocale:nil];
NSNumber *integerPartOnly = [NSNumber numberWithInt:[output intValue]];
// Format with decimal separators
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:kCFNumberFormatterDecimalStyle];
NSString *result = [formatter stringFromNumber:integerPartOnly]
// Get the original stuff from behind the separator
NSArray* components = [output componentsSeparatedByString:@"."];
NSString *stuffBehindDot = ([components count] == 2) ? [components objectAtIndex: 1] : @"";
// Combine the 2 parts
NSString *result = [result stringByAppendingString:stuffBehindDot];