【发布时间】: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而不是Double或Float。如果您只想将String转换为Double,只需使用Double(yourString) -
嗨,Leo,我按照您的建议尝试了 Double(),它有效!但是,我仍然无法执行基本数学运算,因为出现了一个新错误:可选类型“双倍”的值?必须解包为“双”类型的值”。示例:
let currentPrice = Double(pricesAlpha?.globalQuote.price ?? "0.00")。此数学发生错误:return String(openPrice - prevClose) -
更新:使用 guard let 和 else 闭包,我能够解决我的问题。