2012-01-23 34 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