NSNumberFormatter使用逗号作为小数点分隔符

22

我尝试将类似于“12000.54”的NSString转换为“12.000,54”。我编写了一个NSNumberFormatter实例。

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setGroupingSeparator:@"."];
[formatter setDecimalSeparator:@","];

但是,当我使用NSLog来打印这个东西时:

NSLog(@"%@",[formatter stringFromNumber:[formatter numberFromString:value]]);

它打印出null值。如果我用点号替换逗号,它就可以正常工作。我只想能够在我的分隔符字段中输入我想要的内容(逗号、点号、斜杠等),并且我有不同的输出:例如12/000,54 12.000.54 12,000,54。

你知道我该怎么处理吗?


2
也许我找到了问题所在。我必须使用另一个NSFormatter来首先使我的numberFromString生效。我投票关闭我的帖子。 - Pierre
3
不要关闭它,输入答案并检查,其他人将来也会遇到同样的问题。 - David H
同意 @DavidH 的观点。问题是有效的,代码和必要信息都已经齐备。我实际上正在为它点赞 :-) - LSerni
5个回答

47

我建议不要硬编码分隔符,以确保基于 iPhone 地区设置的正确分隔符行为。最简单的方法是:

使用 Objective-C


使用 Objective-C
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc]init];
numberFormatter.locale = [NSLocale currentLocale];// this ensures the right separator behavior
numberFormatter.numberStyle = NSNumberFormatterDecimalStyle;
numberFormatter.usesGroupingSeparator = YES;

// example for writing the number object into a label
cell.finalValueLabel.text = [NSString StringWithFormat:@"%@", [numberFormatter stringForObjectValue:numberFromString]]; // your var name is not well chosen

使用 SWIFT 3

 let formatter = NumberFormatter()
 formatter.locale = NSLocale.current // this ensures the right separator behavior
 formatter.numberStyle = NumberFormatter.Style.decimal
 formatter.usesGroupingSeparator = true

 // example for writing the number object into a label
 // your variable "numberFromString" needs to be a NSNumber object
 finalValueLabel.text = formatter.string(from: numberFromString)! // your var name is not well chosen

我不会使用变量名 "numberFromString",因为它是一个 NSNumberFormatter 方法。


"formatter.numberStyle = NumberFormatter.Style.decimal" 对我的情况非常关键。 - ergunkocak

28

所以这个问题是有效的:我自己来回答它 :)

我从sqlite中读取了一个十进制数(例如12000或12000.54),将其直接转换为NSString。在代码的某个时刻,我必须使用不同的分隔符。

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setGroupingSeparator:@""];
[formatter setDecimalSeparator:@"."];

// Decimal values read from any db are always written with no grouping separator and a comma for decimal.

NSNumber *numberFromString = [formatter numberFromString:@"12000.54"]];

[formatter setGroupingSeparator:@" "]; // Whatever you want here
[formatter setDecimalSeparator:@","]; // Whatever you want here

NSString *finalValue = [formatter stringFromNumber:numberFromString];

NSLog(@"%@",finalValue); // Print 12 000,54

问题已解决。


1
您还可以使用 NSStringdoubleValue 属性。 - Kevin

7
我最近发现的最简单的解决方案是:
NSString *localizedString = [NSString localizedStringWithFormat:@"%@", @1234567];

也适用于整数:

NSString *localizedString = [NSString localizedStringWithFormat:@"%d", 1234567];

在Xcode 6 playground中已经验证。但文档说这个函数一直存在。


5
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
numberFormatter.usesGroupingSeparator = YES;
[numberFormatter setMaximumFractionDigits:2];
[numberFormatter setMinimumFractionDigits:2];
NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.00];`

这将解决您在处理小数点时遇到的四舍五入问题。

3

对于货币使用...

let numberFormatter = NumberFormatter()

// Produces symbol (i.e. "$ " for en_US_POSIX) and decimal formatting
numberFormatter.numberStyle = .currency

// Produces commas; i.e. "1,234"
numberFormatter.usesGroupingSeparator = true
numberFormatter.groupingSize = 3

使用示例:

let value: Double = 12345.6789
numberFormatter.string(from: value as NSNumber)

产生...

"$ 12,345.68"

如预期所料

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接