>我有一个表格视图,其中将显示NSDecimalNumber
列表及其自己的货币。
我在NSNumberFormatter
上使用dispatch_once
,但请注意,有时它会完全忽略我设置分数数字或完全在分数数字上添加后缀的命令。
目前,我能够解决此问题的唯一方法是在每一行初始化NSNumberFormatter
这有点愚蠢。
即:
- (NSNumberFormatter *)currencyFormatWithCurrency:(NSString *)currency
{
static NSNumberFormatter *_formatter = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_formatter = [[NSNumberFormatter alloc] init];
});
[_formatter setCurrencyCode:currency];
[_formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[_formatter setMaximumFractionDigits:0];
[_formatter setGeneratesDecimalNumbers:NO];
[_formatter setRoundingMode:NSNumberFormatterRoundUp];
return _formatter;
}
// someCurrency is a string that will change per row
// someAmount is a NSDecimalNumber that will change per row
NSNumberFormatter *formatter = [self currencyFormatWithCurrency:someCurrency];
NSString *formattedAmount = [formatter stringFromNumber:someAmount];
self.amountLabel.text = formattedAmount;
有时,如果我输入像80000
这样的数字,它会返回80,000.00
(有时取决于货币)。
我想我可以初始化NSNumberFormatter
并在每一行上将其零。
也许我做错了,但如果有一种方法可以确保我不需要继续创建NSNumberFormatter
来确保它会理解我给它的规则?
非常感谢
NSNumberFormatter 不是线程安全的。这将导致各种各样的问题。(好吧,你使用它的方式不可能真的是线程安全的,因为你可能在一个线程中修改它,而另一个线程正在使用它,但仅仅使用来自两个线程的 NSNumberFormatter 是不安全的)。
你总是可以用这样的方法做一些事情
NSString* lastCurrency = nil;
NSNumberFormatter* formatter = nil;
for (;;) {
...
NSString* currency = ...;
if (! [lastCurrency isEqualToString:currency]) {
lastCurrency = currency;
formatter = ...;
}
}
如果在大多数情况下货币保持不变,则效果很好。
从以下网站获得的可能的解决方案可能会有所帮助。
NSString *HTCurrencyString(double amount, NSString *currencyCode)
{
static NSString *currencyFormatterKey = @"HTCurrencyFormatter";
NSNumberFormatter *currencyFormatter = [[NSThread currentThread] threadDictionary][currencyFormatterKey];
if (currencyFormatter == nil)
{
currencyFormatter = [[NSNumberFormatter alloc] init];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[currencyFormatter setLocale:[NSLocale currentLocale]];
[[NSThread currentThread] threadDictionary][currencyFormatterKey] = currencyFormatter;
}
[currencyFormatter setCurrencyCode:currencyCode];
[currencyFormatter setMaximumFractionDigits:0];
[currencyFormatter setRoundingMode:NSNumberFormatterRoundHalfUp];
return [currencyFormatter stringFromNumber:@(amount)];
}