2017-01-07 3 views
0

Попытка сделать что-то настолько простое, но это просто не работает для меня.Swift 3.0 Преобразование строки в двойное возвращаемое число?

КОД:

let long = index["Longitude"] as! String 
let lat = index["Latitude"] as! String 

print(long as Any) 
print(lat as Any) 

let doubleLong = Double(long) 
print(doubleLong as Any) 

DEBUG ВЫВОД:

-85.1113644443208 
32.880541654362 
nil 

^^^ Почему так ноль? Я добавлю, что это вытягивается из ответа JSON. Возможно, это имеет к этому какое-то отношение.

+0

Что такое 'lancerLong'? –

+0

@RemyCilia Просто установите его выше. введите неверную переменную. – aggnt

+0

Показать отрывок из JSON. Кстати, каковы эти «Любые»? И соглашайтесь с соглашением об именах, что имена переменных начинаются всегда с буквы нижнего регистра. – vadian

ответ

4

Скорее всего, это дополнительное пространство в ваших данных, примечание:

print(Double("-85.1113644443208")) // => Optional(-85.111364444320799) 
print(Double("-85.1113644443208 ")) // => nil 
print(Double(" -85.1113644443208")) // => nil 

подбирайте пространства первым:

let doubleLong = Double(long.trimmingCharacters(in: CharacterSet.whitespaces)) 

или использовать NumberFormatter для синтаксического анализа:

let numberFormatter = NumberFormatter() 
numberFormatter.numberStyle = .decimal 
numberFormatter.locale = Locale(identifier: "en_US_POSIX") 

print(numberFormatter.number(from: "-85.1113644443208") as Double?) // => Optional(-85.111364444320799) 
print(numberFormatter.number(from: " -85.1113644443208") as Double?) // => Optional(-85.111364444320799) 
print(numberFormatter.number(from: "-85.1113644443208 ") as Double?) // => Optional(-85.111364444320799) 
+0

обрезка белых пространств! Спасибо огромное! – aggnt

+0

ничего себе .. это спасло мое время .. :) – christijk

0

Есть новые отказоустойчивые инициализаторы, которые позволяют вам делать это более идиоматичным и безопасным способом (как было отмечено многими ответами, двойное значение String не очень безопасно, поскольку оно возвращает 0 для значений без номера. Это означает, что doubleValue «Foo» и «0» одни и те же.)

пусть myDouble = Двухместный (туЗЬптд)

Это возвращает необязательный, поэтому в таких случаях, как переходящие в «Foo», где doubleValue вернулся бы 0, в failable intializer вернет нуль. Вы можете использовать охрану, если говоря, или карту для обработки Факультативного

Смежные вопросы