为什么NSNumberFormatter不删除小数点和尾随零?

sco*_*fax 13 objective-c nsnumberformatter

我想将unsigned long int转换为NSString,每3个数字用逗号格式化,既不是小数点也不是尾随零.我可以使用NSNumberFormatter将逗号放入NSString中,但由于某种原因,我无法获得小数点和0.

这是我的代码:

NSNumberFormatter *fmtr;
unsigned long int intToBeDisplayed;
intToBeDisplayed = 1234567890;
fmtr = [[[NSNumberFormatter alloc] init] autorelease];
[fmtr setUsesGroupingSeparator:YES];
[fmtr setGroupingSeparator:@","];
[fmtr setGroupingSize:3];
[fmtr setAlwaysShowsDecimalSeparator:NO];
NSLog([fmtr stringFromNumber:[NSNumber numberWithUnsignedLong:intToBeDisplayed]]);
Run Code Online (Sandbox Code Playgroud)

日志显示"1,234,567,890.00",适当地添加逗号但不幸的是不需要的".00".我已尝试使用int而不是unsigned long int,使用较小的整数值,以及来自各种博客的其他构造都无济于事.我非常感谢有关如何从NSString中获取小数点和尾随零的任何建议.

我是Objective-C的新手,在试图解决这个问题的模糊眼睛综合症方面成为老手,但是在那个阶段,在Objective-C中学到的每一点教训和成功都是一个巨大的快乐源泉.

小智 31

您还可以使用setMaximumFractionDigits截断分数:

unsigned long int intToBeDisplayed = 1234567890;
NSNumber *longNumber = [NSNumber numberWithUnsignedLong:intToBeDisplayed];

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setUsesGroupingSeparator:YES];
[formatter setGroupingSeparator:@","];
[formatter setGroupingSize:3];
[formatter setMaximumFractionDigits:0];

NSString *formattedNumber = [formatter stringFromNumber:longNumber];
NSLog(@"The formatted number is %@", formattedNumber);
Run Code Online (Sandbox Code Playgroud)

结果如下:

格式化的数字是1,234,567,890

这适用于iOS 2.0及更高版本.


JFS*_*JFS 5

可能有些晚了,您问题的核心已得到很好的回答。但我想提醒一下,避免强制使用分隔符和小数点。强烈建议您尊重设备的语言环境设置,以显示具有正确语言环境行为的数字。

1. NSNumberFormatter:

NSNumberFormatter *valueFormatter = [[NSNumberFormatter alloc]init];
valueFormatter.locale = [NSLocale currentLocale];    // <-- allow the device locale setting
// valueFormatter.GroupingSeparator:@","];           // don't force locale behavior
valueFormatter.numberStyle = NSNumberFormatterDecimalStyle;
valueFormatter.usesGroupingSeparator = YES;
valueFormatter.groupingSize = 3;
valueFormatter.maximumFractionDigits = 0;            // this is important to have your primary issue solved
Run Code Online (Sandbox Code Playgroud)

2.显示带有正确语言环境的数字:

在您的情况下,NSNumberFormatter由于设备将始终显示分隔符,因此可能不一定需要使用。为了使用正确的语言环境行为NSString从原始数据类型(例如int)构建a ,只需localizedStringWithFormat按如下所示使用并格式化数字:

NSString *testString = [NSString localizedStringWithFormat:@"%lu", intToBeDisplayed];
Run Code Online (Sandbox Code Playgroud)

有一个NSNumber对象:

NSNumber *longNumber = [NSNumber numberWithUnsignedLong:intToBeDisplayed];
NSString *testString = [NSString localizedStringWithFormat:@"%lu", longNumber.unsignedLongValue];
Run Code Online (Sandbox Code Playgroud)

3.使用NSNumberFormatter(正确的语言环境)显示数字:

NSNumber *longNumber = [NSNumber numberWithUnsignedLong:intToBeDisplayed];
NSString *testString = [NSString localizedStringWithFormat:@"%@", [valueFormatter stringForObjectValue:longNumber]];
Run Code Online (Sandbox Code Playgroud)

longNumber在标签或文本字段中使用NSNumber对象,例如:

testLabel.text = [NSString localizedStringWithFormat:@"%@", [valueFormatter stringForObjectValue:longNumber]];
Run Code Online (Sandbox Code Playgroud)

在具有英语语言环境设置的设备上将产生以下输出:

1,234,567,890

在具有(例如)德语区域设置的设备上,它将自动显示数字,如下所示:

1.234.567.890

希望我可以为(困难的)数字格式问题添加更多内容。


Ste*_*tto -1

这会解决它!

 [fmtr setGeneratesDecimalNumbers:NO];
Run Code Online (Sandbox Code Playgroud)

输出:

2011-03-31 18:40:45.645 Stephen[41552:903] 1,234,567,890
Run Code Online (Sandbox Code Playgroud)

  • generateDecimalNumbers 并不像您想象的那样。它控制 NSNumberFormatter 在将字符串转换为数字对象时是否创建 NSDecimalNumber 还是 NSNumber 的实例。如果设置为 NO 它将创建 NSNumber 对象,当然它也可以有小数值。 (4认同)