将Double设置为负货币格式,或从Double

时间:2018-08-20 01:27:50

标签: swift currency number-formatting

我有一个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中删除“-”?

3 个答案:

答案 0 :(得分:7)

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

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

formatter.string(from: 50.0) // "$50.00"
formatter.string(from: -50.0) // "-$50.00"

这使得无需其他代码即可更轻松地支持不同的本地化

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

"£50.00"
"-£50.00"

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

  

当然可以,但是我也希望正输出也显示“ +”号

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

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

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

输出

"+$50.00"
"-$50.00"
  

例如,如果视图已重新加载并且在准备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
}()

和/或“配置”结构/类的static(可能是惰性)属性

答案 1 :(得分:1)

简单的答案可能是使用类类型公开的“ abs”功能。

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

答案 2 :(得分:1)

您知道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))