2015-10-15 116 views
0

我在将一个字符串转换为Swift中的Double时出现了令人惊讶的困难时间。只是为了给你一个我在做什么的概述,我正在解析一个XML文件并从特定元素中检索值。该代码看起来是这样,在Swift中将字符串转换为双精度(Xcode v 7.0.1)

var lat = "" 
var lati = 0.0 

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 

    if elementName == "lat" { 
     self.lat = foundCharacters 
     self.lati = (self.lat as NSString).doubleValue 
    } 

} 

当我打印self.lat坐标得到输出为一个字符串“36.97736”。但是,当我打印self.lati Double 0.0被打印。

我也试过

self.lat = foundCharacters 
let formatter = NSNumberFormatter() 
formatter.locale = NSLocale(localeIdentifier: "en_US") 
if let decimalAsDoubleUnwrapped = formatter.numberFromString(self.lat)  { 
    self.lati = decimalAsDoubleUnwrapped.doubleValue 
} 

,我像以前一样得到同样的结果。

FIXED:原来在“36.97736”的前面添加了额外的空白字符(空格),Swift抱怨该字符串不是Double格式,因此返回nil。

回答

1

在Swift 2.0中,可以使用Double(“String”),它返回一个可选项。这里是如何使用它在你的代码

lat = foundCharacters //not mentioned in the function btw 
    if let doubleFromlat = Double(lat) { 
     lati = doubleFromlat 
    } else { print("foundCharacters does not hold double") } 
+0

感谢您的回复。我试过这个,并继续去'else'语句。我打印'lat'和'lat'的坐标为String。然后我打印了“Double(lat)”,而'Double(lat)'则得到了'nil'。 – Ivan

+0

什么是发现字符?我认为那是当你将其分配给foundCharacters时lat在其值丢失的值。尝试在该作业后打印纬度 – Lukas

+0

它是“36.97736”,但在其正面印有4个空格。在“36.97736”上方也打印一条新线。我试图修剪空白,但那也没有奏效。 – Ivan

0

你可以试试这个:

extension String { 

    var asDouble : Double? { 
     if let d = Double(self) { 
      return d 
     } 
     return nil 
    } 
} 


let s = "21.5"  
s.asDouble 

enter image description here

+0

谢谢。我知道现在的问题是什么。 Swift没有将“36.97736”识别为Double,所以'self.lati =(self.lat作为NSString).doubleValue'将'nil'分配给'self.lati'。为什么会发生? – Ivan

0

使用NSNumberFormatter().numberFromString(:)?.doubleValue。因此,在您发布的代码段的上下文中:

let foundCharacters = "12.345" 
let lat = foundCharacters 
var lati: Double 

if let doubleFromlat = Double(lat) { 
    let lati = NSNumberFormatter().numberFromString(foundCharacters)?.doubleValue 
} else { 
    print("foundCharacters does not hold double") 
} 
相关问题