【问题标题】:Error When Converting JSON String To Number Using Swift使用 Swift 将 JSON 字符串转换为数字时出错
【发布时间】:2021-03-30 05:04:27
【问题描述】:

我有一个基本问题是在 Swift 中将字符串转换为数字。我发现了一个很好的堆栈溢出 question,它可以帮助我将 JSON 字符串转换为数字,但是 当我尝试添加或减去这些值时出现错误。

我确定我遗漏了一些明显的东西!

菲尔

错误:在“BinaryInteger”上引用运算符函数“-”要求“NSNumber”符合“BinaryInteger”

func red2G()->String {
        let numberFormatter = NumberFormatter()
        
        // Prev Close
        let number1  = numberFormatter.number(from: pricesAlpha?.globalQuote.prevClose ?? "0.000")
        if let final1 = number1?.floatValue {
        print("Returned number is " + String(format: "%.2f", final1))
        }
        
        // Open
        let number2  = numberFormatter.number(from: pricesAlpha?.globalQuote.open ?? "0.000")
        if let final2 = number2?.floatValue {
        print("Returned number is " + String(format: "%.2f", final2))
        }
        
        // Price
        let number3  = numberFormatter.number(from: pricesAlpha?.globalQuote.price ?? "0.000")
        if let final3 = number3?.floatValue {
        print("Returned number is " + String(format: "%.2f", final3))
        }
        
        return String(number3-number2)
     }

我根据建议的答案简化了函数:

    func load(symbolName:String) {
        self.symbolName = symbolName
    }
    
    func red2G()->String {
        let numberFormatter = NumberFormatter()
        
        // Prev Close
        let prevClose  = numberFormatter.number(from: pricesAlpha?.globalQuote.prevClose ?? "0.000")?.floatValue
        
        // Open
        let openPrice  = numberFormatter.number(from: pricesAlpha?.globalQuote.open ?? "0.000")?.floatValue
        
        // Price
        let currentPrice  = numberFormatter.number(from: pricesAlpha?.globalQuote.price ?? "0.000")?.floatValue
        
        return String((openPrice ?? 0.00) - (prevClose ?? 0.00) - (currentPrice ?? 0.00))
}

值基于此 JSON 字典

struct GlobalQuote: Codable {
    let globalQuote: PriceAlpha
    
    enum CodingKeys : String, CodingKey {
        case globalQuote = "Global Quote"
    }
}

struct PriceAlpha: Codable {
    let symbol: String
    let open: String
    let high: String
    let low: String
    let price: String
    let volume: String
    let tradingDay: String
    let prevClose: String
    let change: String
    let pctChange: String
    
    enum CodingKeys : String, CodingKey {
        case symbol = "01. symbol"
        case open = "02. open"
        case high = "03. high"
        case low = "04. low"
        case price = "05. price"
        case volume = "06. volume"
        case tradingDay = "07. latest trading day"
        case prevClose = "08. previous close"
        case change = "09. change"
        case pctChange = "10. change percent"
    }
}

【问题讨论】:

  • 你能发布你的 JSON 字符串吗?
  • “错误:引用运算符函数”在哪一行?
  • 该帖子将返回 String 而不是 DoubleFloat。如果您只想将String 转换为Double,只需使用Double(yourString)
  • 嗨,Leo,我按照您的建议尝试了 Double(),它有效!但是,我仍然无法执行基本数学运算,因为出现了一个新错误:可选类型“双倍”的值?必须解包为“双”类型的值”。示例:let currentPrice = Double(pricesAlpha?.globalQuote.price ?? "0.00")。此数学发生错误:return String(openPrice - prevClose)
  • 更新:使用 guard let 和 else 闭包,我能够解决我的问题。

标签: ios json swift string


【解决方案1】:

NSNumber 是一个围绕实际整数或浮点数等的对象包装器。您在代码中看到您调用floatValue 的位置?这得到了一个实际的数字,你可以用它来做数学运算。将final3final2 保留在他们的if 语句之外,然后计算一下。

也就是说,您几乎肯定应该在PriceAlpha 中实现自定义解码和编码,以便结构已经包含正确语义类型的值(例如Float)而不是String。但是对于财务信息,您实际上需要Decimal,而不是Float

【讨论】:

  • 感谢提示,我将把 final2 和 final3 移到 if 语句之外。我也很想在解码时将价格转换为浮点数或小数,根据我在堆栈溢出中找到的示例,这似乎非常复杂!
  • 不幸的是,我收到了一个基于我上面发布的简化函数的新错误。错误:可选类型“浮点数?”的值必须解包为“浮点”类型的值。我只想对价格进行基本的数学计算:(
猜你喜欢
  • 2012-07-29
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多