Преобразование текста из строки в двойную [дубликат]

size = 3
matrix_surprise = [[0] * size] * size
matrix = [[0]*size for i in range(size)]

Frames and Objects [/g1]

Live Python Tutor Визуализировать

188
задан ohyes 16 June 2014 в 09:36
поделиться

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!)")
}

Подробнее о моем сообщении в блоге о преобразовании строк в двойные типы .

79
ответ дан Paul Solt 18 August 2018 в 15:38
поделиться
  • 1
    это должно стать самым высоким голосованием. (я собирался добавить его сам, но проверял, не сделал ли кто-нибудь еще этого) – Sam 5 October 2015 в 14:22
  • 2
    Другая проблема заключается в том, что он не поддерживает номера в разных языковых версиях, отличных от 1000.00, если вы используете другие форматы, такие как 1 000,00, он бы обрезал 2 десятичных знака в конце. По крайней мере, это то, что происходит для Objective-C. - Согласно документации Apple: (они не знакомы с локалью). Следующие удобные методы пропускают символы начального пробела (whitespaceSet) и игнорируют конечные символы. Они не знакомы с местными языками. NSScanner или NSNumberFormatter можно использовать для более сильного и локализованного анализа чисел. – mskw 16 March 2017 в 16:27
  • 3
    разворачивание - это путь – Schmoudi 12 February 2018 в 18:29

Swift: - 4

Возможно, есть два способа сделать это:

  1. String -> 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)
    

Используйте его так, как вам нравится, в соответствии с вашим кодом.

0
ответ дан Abhirajsinh Thakore 18 August 2018 в 15:38
поделиться

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

-6
ответ дан ANIL.MUNDURU 18 August 2018 в 15:38
поделиться
  • 1
    Ошибка: «String» не имеет члена с именем «doubleValue» – Matthew Knippen 23 July 2014 в 23:21
  • 2
    @Matthew Да нет члена, называемого «двойное значение», поэтому мы можем использовать значение CDouble Value – ANIL.MUNDURU 7 August 2014 в 12:37
  • 3
    ru.wikipedia.org/wiki/… Обратитесь к сложным номерам там и прочитайте справочную документацию Swift .. Нет никакого CDouble ... Вы говорите о Swift или другом языке? И я имею в виду быстрые без расширений? – Adrian Sluyters 12 August 2014 в 16:43

Что также работает:

// 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.
0
ответ дан Bijan 18 August 2018 в 15:38
поделиться

Попробуйте следующее:

   var myDouble = myString.bridgeToObjectiveC().doubleValue
   println(myDouble)

ПРИМЕЧАНИЕ

Удалено в бета-версии 5. Это больше не работает?

9
ответ дан CW0007007 18 August 2018 в 15:38
поделиться
  • 1
    bridgeToObjectiveC () был удален в Xcode 6 Beta 5. Метод Smiley's самый быстрый, который я нашел в данный момент – faraquet99 6 August 2014 в 21:44

1.

let strswift = "12"
let double = (strswift as NSString).doubleValue

2.

var strswift= "10.6"
var double : Double = NSString(string: strswift).doubleValue 

Может быть, эта помощь для вас.

3
ответ дан Daxesh Nagar 18 August 2018 в 15:38
поделиться

Для немного более быстрого ощущения, используя NSFormatter(), избегает кастинга NSString и возвращает nil, когда строка не содержит значения Double (например, «тест» не вернет 0.0).

let double = NSNumberFormatter().numberFromString(myString)?.doubleValue

Альтернативно, расширяя тип String Swift:

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
}

Update : Для локализации очень легко применять локали к NSFormatter следующим образом:

let formatter = NSNumberFormatter()
formatter.locale = NSLocale(localeIdentifier: "fr_FR")
let double = formatter.numberFromString("100,25")

Наконец, вы можете использовать NSNumberFormatterCurrencyStyle в форматировании, если работаете с валютами, где строка содержит валюту символ.

67
ответ дан Eneko Alonso 18 August 2018 в 15:38
поделиться
  • 1
    Мне нравится идея расширения класса String для приложений, которые будут использовать несколько мест преобразования. Но я не вижу преимущества сложности вызова NSNumberFormatter, поскольку приведение в NSString и использование .doubleValue, по-видимому, по меньшей мере так же прямолинейны, и их легче читать и запоминать. – clearlight 3 November 2014 в 21:45
  • 2
    На самом деле преимущество использования NSNumberFormatter () заключается в том, что метод numberFromString: возвращает nil, если строка содержит символы, которые не составляют двойной. Проблема с doubleValue в NSString заключается в том, что она всегда будет возвращать двойной (0.0 для «теста», например) независимо. Поэтому, если вы имеете дело со всеми типами строк, и вы хотите проверить, является ли строка просто двойной, никаких дополнительных символов, использующих NSNumberFormatter, это путь. – dirkgroten 10 February 2015 в 11:57
  • 3
    Это не по-французски. – Peter K. 12 May 2015 в 16:32
  • 4
    Это отличное решение, но, используя только этот код, он не будет работать в странах, где запятые используются в качестве разделителей (в том числе Франция как @PeterK). Я попробовал написать комментарий с решением, но он был слишком длинным, поэтому я должен был сделать это вместо ответа. Вот вы: Модифицированное решение – Jacob R 15 July 2015 в 13:39
  • 5
    Работает!!! Хороший – LIH 26 August 2015 в 11:27

Как уже указывалось, лучший способ достичь этого - с прямым литьем:

(myString as NSString).doubleValue

Построим из этого, вы можете сделать плавное родное расширение Swift String:

extension String {
    var doubleValue: Double {
        return (self as NSString).doubleValue
    }
}

Это позволяет вам прямо использовать:

myString.doubleValue

Который выполнит кастинг для вас. Если Apple добавит doubleValue к родной String, вам просто нужно удалить расширение, а остальная часть вашего кода будет автоматически компилироваться.

3
ответ дан Firo 18 August 2018 в 15:38
поделиться
  • 1
    Метод Apple будет называться .toDouble ... так же, как toInt. Это странное упущение. Вероятно, будет исправлено в будущей версии Swift. Мне нравится метод расширения, который лучше всего сохраняет код. – n13 23 June 2015 в 10:13
  • 2
    Возвращаемое значение должно быть двойным NOT a Float – Leo Dabus 23 September 2015 в 06:01
var stringValue = "55"

var convertToDouble = Double((stringValue as NSString).doubleValue)
6
ответ дан itsji10dra 18 August 2018 в 15:38
поделиться
  • 1
    Это правильный ответ. Версия Swift 3 будет NumberFormatter().number(from: myString)?.doubleValue – nicolas leo 23 September 2016 в 10:35

Обновление Swift 2 Есть новые отказоустойчивые инициализаторы, которые позволяют вам делать это более идиоматичным и безопасным способом (как было отмечено многими ответами, двойное значение 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
260
ответ дан Jarsen 18 August 2018 в 15:38
поделиться
  • 1
    прекрасно работает! и мне нравится более сжатая форма. – Pascal Belloncle 31 October 2014 в 08:31
  • 2
    охай, Ярсен. Одним из недостатков этого подхода является то, что он не будет терпеть неудачу, если строка не является допустимым двойным. Вместо этого вы получите 0.0. То есть, результат - [NSString doubleValue] является Double быстрым, как показано в Double? (Optional<Double>). Это отличается от функции Swift String toInt(), которая возвращает Int? и заявляет в документах, что она «принимает строки, которые соответствуют регулярному выражению» [- +]? [0-9] + & quot; . Только & Quot; – Derrick Hathaway 5 January 2015 в 05:54
  • 3
    В Swift 2.0 теперь доступен Double.init?(_ text: String) failable initializer. – mixel 29 September 2015 в 13:13
  • 4
    На самом деле это звучит как отличная поэма! Пусть мой двойной поплавок, моя строка, моя любовь, моя драгоценность ... – Liron Berger 18 October 2015 в 13:05
  • 5
    Это не лучший подход. Он будет терпеть неудачу в зависимости от разделителя. Это будет хорошо с '.' но не с ','. NSNumberFormatter будет поддерживать десятичный разделитель, используемый в текущей локализации. – Julian Król 11 March 2016 в 10:42

В SWIFT 3 вы можете использовать:

if let myDouble = NumberFormatter().number(from: yourString)?.doubleValue {
   print("My double: \(myDouble)")
}

Примечание: - Если строка содержит любые символы, отличные от числовых цифр или подходящие для локали группы или десятичные разделители, синтаксический анализ завершится с ошибкой. - Любые символы разделителя пробелов или строк в строке игнорируются. Например, строки «5», «5» и «5» производят номер 5.

Из документации: https://developer.apple.com/reference/ основа / NumberFormatter / 1408845 номер

9
ответ дан Jorge Luis Jiménez 18 August 2018 в 15:38
поделиться

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

var myDouble = Double((mySwiftString.text as NSString).doubleValue)
1
ответ дан jr00n 18 August 2018 в 15:38
поделиться

Другим вариантом здесь является преобразование этого в NSString и использование этого:

let string = NSString(string: mySwiftString)
string.doubleValue
51
ответ дан Keith Smiley 18 August 2018 в 15:38
поделиться
  • 1
    Хотелось бы, чтобы был хороший способ сделать это. Как я могу узнать, если, например, не удалось выполнить синтаксический анализ. – Ryan Hoffman 5 June 2014 в 15:50
  • 2
    @RyanHoffman К сожалению, контракт NSString doubleValue никогда не предоставлял ничего подобного. Все, что вы получаете, равно 0.0, если строка не начинается с допустимого представления числа, HUGE_VAL и -HUGE_VAL при переполнении / недополнении. Если вы хотите знать, почему синтаксический анализ завершился неудачно, я считаю, что вам нужно заглянуть в NSNumberFormatter, который был разработан для более точного преобразования чисел и строк. – Jarsen 10 October 2014 в 19:09
  • 3
    есть более сжатый способ сделать это. см. мой ответ ниже. – Jarsen 10 November 2014 в 21:30
  • 4
    Так как может быть трудно найти ответ, вот он: (swiftString as NSString).doubleValue – LearnCocos2D 10 December 2014 в 19:08
  • 5
    Я связался с другим ответом ниже. Надеюсь, @ohyes вернется в какой-то момент и отметит это как правильный ответ. – Keith Smiley 10 December 2014 в 20:58

Пожалуйста, проверьте это на детской площадке!

let sString = "236.86"

var dNumber = NSNumberFormatter().numberFromString(sString)
var nDouble = dNumber!
var eNumber = Double(nDouble) * 3.7

Кстати, в моем Xcode

.toDouble () - не существует

.doubleValue создать значение 0.0 из не числовых строк ...

4
ответ дан Mamazur 18 August 2018 в 15:38
поделиться

Используйте этот код в Swift 2.0

let strWithFloat = "78.65" let floatFromString = Double(strWithFloat)

0
ответ дан Maninderjit Singh 18 August 2018 в 15:38
поделиться

Расширение с дополнительным языком

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
        }
    }
}
3
ответ дан Mihael Isaev 18 August 2018 в 15:38
поделиться
  • 1
    Обновите Swift 3 и добавьте пример для локали. спасибо. – Peter Kreinz 21 April 2017 в 08:27
  • 2
    Я добавил пример Swift 3.1. Что вы подразумеваете под & quot; ... и добавьте пример для locale & quot ;? – Mihael Isaev 21 April 2017 в 15:42
  • 3
    Всегда полезно указать пример использования. Спасибо. – Peter Kreinz 22 April 2017 в 17:46

Вот метод расширения, который позволяет вам просто вызвать 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
    }
}

Нет проверки ошибок, но вы можете добавить его, если вам это нужно.

23
ответ дан Millie Smith 18 August 2018 в 15:38
поделиться
  • 1
    Это, безусловно, лучший вариант. Если вы прочитали быструю книгу, расширения поощряются ... Это был последний вариант, о котором я думал! : D Я делаю все, что в моих силах, чтобы избежать мостов, поэтому для этого хватит! – Adrian Sluyters 12 August 2014 в 16:35

моя проблема была запятой, поэтому я решаю ее следующим образом:

extension String {
    var doubleValue: Double {
        return Double((self.replacingOccurrences(of: ",", with: ".") as NSString).doubleValue)
    }
}
-1
ответ дан Murat Akdeniz 18 August 2018 в 15:38
поделиться

С Swift 1.1 вы можете напрямую передать параметр String в const char *.

import Foundation

let str = "123.4567"
let num = atof(str) // -> 123.4567

atof("123.4567fubar") // -> 123.4567

Если вам не нравятся устаревшие atof:

strtod("765.4321", nil) // -> 765.4321

Одно предупреждение: поведение преобразования отличается от NSString.doubleValue.

atof и strtod принять 0x префикс шестнадцатеричной строки:

atof("0xffp-2") // -> 63.75
atof("12.3456e+2") // -> 1,234.56
atof("nan") // -> (not a number)
atof("inf") // -> (+infinity)

Если вы предпочитают поведение .doubleValue, мы все еще можем использовать мост CFString:

let str = "0xff"
atof(str)                      // -> 255.0
strtod(str, nil)               // -> 255.0
CFStringGetDoubleValue(str)    // -> 0.0
(str as NSString).doubleValue  // -> 0.0
18
ответ дан rintaro 18 August 2018 в 15:38
поделиться

Вы можете использовать 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")
}
1
ответ дан Stas 18 August 2018 в 15:38
поделиться

SWIFT 4

extension String {
    func toDouble() -> Double? {
        let numberFormatter = NumberFormatter()
        numberFormatter.locale = Locale(identifier: "en_US_POSIX")
        return numberFormatter.number(from: self)?.doubleValue
    }
}
3
ответ дан t4nhpt 18 August 2018 в 15:38
поделиться

Я не видел ответа, который я искал. Я просто размещаю здесь свой, если он может помочь кому угодно. Этот ответ действителен только в том случае, если вам не нужен конкретный формат.

Swift 3

extension String {
    var toDouble: Double {
        return Double(self) ?? 0.0
    }
}
5
ответ дан TomCobo 18 August 2018 в 15:38
поделиться

В Swift 2.0 лучший способ - не думать, как разработчик Objective-C. Таким образом, вы не должны «преобразовывать строку в двойную», но вам следует «инициализировать Double from the String». 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
10
ответ дан Toom 18 August 2018 в 15:38
поделиться
  • 1
    Double.init?(_ text: String) становятся доступными в Swift 2.0. Вы должны упомянуть об этом. Другие ответы здесь не потому, что люди думают, как разработчики Objective-C, но потому, что этот инициализатор был недоступен ранее. – mixel 29 September 2015 в 13:10
  • 2
    Действительно, вы правы. Это доступно только в Swift 2.0, я упомянул об этом :) Но, как и на других языках, вы инициализируете тип другим, и не должны ожидать, что тип сможет конвертировать в другой. Долгое обсуждение, но как разработчик Obj-C у меня много плохих практик при кодировании с Swift, и это один из них :) – Toom 29 September 2015 в 20:38
  • 3
    Благодаря! Самый чистый путь без участия вызова NSString – DazChong 19 December 2015 в 09:27

Swift 4.0

попробуйте это

 let str:String = "111.11"
 let tempString = (str as NSString).doubleValue
 print("String:-",tempString)
2
ответ дан Vishal Vaghasiya 18 August 2018 в 15:38
поделиться

SWIFT 3

Чтобы очистить, в настоящее время существует метод по умолчанию:

public init?(_ text: String) класса Double.

Его можно использовать для все классы.

let c = Double("-1.0") let f = Double("0x1c.6") let i = Double("inf") и т. д.

3
ответ дан Vyacheslav 18 August 2018 в 15:38
поделиться
6
ответ дан itsji10dra 7 September 2018 в 01:08
поделиться
1
ответ дан Aitor Lucas 30 October 2018 в 05:31
поделиться
6
ответ дан itsji10dra 30 October 2018 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: