28 ответов:
Swift 2 + String to Double
вы должны использовать инициализаторы нового типа для преобразования между строковыми и числовыми типами (Double, Float, Int). Он вернет необязательный тип (Double?), которая будет иметь правильное значение или nil, если строка не является числом.
Примечание: свойство NSString doubleValue не рекомендуется, поскольку оно возвращает 0, если значение не может быть преобразовано (т. е.: неверный пользовательский ввод).
используйте Swift 2+ способ
let lessPrecisePI = Float("3.14") let morePrecisePI = Double("3.1415926536") let invalidNumber = Float("alphabet") // nil, not a valid numberразверните значения, чтобы использовать их, используя if / let
if let cost = Double(textField.text!) { print("The user entered a value price of \(cost)") } else { print("Not a valid number: \(textField.text!)") }читать дальше на моем сообщение в блоге о преобразовании строки в двойные типы.
Swift 2 Update Существуют новые отказоустойчивые инициализаторы, которые позволяют сделать это более идиоматичным и безопасным способом (как отмечалось во многих ответах, двойное значение NSString не очень безопасно, потому что оно возвращает 0 для значений без числа. Это означает, что
doubleValueна"foo"и"0"то же самое.)let myDouble = Double(myString)это возвращает необязательный, так что в таких случаях, как передача в
"foo"здесьdoubleValueвернул бы 0, failable intializer вернетnil. Вы можете использоватьguard,if-letилиmapобработкиOptional<Double>Исходный Пост: Вам не нужно использовать конструктор NSString, как предлагает принятый ответ. Вы можете просто соединить его так:
(swiftString as NSString).doubleValue
для немного более быстрого чувства, используя
NSFormatter()уклоняется от литья доNSString, и возвращаетnilкогда строка не содержитDoubleзначение (например, "тест" не будет возвращать0.0).let double = NSNumberFormatter().numberFromString(myString)?.doubleValueальтернативно, расширение Свифта
Stringтип:extension String { func toDouble() -> Double? { return NSNumberFormatter().numberFromString(self)?.doubleValue } }и использовать его как
toInt():var myString = "4.2" var myDouble = myString.toDouble()это возвращает необязательный
Double?, который должен быть развернут.либо с принудительной разворачивание:
println("The value is \(myDouble!)") // prints: The value is 4.2или с утверждением if let:
if let myDouble = myDouble { println("The value is \(myDouble)") // prints: The value is 4.2 }обновление: Для локализации очень легко применить локали к NSFormatter следующим образом:
let formatter = NSNumberFormatter() formatter.locale = NSLocale(localeIdentifier: "fr_FR") let double = formatter.numberFromString("100,25")наконец, вы можете использовать
NSNumberFormatterCurrencyStyleна форматере если вы работаете с валютой, где строка содержит символ валюты.
другой вариант здесь преобразует это в
NSStringи через что:let string = NSString(string: mySwiftString) string.doubleValue
вот метод расширения, который позволяет просто вызвать doubleValue () на Swift строку и получить двойной обратно (пример вывода идет первым)
println("543.29".doubleValue()) println("543".doubleValue()) println(".29".doubleValue()) println("0.29".doubleValue()) println("-543.29".doubleValue()) println("-543".doubleValue()) println("-.29".doubleValue()) println("-0.29".doubleValue()) //prints 543.29 543.0 0.29 0.29 -543.29 -543.0 -0.29 -0.29вот метод расширения:
extension String { func doubleValue() -> Double { let minusAscii: UInt8 = 45 let dotAscii: UInt8 = 46 let zeroAscii: UInt8 = 48 var res = 0.0 let ascii = self.utf8 var whole = [Double]() var current = ascii.startIndex let negative = current != ascii.endIndex && ascii[current] == minusAscii if (negative) { current = current.successor() } while current != ascii.endIndex && ascii[current] != dotAscii { whole.append(Double(ascii[current] - zeroAscii)) current = current.successor() } //whole number var factor: Double = 1 for var i = countElements(whole) - 1; i >= 0; i-- { res += Double(whole[i]) * factor factor *= 10 } //mantissa if current != ascii.endIndex { factor = 0.1 current = current.successor() while current != ascii.endIndex { res += Double(ascii[current] - zeroAscii) * factor factor *= 0.1 current = current.successor() } } if (negative) { res *= -1; } return res } }нет проверки ошибок, но вы можете добавить его, если вам это нужно.
в Swift 2.0 лучший способ-не думать как разработчик Objective-C. Поэтому вы не должны" конвертировать строку в Double", но вы должны"инициализировать Double из строки". Apple doc здесь: https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_Double_Structure/index.html#//apple_ref/swift/structctr/Double/s:FSdcFMSdFSSGSqSd_
Это необязательный init, поэтому вы можете использовать оператор слияния nil (??), чтобы установить значение по умолчанию. Пример:
let myDouble = Double("1.1") ?? 0.0
попробуйте это:
var myDouble = myString.bridgeToObjectiveC().doubleValue println(myDouble)Примечание
удалено в бета-версии 5. Это больше не работает ?
On SWIFT 3, вы можете использовать:
if let myDouble = NumberFormatter().number(from: yourString)?.doubleValue { print("My double: \(myDouble)") }Примечание.: - Если строка содержит какие-либо символы, отличные от числовых цифр или соответствующих языковому стандарту групповых или десятичных разделителей, синтаксический анализ завершится ошибкой. - Любые начальные или конечные символы разделителя пробелов в строке игнорируются. Например, строки "5", "5" и " 5 " все производят число 5.
взяты из документация: https://developer.apple.com/reference/foundation/numberformatter/1408845-number
это основывается на ответе @Ryu
его решение отлично, пока вы находитесь в стране, где точки используются в качестве разделителей. По умолчанию
NSNumberFormatterиспользует устройства языка. Поэтому это будет не во всех странах, где запятая используется в качестве разделителя по умолчанию (включая Францию как @PeterK. упомянуто), если число использует точки в качестве разделителей (что обычно имеет место). Чтобы установить локаль этого NSNumberFormatter как US и, таким образом, использовать точки в качестве разделителей, замените линияreturn NSNumberFormatter().numberFromString(self)?.doubleValueС
let numberFormatter = NSNumberFormatter() numberFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") return numberFormatter.numberFromString(self)?.doubleValueпоэтому полный код становится
extension String { func toDouble() -> Double? { let numberFormatter = NSNumberFormatter() numberFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") return numberFormatter.numberFromString(self)?.doubleValue } }чтобы использовать это, просто позвоните
"Your text goes here".toDouble()это вернет необязательный
Double?как упоминал @Ryu, вы можете либо заставить развернуть:
println("The value is \(myDouble!)") // prints: The value is 4.2или использовать
if letо себе:if let myDouble = myDouble { println("The value is \(myDouble)") // prints: The value is 4.2 }
Я не видел ответа, который я искал. Я просто размещаю здесь свой, если это может помочь кому-либо. Этот ответ действителен только в том случае, если вам не нужен определенный формат.
Swift 3
extension String { var toDouble: Double { return Double(self) ?? 0.0 } }
SWIFT 4
extension String { func toDouble() -> Double? { let numberFormatter = NumberFormatter() numberFormatter.locale = Locale(identifier: "en_US_POSIX") return numberFormatter.number(from: self)?.doubleValue } }
пожалуйста, проверьте его на площадку!
let sString = "236.86" var dNumber = NSNumberFormatter().numberFromString(sString) var nDouble = dNumber! var eNumber = Double(nDouble) * 3.7кстати в моем Xcode
.toDouble () - не существует
.doubleValue создать значение 0.0 из не числовых строк...
SWIFT 3
чтобы очистить, в настоящее время существует метод по умолчанию:
public init?(_ text: String)наDoubleкласса.Он может быть использован для всех классов.
let c = Double("-1.0")let f = Double("0x1c.6")let i = Double("inf")и т. д.
1.
let strswift = "12" let double = (strswift as NSString).doubleValue2.
var strswift= "10.6" var double : Double = NSString(string: strswift).doubleValueможет быть это поможет вам.
как уже отмечалось, лучший способ добиться этого - это прямое литье:
(myString as NSString).doubleValueстроя из этого, вы можете сделать гладкое собственное расширение строки Swift:
extension String { var doubleValue: Double { return (self as NSString).doubleValue } }Это позволяет непосредственно использовать:
myString.doubleValue, который будет выполнять для вас кастинг. Если Apple добавляет
doubleValueк родной строке вам просто нужно удалить расширение и остальная часть вашего кода будет автоматически компилироваться нормально!
расширение с дополнительным языковым стандартом
Swift 2.2
extension String { func toDouble(locale: NSLocale? = nil) -> Double? { let formatter = NSNumberFormatter() if let locale = locale { formatter.locale = locale } return formatter.numberFromString(self)?.doubleValue } }Swift 3.1
extension String { func toDouble(_ locale: Locale) -> Double { let formatter = NumberFormatter() formatter.numberStyle = .decimal formatter.locale = locale formatter.usesGroupingSeparator = true if let result = formatter.number(from: self)?.doubleValue { return result } else { return 0 } } }
Swift 4.0
попробуй такое
let str:String = "111.11" let tempString = (str as NSString).doubleValue print("String:-",tempString)
можно использовать StringEx. Он расширяет
Stringс преобразованиями строки в число, включаяtoDouble().extension String { func toDouble() -> Double? }он проверяет строку и терпит неудачу, если она не может быть преобразована в double.
пример:
import StringEx let str = "123.45678" if let num = str.toDouble() { println("Number: \(num)") } else { println("Invalid string") }
Swift 4
extension String { func toDouble() -> Double { let nsString = self as NSString return nsString.doubleValue } }
Как работает:
// Init default Double variable var scanned: Double() let scanner = NSScanner(string: "String to Scan") scanner.scanDouble(&scanned) // scanned has now the scanned value if something was found.
используйте этот код в Swift 2.0
let strWithFloat = "78.65" let floatFromString = Double(strWithFloat)
Swift: - 4
есть два способа сделать это:
Строка - > Int - > Double:
let strNumber = "314" let intFromString = Int(strNumber) let dobleFromInt = Double(intFromString!) print(dobleFromInt)String - > NSString - > Double
let strNumber = "314" let NSstringFromString = NSString(string: strNumber as! NSString) let doubleFromNSString = NSstringFromString.doubleValue print(doubleFromNSString)используйте его в любом случае вам нравится в соответствии с вашими потребностями кода.
Я нахожу более читаемым, чтобы добавить расширение в строку следующим образом:
extension String { var doubleValue: Double { return (self as NSString).doubleValue } }и тогда вы просто могли бы написать свой код:
myDouble = myString.doubleValue
моя проблема была запятая, поэтому я решаю ее следующим образом:
extension String { var doubleValue: Double { return Double((self.replacingOccurrences(of: ",", with: ".") as NSString).doubleValue) } }
Comments