【问题标题】:Convert String Values From Server Formatted as Double To Int将字符串值从服务器格式化为 Double 转换为 Int
【发布时间】:2017-07-17 15:23:18
【问题描述】:

我正在使用一个服务,该服务发送回 String 类型的值,其中包含像 Double 这样的浮点数,例如“1240.86”。 我想将其转换为Int,当我尝试像Int(stringObject) 那样转换时,当值具有浮点时,转换失败。 我该如何施放它? 谢谢!

【问题讨论】:

  • 只是一个注释,不是转换而是转换。您是否尝试过将字符串转换为双精度并从那里开始?
  • 这是我现在的解决方案,但我正在寻找更优雅的方式

标签: swift int


【解决方案1】:

分两步试试:

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

或者可能:

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

虽然后者有点杂乱无章,因为如果字符串不是有效数字,您可能不想强制使用 0 的值。

【讨论】:

  • 是的,我不会选择后者,因为无法区分字符串 "0" 和无效数字。
  • 我还会添加let someInt = Int(round(aDouble)) 作为选项
  • @VasiliiMuravev Double 是否应该四舍五入是一个单独的决定,对这个问题并不重要。
【解决方案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
}

【讨论】:

  • @down voter:考虑提供反馈,而不是直接投反对票。或者这只是一个愤怒的反对票......?
  • 我不知道Optional map 函数。我喜欢这个。
  • @rmaddy 大多数情况下,它的用例可以简单地通过可选链接替换,但对于这种情况,这可能是一种好方法。另请注意,OptionalflatMap(_:) 方法有时也可以使用(将单个参数作为可选参数传递而不展开它)。
【解决方案3】:

你可以用点分隔字符串.:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2015-12-07
    • 2019-01-08
    • 2018-10-08
    • 2012-03-24
    • 1970-01-01
    相关资源
    最近更新 更多