2017-07-17 97 views
0

我正在使用一種服務來發送返回值類型爲String的服務,其中包含浮點數如Double,例如「1240.86」。 我想將它轉換爲Int,當我嘗試轉換像這樣Int(stringObject)轉換失敗時,值有浮點。 我該如何施展它? 謝謝!將字符串值從服務器格式化爲雙格式轉換爲

+2

強制注意,這不是鑄造而是轉換。你有沒有試過*將字符串轉換成雙精度並從那裏開始? – luk2302

+0

這就是我的解決方案,但我正在尋找更優雅的方式 –

+0

在這裏嘗試:https://stackoverflow.com/a/39658447/6479530 –

回答

3

嘗試在兩個步驟:

if let aDouble = Double(someString) { 
    let someInt = Int(aDouble) 
} 

或可能:

let someInt = Int(Double(someString) ?? 0) 

儘管後者是有點雜牌的,因爲你可能不希望強制如果的0值該字符串不是有效的數字。

+0

是的,我不會去與後者,因爲它是不可能區分一個字符串' 「0」來自無效號碼。 – JeremyP

+0

我還會添加'let someInt = Int(round(aDouble))'作爲選項 –

+0

@VasiliiMuravev是否應該舍入'Double'是一個單獨的決定,對於這個問題並不重要。 – rmaddy

2

你可以使用的Optionalmap(_:)方法任選鏈轉換(初始化通過,具體地)從StringDouble後跟一個從DoubleInt並有條件地將得到的整數的情況下,結合它不是nil(即成功地轉換):

let str = "1240.86" 
if let number = Double(str).map(Int.init) { 
    // number is of type Int and, in this example, of value 1240 
} 
+0

@down投票者:考慮給予反饋,而不是通過倒車投票。或者這只是一個憤怒的投票...? – dfri

+0

我不知道'可選地圖'功能。我喜歡這個。 – rmaddy

+0

@rmaddy大多數情況下,它的用例可以簡單地通過可選的鏈接來替換,但對於這種情況,這可能是一個好方法。另外請注意,有一個'optional'的'flatMap(_ :)'方法,它有時也可以使用(將單個參數作爲可選參數傳遞,而不打開它)。 – dfri

0

您可以通過點.分隔字符串:

func printInt(from str: String) { 
    let intValue = Int(str.components(separatedBy: ".")[0]) ?? 0 
    print(intValue) 
} 

printInt(from: "1234.56") // 1234 
printInt(from: "1234")  // 1234 
printInt(from: "0.54")  // 0 
printInt(from: ".54")  // 0 
printInt(from: "abc")  // 0 
相關問題