为负货币格式化 Double,或从 Double 中删除“-”符号

Format Double for negative currency, or remove "-" sign from Double

我有一个 Double,可以是正数也可以是负数,我想按以下方式显示:

对于正值:

+1.10 美元

对于负值:

-0.50 美元

0 值留空

我试过这样:

Double surcharge = ...
if(surcharge < 0){
    cell.lblSurcharge.text = "-$" + String(format:"%.02f", surcharge)
}else if(surcharge > 0){
    cell.lblSurcharge.text = "+$" + String(format:"%.02f", surcharge)
}else{
    cell.lblSurcharge.text = nil
}

但对于负值,它显示如下:

-$-0.50

如何才能正确格式化它,或者从 Double 中删除“-”?

您应该尽可能使用 API 提供的可用格式化程序,例如 NumberFormatter

let formatter = NumberFormatter()
formatter.numberStyle = .currency

formatter.string(from: 50.0) // ".00"
formatter.string(from: -50.0) // "-.00"

这使得无需任何额外代码即可更轻松地支持不同的本地化

所以,如果添加 formatter.locale = Locale.init(identifier: "en_UK"),输出将变为...

"£50.00"
"-£50.00"

显然,在大多数情况下我会使用 Locale.current,但情况会发生变化

Sure, but I want the positive output to show the "+" sign too

它没有我想要的那么漂亮,但是...

let formatter = NumberFormatter()
formatter.numberStyle = .currency
formatter.positivePrefix = formatter.plusSign + formatter.currencySymbol

formatter.string(from: 50.0)
formatter.string(from: -50.0)

产出

"+.00"
"-.00"

such as if the view is reloaded and I don't reset numberStyle to .currency before the String is prepared

让它变得懒惰 属性

var currencyFormatter: NumberFormatter = {
    let formatter = NumberFormatter()
    formatter.numberStyle = .currency
    formatter.positivePrefix = formatter.plusSign + formatter.currencySymbol
    return formatter
}()

And/or一个static(可能是懒惰的)属性 of "configuration" struct/class

简单的答案可能是使用 class 类型公开的 "abs" 函数。

cell.lblSurcharge.text = "-$" + String(format:"%.02f", abs(surcharge))

你知道 surcharge 在这一点上是负数,所以只需添加 - 使其对格式为正数。此外,您可以将 "-$" 移动到格式字符串中:

变化:

cell.lblSurcharge.text = "-$" + String(format:"%.02f", surcharge)

至:

cell.lblSurcharge.text = String(format:"-$%.02f", -surcharge)

要在一行中完成所有操作,请使用三元运算符 (?:) 处理零并将符号添加到格式字符串中:

cell.lblSurcharge.text = surcharge == 0 ? "" : String(format:"%@$%.02f", surcharge > 0 ? "+" : "-", abs(surcharge))