Ios 使用Swift将JSON字符串转换为数字时出错
我有一个在Swift中将字符串转换为数字的基本问题。我发现了一个很好的堆栈溢出,它可以帮助我将JSON字符串转换为数字,但是当我尝试加减值时,会出现错误。 我肯定我错过了一些明显的东西 菲尔Ios 使用Swift将JSON字符串转换为数字时出错,ios,json,swift,string,Ios,Json,Swift,String,我有一个在Swift中将字符串转换为数字的基本问题。我发现了一个很好的堆栈溢出,它可以帮助我将JSON字符串转换为数字,但是当我尝试加减值时,会出现错误。 我肯定我错过了一些明显的东西 菲尔 错误:引用“BinaryInteger”上的运算符函数“-”要求“NSNumber”符合“BinaryInteger” func red2G()->String { let numberFormatter = NumberFormatter() //
错误:引用“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"
}
}
NSNumber
是一个围绕实际整数或浮点值或其他值的对象包装器。您可以在代码中看到调用floatValue
?这就得到了一个你可以计算的实际数字。将final3
和final2
放在它们的if
语句之外,并对其进行计算
这就是说,您几乎肯定应该在
PriceAlpha
中实现自定义解码和编码,这样结构就已经包含了正确语义类型的值(例如Float
),而不是String
。但是对于财务信息,您实际上需要的是Decimal
,而不是Float您可以发布您的JSON字符串吗?“错误:引用运算符函数”在哪一行?该发布将返回字符串
而不是Double
或Float
。如果您只想将String
转换为Double
只需使用Double(您的字符串)
Hi Leo,我按照您的建议尝试了Double(),效果很好!但是,我仍然无法执行基本的数学运算,因为出现了一个新错误:可选类型为“Double”的值必须解包为类型为“Double”的值。例如:let currentPrice=Double(pricesAlpha?.globalQuote.price???“0.00”)
。此数学运算出错:返回字符串(openPrice-prevClose)
Update:使用guard let和else Close,我能够解决我的问题。感谢您的提示,我将把final2和final3移到if语句之外。我还希望在解码时将价格转换为浮点或十进制,根据我在堆栈溢出上发现的示例,这似乎非常复杂!不幸的是,我收到了一个新的error基于我上面发布的简化函数。错误:可选类型“Float”的值必须解包为类型“Float”的值。我只想对价格进行基本计算:(