舍入货币字符串

Posted

技术标签:

【中文标题】舍入货币字符串【英文标题】:Rounding Currency String 【发布时间】:2014-08-26 01:05:20 【问题描述】:

我能够将此函数编写为 NSDecimalNumber 的扩展方法,这对我来说效果很好。它需要一些数字并将其格式化为货币字符串。如果它包含 .00,它将截断它,但如果它是 .23 或 .45 之类的东西,它将保留小数。

func toCurrencyString() -> String

    let nf = NSNumberFormatter()
    nf.numberStyle = NSNumberFormatterStyle.CurrencyStyle

    //Determine whether to show decimals or not (if trailing zeros exist, do not show)
    if (trunc(self.floatValue) == self.floatValue) 
        nf.maximumFractionDigits = 0
     else 
        nf.maximumFractionDigits = 2
    
    return nf.stringFromNumber(self)

我有一个问题: 如何实现上面类似的函数,它返回一个格式化的字符串,但四舍五入?所以像 45.55 这样的数字就是 46(没有小数)

我尝试使用在操场上工作的 round(),但是当我使用它的扩展方法时,它说'round() 的模糊使用'。

另外..出于好奇,以上对于不同的地区是否安全,就像它在美国完美地显示给我一样,但如果用户的手机在英国,它会自动工作吗?

非常感谢!

【问题讨论】:

您不应该将货币存储在浮点值中。谷歌搜索数百个参数为什么它是错误的。 参见:超人 3。 我正在使用 NSDecimalNumber - 这不是正确的方法吗? 【参考方案1】:

花了我一点点,但我明白了:

func toRoundedCurrencyString() -> String

    let nf = NSNumberFormatter()
    nf.numberStyle = NSNumberFormatterStyle.CurrencyStyle
    nf.maximumFractionDigits = 0
    var roundingStyle = NSDecimalNumberHandler(roundingMode: NSRoundingMode.RoundBankers, scale: 0, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false)
    var roundedNumber = self.decimalNumberByRoundingAccordingToBehavior(roundingStyle)
    return nf.stringFromNumber(roundedNumber)

效果很好,但关心别人说。我正在使用 NSDecimalNumber 扩展方法。 NSDecimalNumber 不是处理货币的首选方式吗?顺便说一句,如果这很重要,我使用的是

【讨论】:

以上是关于舍入货币字符串的主要内容,如果未能解决你的问题,请参考以下文章

用 f 字符串舍入浮点数 [重复]

舍入浮点数,然后转到语言环境字符串

如何在 JavaScript 中舍入一个数字? .toFixed() 返回一个字符串?

(双)舍入[重复]

(双)舍入[重复]

将浮点数与字符串连接并舍入到小数点后 2 位