Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用Swift将JSON字符串转换为数字时出错_Ios_Json_Swift_String - Fatal编程技术网

Ios 使用Swift将JSON字符串转换为数字时出错

Ios 使用Swift将JSON字符串转换为数字时出错,ios,json,swift,string,Ios,Json,Swift,String,我有一个在Swift中将字符串转换为数字的基本问题。我发现了一个很好的堆栈溢出,它可以帮助我将JSON字符串转换为数字,但是当我尝试加减值时,会出现错误。 我肯定我错过了一些明显的东西 菲尔 错误:引用“BinaryInteger”上的运算符函数“-”要求“NSNumber”符合“BinaryInteger” func red2G()->String { let numberFormatter = NumberFormatter() //

我有一个在Swift中将字符串转换为数字的基本问题。我发现了一个很好的堆栈溢出,它可以帮助我将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"
    }
}


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”的值。我只想对价格进行基本计算:(