【问题标题】:NSNumberFormatter's multiplier rounds down instead of showing fractionNSNumberFormatter 的乘数向下舍入而不是显示分数
【发布时间】:2012-01-23 11:33:01
【问题描述】:

我已经配置了一个 NSNumberFormatter 来将在 NSDictionary 中存储为美分的金额转换为欧元。因为它们存储为美分,所以我将格式化程序的 multiplier 设置为 [NSNumber numberWithDouble:0.01]。但是,当我尝试将 304 欧分显示为欧元时,我得到€ 3,00

这让我相信乘数是在进行整数除法而不是双除法。

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

我怎样才能阻止错误的行为?

【问题讨论】:

    标签: iphone ios nsnumberformatter


    【解决方案1】:

    试试这个代码。

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

    就像您将增值税作为整数传递一样,您将始终以 int 格式获得数字。

    【讨论】:

    • 最后自己发现了这个,但它是完全正确的。那谢谢啦!您介意详细说明为什么 NSNumber 在传递整数时充当整数而不是通用数字吗?无法弄清楚那部分(这也是我如此困惑的原因)。
    • 因为目标 c 不支持自动装箱。 NSNumber 是一个指针表示(包装类)。因此,在创建 NSNumber 对象之前,您需要使用 [NSNumber numberWithType:value]; 指定值的类型。
    • 我不清楚这是否是 NSNumberFormatter 的预期行为。我提交了一份雷达,试图得到一些澄清:rdar://16775214
    【解决方案2】:

    请参阅NSNumberFormatter reference 的“配置舍入行为”。

    【讨论】:

    • 对我没有帮助。我可以更改roundingMode,但我根本不需要四舍五入(304 * 0.01 不应该返回 3,而是 3.04)。顺便说一句,这是 Mac OSX 开发指南,它与 iOS 不同(例如,它有一个额外的 roundingBehaviour 属性,在 iOS 中找不到)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 2016-01-24
    相关资源
    最近更新 更多