我有一个tableview,其中NSDecimalNumber
列表将以自己的货币显示。
我在dispatch_once
上使用了NSNumberFormatter
但请注意,有时它会完全忽略我的命令来设置分数位数或后缀小数位数。
目前我能够解决这个问题的唯一方法是初始化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
以确保它能理解我给出的规则吗?
非常感谢
答案 0 :(得分:0)
NSNumberFormatter不是线程安全的。这将导致各种问题。 (好吧,你使用它的方式实际上不是线程安全的,因为你可能在一个线程中修改它而另一个线程正在使用它,但是只使用两个线程的NSNumberFormatter是不安全的)。
您可以随时使用
等方法执行某些操作NSString* lastCurrency = nil;
NSNumberFormatter* formatter = nil;
for (;;) {
...
NSString* currency = ...;
if (! [lastCurrency isEqualToString:currency]) {
lastCurrency = currency;
formatter = ...;
}
}
如果在大多数情况下货币没有变化,效果很好。
答案 1 :(得分:0)
我认为这是一个可能的解决方案,我可以从以下website获得帮助。
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)];
}