在Swift 3中将可选字符串转换为双精度浮点数

16


我有一个选项字符串,想要将其转换为double类型。
在Swift 2中可以工作,但自从转换为Swift 3后,我得到的值为0。

var dLati = 0.0
dLati = (latitude as NSString).doubleValue

我检查了一下,纬度的可选字符串值可能类似于-80.234543218675654,但dLati的值为0。

*************** 好的,为了更清晰更新 *****************
我有一个视图控制器,在其中有一个按钮,当点击该按钮时,它会调用另一个视图控制器并传递一些值。以下是第一个视图控制器的代码:

var currentLatitude: String? = ""
var currentLongitude: String? = ""
var deviceName = ""
var address = ""
// somewhere in the code, currentLatitude and currentLongitude are get set  
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "map" {
       let destViewController : MapViewController = segue.destination as! MapViewController
       print(currentLongitude!)  // Print display: Optional(-80.192279355363768)
       print(currentLatitude!) // Print display: Optional(25.55692663937162) 
       destViewController.longitude = currentLongitude!
       destViewController.latitude = currentLatitude!
       destViewController.deviceName = deviceName
       destViewController.address = address
    }
}

这里是第二个视图控制器MapViewController的代码

   var longitude: String? = " "
   var latitude: String? = ""
   .
   .
   override func viewDidLoad() {
       if let lat = latitude {
          print(lat) // Print display: optiona(25.55692663937162)
          dLati = (lat as NSString).doubleValue
          print(dLati)  // Print display: 0.0
       }
       .
       .
   }

谢谢 Borna


2
latitude 是从哪里来的?它是如何声明的?它保证始终具有非 nil 的有效数字值吗? - rmaddy
10个回答

27
使用Double的初始化程序是一种安全的方法,可以实现此操作,而不需要使用Foundation类型:
if let lat = latitude, let doubleLat = Double(lat) {
  print(doubleLat)  // doubleLat is of type Double now
}

6
安全地获取latitude的值并使用。
var dLati = 0.0

if let lat = latitude {
    dLati = (lat as NSString).doubleValue
}

6
let dLati = Double(latitude ?? "") ?? 0.0

3
您可以通过一行简单的代码来实现此操作。
var latitude: Double = Double("-80.234543218675654") ?? 0.0

这创建了一个名为latitude的变量,它是Double类型的,可以通过将String转换为Double实例化成功,或者给定一个回退值0.0。


3

这段代码可以正常运行。

var dLati = 0.0
let latitude: String? = "-80.234543218675654"
if let strLat = latitude {
    dLati = Double(strLat)!
}

6
这很危险。仅因为OP的“纬度”值在某种情况下恰好具有此特定值,并不意味着它总是具有有效值。应该进行适当的解包操作。 - rmaddy
1
还是不行。在调试器中,如果我打印纬度的描述,我会得到这个--> 打印self.latitude的描述:"Optional(26.55692667237162)"。而dLati的值为--> 打印self.dLati的描述:0.0。 - borna
@borna 首先你必须解包纬度的值。检查我的答案。同时,提供一些关于你获取的纬度值和其类型的来源。 - Rajan Maheshwari
1
Rajan,还是不行。这是我的代码: var longitude: String? = " " var latitude: String? = " "
if let lat = latitude { print(lat) dLati = (lat as NSString).doubleValue print(dLati) }打印结果为: Optional(26.55692667237162) 0.0那么,为什么dLati仍然是0.0呢?
- borna
@borna,你怎么打印出 Optional(26.55692667237162) 的结果呢?在你的代码中没有设置这个值。根据你的代码,你只是设置了一个空字符串,什么都没有设置。那么这个值从哪里来的呢?dLati 是0.0,因为你在经纬度上使用了空字符串。 - Rajan Maheshwari
@Rajan,我在原来的问题中添加了更多的代码,以使我遇到的问题更加清晰易懂。 - borna

2
当您得到一个带有双精度值的字符串,类似于这样:
"Optional(12.34567)"

您可以使用正则表达式从字符串中提取出双精度值。 以下是一个正则表达式示例,如果字符串为"Optional(12.34567)"
let doubleLatitude = location.latitude?.replacingOccurrences(of: "[^\\.\\d+]", with: "", options: [.regularExpression])

0

实际上,单词“optional”是字符串的一部分。不确定它是如何添加到字符串中的?但我解决的方法是这样的。纬度是这个字符串“Optional(26.33691567239162)”,然后我写了这段代码。

let start = latitude.index(latitude.startIndex, offsetBy: 9) 
let end = latitude.index(latitude.endIndex, offsetBy: -1) 
let range = start..<end 
latitude = latitude.substring(with: range) 

并得到最终值
26.33691567239162


0
不要将它转换为 NSString,而是可以强制将其转换为 Double,但如果失败了,需要有备选方案。可以像这样写:
let aLat: String? = "11.123456"
let bLat: String? = "11"
let cLat: String? = nil

let a = Double(aLat!) ?? 0.0 // 11.123456
let b = Double(bLat!) ?? 0.0 // 11
let c = Double(cLat!) ?? 0.0 // 0

所以在你的情况下:

dLati = Double(latitude!) ?? 0.0

更新: 要处理nil值,请执行以下操作(请注意,let cLat为nil):

// Will succeed
if let a = aLat, let aD = Double(aLat!) {
    print(aD)
}
else {
    print("failed")
}

// Will succeed
if let b = bLat, let bD = Double(bLat!) {
    print(bD)
}
else {
    print("failed")
}

// Will fail
if let c = cLat, let cD = Double(cLat!) {
    print(cD)
}
else {
    print("failed")
}

2
如果aLatbLatcLat中的任何一个值为nil,它将会崩溃。 - Rajan Maheshwari
让 dLatitude = Double(latitude ?? "") ?? 0.0 - user3441734
实际上"Optional"是字符串的一部分。不确定为什么在字符串中加入了 "Optional"? 我解决的方法是这样的。 纬度是这个字符串 "Optional(26.33691567239162)",然后我做了这个 ---> let start = latitude.index(latitude.startIndex, offsetBy: 9)
let end = latitude.index(latitude.endIndex, offsetBy: -1)
let range = start..<end
latitude = latitude.substring(with: range)
最终值是 --> 26.33691567239162
- borna
@borna,之所以使用Optional是因为它是一个选项,你需要确保该值有一个值。我不建议你这样做,因为如果该值为nil并且你试图按照你解决问题的方式进行操作,它将崩溃并显示错误fatal error: unexpectedly found nil while unwrapping an Optional value。请查看我的答案,看看是否可以更新你的代码以更加安全。 - Rashwan L

0
Swift 3.1 中,我们可以结合扩展和具体约束扩展。
extension Optional where Wrapped == String
{
    var asDouble: Double
    {
        return NSString(string: self ?? "").doubleValue
    }
}

或者

extension Optional where Wrapped == String
{
        var asDouble: Double
        {
            return Double(str ?? "0.00") ?? 0.0
        }
}

-1

Swift 4

 let YourStringValue1st = "33.733322342342" //The value is now in string
 let YourStringValue2nd = "73.449384384334" //The value is now in string

 //MARK:- For Testing two Parameters 
 if let templatitude = (YourStringValue1st as? String), let templongitude = (YourStringValue2nd as? String)
 {
     movetosaidlocation(latitude: Double(templat)!, longitude: Double(templong)!, vformap: cell.vformap)
 }


 let YourStringValue = "33.733322342342" //The value is now in string
 //MARK:- For Testing One Value
 if let tempLat = (YourStringValue as? String)
 {
      let doublevlue = Double(tempLat)
      //The Value is now in double (doublevlue)
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接