NSNumberFormatter:货币更改的dispatch_once

时间:2015-02-02 12:00:52

标签: objective-c nsnumberformatter

我有一个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以确保它能理解我给出的规则吗?

非常感谢

2 个答案:

答案 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)];
}