Swift - как конвертировать строку в Double



Я пытаюсь написать программу ИМТ на языке swift.
И у меня такая проблема: как преобразовать строку в Double?



в Objective-C, я могу сделать такой:



double myDouble = [myString doubleValue];



но как я могу достичь этого на языке Swift?

691   28  

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 1.1, вы можете напрямую передать String до

в 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).doubleValue

2.

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)

или вы могли бы сделать:

var myDouble = Double((mySwiftString.text as NSString).doubleValue)

можно использовать 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

есть два способа сделать это:

  1. Строка - > Int - > Double:

    let strNumber = "314"
    let intFromString = Int(strNumber)
    let dobleFromInt = Double(intFromString!)
    print(dobleFromInt)
    
  2. 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)
    }
}
var stringValue = "55"

var convertToDouble = Double((stringValue as NSString).doubleValue)

мы можем использовать значение CDouble, которое будет получено myString.doubleValue

Comments

    Ничего не найдено.