2012-01-23 65 views
4

我已經配置了一個NSNumberFormatter來將在NSDictionary中存儲爲美分的金額轉換爲歐元。因爲它們存儲爲美分,所以我將格式化程序的multiplier設置爲[NSNumber numberWithDouble:0.01]。但是,當我嘗試顯示304歐元分爲歐元時,我獲得€ 3,00NSNumberFormatter的乘數向下舍入而不是顯示分數

這使我相信乘數是做整數除法而不是雙重除法。

NSFormatter配置

/** 
Returns an NSNumberFormatter that can be used to display currency in euro's (as determined in The Netherlands). 
*/ 
+ (NSNumberFormatter *)euroCurrencyFormatter 
{ 
    static NSNumberFormatter *numberFormatter = nil; 
    @synchronized(self) { 
     if (!numberFormatter) { 
      numberFormatter = [[NSNumberFormatter alloc] init]; 
      [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 
      [numberFormatter setMultiplier:[NSNumber numberWithDouble:0.01]]; 
      NSLocale *nlLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"nl_NL"]; 
      [numberFormatter setLocale:nlLocale]; 
      [nlLocale release]; 
     } 
    } 
    return numberFormatter; 
} 

調用NSFormatter

cell.detailTextLabel.text = [[NSNumberFormatter euroCurrencyFormatter] stringFromNumber:[breakdown valueForKey:@"VatAmount"]]; // The VAT amount would be 304. 

結果

€ 3,00

我該如何阻止異常行爲?

回答

3

試試這個代碼。

cell.detailTextLabel.text = [[NSNumberFormatter euroCurrencyFormatter] stringFromNumber:[NSNumber numberWithDouble:[[breakdown valueForKey:@"VatAmount"] doubleValue]]]; // The VAT amount would be 304. 

如果您將VAT作爲整數傳遞,您將始終以int格式獲取數字。

+0

最後我自己發現了這一點,但它是完全正確。那謝謝啦!你介意闡述爲什麼NSNumber在傳遞一個整數時作爲一個整數而不是一個普通數字?無法理解這一部分(也是我爲什麼如此困惑)。 – SpacyRicochet

+1

作爲目標c不支持自動拳擊。 NSNumber是一個指針表示(包裝類)。因此,在創建NSNumber對象之前,需要使用[NSNumber numberWithType:value];指定值的類型。 – iOSPawan

+0

這很有道理。謝謝! – SpacyRicochet

0

請參閱NSNumberFormatter reference的「配置舍入行爲」。

+0

不幫我。我可以改變'roundingMode',但我根本不需要四捨五入(304 * 0.01不應該返回3,但是3.04)。另外,這是Mac OSX開發指南,它與iOS不同(例如,它有一個額外的'roundingBehaviour'屬性,它無處可在iOS中找到) – SpacyRicochet