在标签中将双精度字指定为文本时,如何删除“可选”一词?

时间:2019-07-16 12:29:38

标签: json swift

我从JSON中获得了一系列值,其中一个由totalBuy定义,该值定义为bool

struct PurchaseTotals: Codable {

    var totalBuy: Double?

    enum CodingKeys: String, CodingKey {

        case sumTotal = "totalBuy"
    }
}

当我尝试将此double分配为标签的文本时,可选单词会出现在前面:

我正在这样分配值:

    sumLabel.text = "\(totalBuy)"

如何删除“可选”一词?

此外,可以在必要时格式化标签中的值以包含逗号,totalBuy的值有时看起来像"1000",其中需要逗号在一个(1,000).之后吗?

2 个答案:

答案 0 :(得分:1)

我认为yuou正在寻找NumberFormatter

// If I have a value for totalBuy go ahead
if let totalBuy = totalBuy {
    let formatter = NumberFormatter()
    formatter.numberStyle = .decimal
    let formattedString = formatter.string(from: NSNumber(value: totalBuy)) ?? ""
    sumLabel.text = "\(formattedString)"
} else {
    sumLabel.text = ""
}

答案 1 :(得分:1)

首先,Codablecase enum CodingKeys中的名称必须与您的property类型中的Codable完全匹配。

所以,它看起来应该像

struct PurchaseTotals: Codable {
    var sumTotal: Double?
    enum CodingKeys: String, CodingKey {
        case sumTotal = "totalBuy"
    }
}

在上面的代码中,sumTotal是属性名称,totalBuy是必须从API获得的密钥。反之,则可以相应地更改代码。

问题1 现在,由于sumTotaloptional,这就是为什么要在label中打印可选内容的原因。

在使用sumTotal之前,您需要解包

问题2 现在,由于需要在使用sumTotal之前对其进行格式化,因此可以在PurchaseTotals本身中创建一个变量,该变量将返回formattedSumTotal字符串。

所以,合并后的代码就像

struct PurchaseTotals: Codable {
    var sumTotal: Double?
    enum CodingKeys: String, CodingKey {
        case sumTotal = "totalBuy"
    }

    lazy var formattedSumTotal: String? =  {
        if let sumTotal = sumTotal {
            let formatter = NumberFormatter()
            formatter.numberStyle = .decimal
            let str = formatter.string(from: NSNumber(value: sumTotal))
            return str
        }
        return nil
    }()
}

使用formattedSumTotal之类的

label.text = purchaseTotals.formattedSumTotal