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

Gim*_*411 0 currency number-formatting swift

我有一个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
}
Run Code Online (Sandbox Code Playgroud)

但对于负值,它会像这样显示:

- $ - 0.50

如何正确格式化,或从Double中删除" - "?

Mad*_*mer 7

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

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

formatter.string(from: 50.0) // "$50.00"
formatter.string(from: -50.0) // "-$50.00"
Run Code Online (Sandbox Code Playgroud)

这样可以更轻松地支持不同的本地化,而无需任何其他代码

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

"£50.00"
"-£50.00"
Run Code Online (Sandbox Code Playgroud)

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

当然,但我希望正输出也显示"+"符号

它不像我想的那么漂亮,但......

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

formatter.string(from: 50.0)
formatter.string(from: -50.0)
Run Code Online (Sandbox Code Playgroud)

输出

"+$50.00"
"-$50.00"
Run Code Online (Sandbox Code Playgroud)

例如,如果重新加载视图,并且在准备String之前我没有将numberStyle重置为.currency

让它懒惰的财产

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

    formatter.string(from: 50.0)
    formatter.string(from: -50.0
    return formatter
}()
Run Code Online (Sandbox Code Playgroud)

和/或static"configuration"struct/class 的(可能是lazy)属性