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

时间:2011-03-31 22:27:30

标签: objective-c nsnumberformatter

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

这是我的代码:

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]]);

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

我是Objective-C的新手,在试图解决这个问题的模糊眼睛综合症方面成为老手,但是在那个阶段,在Objective-C中学到的每一点教训和成功都是源头非常高兴。

4 个答案:

答案 0 :(得分: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);

结果是:

  

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

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

答案 1 :(得分: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

<强> 2。显示具有正确语言环境的数字:

在您的情况下,可能没有必要使用NSNumberFormatter,因为设备无论如何都会显示分隔符。要使用正确的区域设置行为从原始数据类型(例如NSString)构建int,只需使用localizedStringWithFormat并按如下格式编号:

NSString *testString = [NSString localizedStringWithFormat:@"%lu", intToBeDisplayed];

拥有NSNumber个对象:

NSNumber *longNumber = [NSNumber numberWithUnsignedLong:intToBeDisplayed];
NSString *testString = [NSString localizedStringWithFormat:@"%lu", longNumber.unsignedLongValue];

第3。使用NSNumberFormatter(右侧语言环境)显示数字:

NSNumber *longNumber = [NSNumber numberWithUnsignedLong:intToBeDisplayed];
NSString *testString = [NSString localizedStringWithFormat:@"%@", [valueFormatter stringForObjectValue:longNumber]];

在标签或textField中使用NSNumber对象longNumber,例如:

testLabel.text = [NSString localizedStringWithFormat:@"%@", [valueFormatter stringForObjectValue:longNumber]];

将在具有英语区域设置的设备上生成以下输出:

<强> 1234567890

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

<强> 1.234.567.890

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

答案 2 :(得分:0)

这将删除小数点和尾随零。

[fmtr setPositiveFormat:@"#"]

和/或

[fmtr setNegativeFormat:@"#"]

答案 3 :(得分:-1)

这将解决它!

 [fmtr setGeneratesDecimalNumbers:NO];

输出:

2011-03-31 18:40:45.645 Stephen[41552:903] 1,234,567,890