suzuki sport precio boosterjet swift

sport - Swift-Cómo convertir cadena a doble



swift sport (28)

Estoy tratando de escribir un programa de IMC en lenguaje rápido. Y tengo este problema: ¿cómo convertir una cadena en una doble?

En Objective-C, puedo hacer esto:

double myDouble = [myString doubleValue];

Pero, ¿cómo puedo lograr esto en el lenguaje Swift?


Swift 4.0

prueba esto

let str:String = "111.11" let tempString = (str as NSString).doubleValue print("String:-",tempString)


1.

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

2.

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

Puede ser esta ayuda para usted.


A partir de Swift 1.1, puede pasar directamente el parámetro String a const char * .

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

Si no te gusta en desuso:

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

Una advertencia: el comportamiento de conversión es diferente de NSString.doubleValue .

atof y strtod aceptan cadena hexadecimal prefijada 0x :

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

Si prefiere el comportamiento .doubleValue , todavía podemos usar el puente CFString :

let str = "0xff" atof(str) // -> 255.0 strtod(str, nil) // -> 255.0 CFStringGetDoubleValue(str) // -> 0.0 (str as NSString).doubleValue // -> 0.0


Aquí hay un método de extensión que le permite simplemente llamar a doubleValue () en una cadena Swift y obtener un respaldo doble (la salida del ejemplo viene primero)

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

Aquí está el método de extensión:

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 } }

No hay comprobación de errores, pero puede agregarlo si lo necesita.


Como ya se señaló, la mejor manera de lograrlo es con el casting directo:

(myString as NSString).doubleValue

A partir de eso, puedes hacer una extensión Swift String nativa:

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

Esto le permite utilizar directamente:

myString.doubleValue

Que realizará el casting por ti. Si Apple agrega un valor doubleValue a la cadena nativa, solo debes eliminar la extensión y el resto de tu código se compilará automáticamente.


En SWIFT 3 , puede utilizar:

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

Nota: - Si una cadena contiene caracteres que no sean dígitos numéricos o separadores decimales o de grupo apropiados para la ubicación, el análisis fallará. - Se ignoran todos los caracteres separadores de espacios iniciales o finales de una cadena. Por ejemplo, las cadenas “5”, “5” y “5” producen el número 5.

Tomado de la documentación: https://developer.apple.com/reference/foundation/numberformatter/1408845-number


En Swift 2.0, la mejor manera es evitar pensar como un desarrollador de Objective-C. Por lo tanto, no debe "convertir una cadena en una doble", sino que debe "inicializar una doble desde una cadena". Apple doc aquí: https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_Double_Structure/index.html#//apple_ref/swift/structctr/Double/s:FSdcFMSdFSSGSqSd_

Es un inicio opcional, por lo que puede usar el operador de unión nula (??) para establecer un valor predeterminado. Ejemplo:

let myDouble = Double("1.1") ?? 0.0


Esto se basa en la respuesta por @Ryu

Su solución es excelente siempre que se encuentre en un país donde se utilicen puntos como separadores. Por defecto, NSNumberFormatter usa la configuración regional de los dispositivos. Por lo tanto, esto fallará en todos los países donde se usa una coma como separador predeterminado (incluida Francia como @PeterK. Mencionado) si el número usa puntos como separadores (que normalmente es el caso). Para establecer la configuración regional de este NSNumberFormatter en EE. UU. Y, por lo tanto, utilizar puntos como separadores para reemplazar la línea

return NSNumberFormatter().numberFromString(self)?.doubleValue

con

let numberFormatter = NSNumberFormatter() numberFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") return numberFormatter.numberFromString(self)?.doubleValue

Por lo tanto, el código completo se convierte en

extension String { func toDouble() -> Double? { let numberFormatter = NSNumberFormatter() numberFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") return numberFormatter.numberFromString(self)?.doubleValue } }

Para usar esto, simplemente llama "Your text goes here".toDouble()

Esto devolverá un Double? opcional Double?

Como mencionó @Ryu, puedes forzar el desenvolvimiento:

println("The value is /(myDouble!)") // prints: The value is 4.2

o use una sentencia if let :

if let myDouble = myDouble { println("The value is /(myDouble)") // prints: The value is 4.2 }


Extensión con locale opcional

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 } } }


Lo que también funciona:

// 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.


Me parece más legible agregar una extensión a String de la siguiente manera:

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

y luego solo podrías escribir tu código:

myDouble = myString.doubleValue


Mi problema era una coma, así que lo resuelvo de esta manera:

extension String { var doubleValue: Double { return Double((self.replacingOccurrences(of: ",", with: ".") as NSString).doubleValue) } }


No he visto la respuesta que estaba buscando. Acabo de publicar aquí la mía en caso de que pueda ayudar a alguien. Esta respuesta es válida solo si no necesita un formato específico.

Swift 3

extension String { var toDouble: Double { return Double(self) ?? 0.0 } }


O podrías hacer:

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


Otra opción aquí es convertir esto en un NSString y usarlo:

let string = NSString(string: mySwiftString) string.doubleValue


Para una sensación un poco más rápida, el uso de NSFormatter() evita la conversión a NSString , y devuelve nil cuando la cadena no contiene un valor Double (por ejemplo, "prueba" no devolverá 0.0 ).

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

Alternativamente, extendiendo el tipo de String de Swift:

extension String { func toDouble() -> Double? { return NSNumberFormatter().numberFromString(self)?.doubleValue } }

y usarlo como toInt() :

var myString = "4.2" var myDouble = myString.toDouble()

Esto devuelve un Double? opcional Double? Lo cual tiene que ser desenvuelto.

Ya sea con desenvolvimiento forzado:

println("The value is /(myDouble!)") // prints: The value is 4.2

o con una sentencia if let:

if let myDouble = myDouble { println("The value is /(myDouble)") // prints: The value is 4.2 }

Actualización: para la localización, es muy fácil aplicar configuraciones regionales a NSFormatter de la siguiente manera:

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

Finalmente, puede usar NSNumberFormatterCurrencyStyle en el formateador si está trabajando con monedas donde la cadena contiene el símbolo de moneda.


Por favor, compruebe en el patio de recreo!

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

Por cierto en mi Xcode

.toDouble () - no existe

.doubleValue crea valor 0.0 desde cadenas no numéricas ...


Prueba esto:

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

NOTA

Eliminado en Beta 5. ¿Esto ya no funciona?


Puedes usar StringEx . Extiende la String con conversiones de cadena a número, incluyendo toDouble() .

extension String { func toDouble() -> Double? }

Verifica la cadena y falla si no se puede convertir a doble.

Ejemplo:

import StringEx let str = "123.45678" if let num = str.toDouble() { println("Number: /(num)") } else { println("Invalid string") }


Usa este código en Swift 2.0

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


podemos usar el valor CDouble que será obtenido por myString.doubleValue


Actualización de Swift 2 Hay nuevos inicializadores disponibles que le permiten hacer esto de una manera más idiomática y segura (como lo han indicado muchas respuestas, el valor doble de NSString no es muy seguro porque devuelve 0 para valores no numéricos. Esto significa que el valor doubleValue de "foo" y "0" son iguales.)

let myDouble = Double(myString)

Esto devuelve un opcional, por lo que en casos como pasar "foo" donde doubleValue hubiera devuelto 0, el intializador disponible devolverá nil . Puede usar una guard , if-let o map para manejar el Optional<Double>

Publicación original: no es necesario utilizar el constructor NSString como lo sugiere la respuesta aceptada. Simplemente puedes puentearlo así:

(swiftString as NSString).doubleValue


SWIFT 3

Para borrar, hoy en día hay un método por defecto:

public init?(_ text: String) de la clase Double .

Puede ser utilizado para todas las clases.

let c = Double("-1.0") let f = Double("0x1c.6") let i = Double("inf") , etc.


SWIFT 4

extension String { func toDouble() -> Double? { let numberFormatter = NumberFormatter() numberFormatter.locale = Locale(identifier: "en_US_POSIX") return numberFormatter.number(from: self)?.doubleValue } }


Swift 4.2+ String to Double

Debe usar los inicializadores de tipo nuevo para convertir entre tipos de cadena y numéricos (Doble, Flotante, Int). Devolverá un tipo Opcional (¿Doble?) Que tendrá el valor correcto o nulo si la Cadena no fuera un número.

Nota: la propiedad doubleSvaling de NSString no se recomienda porque devuelve 0 si el valor no se puede convertir (es decir, entrada incorrecta del usuario).

let lessPrecisePI = Float("3.14") let morePrecisePI = Double("3.1415926536") let invalidNumber = Float("alphabet") // nil, not a valid number

Desenvuelve los valores para usarlos usando 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!)") }

Puede convertir números y monedas con formato utilizando la clase NumberFormatter .

let formatter = NumberFormatter() formatter.locale = Locale.current // USA: Locale(identifier: "en_US") formatter.numberStyle = .decimal let number = formatter.number(from: "9,999.99")

Formatos de moneda

let usLocale = Locale(identifier: "en_US") let frenchLocale = Locale(identifier: "fr_FR") let germanLocale = Locale(identifier: "de_DE") let englishUKLocale = Locale(identifier: "en_GB") // United Kingdom formatter.numberStyle = .currency formatter.locale = usLocale let usCurrency = formatter.number(from: "$9,999.99") formatter.locale = frenchLocale let frenchCurrency = formatter.number(from: "9999,99€") // Note: "9 999,99€" fails with grouping separator // Note: "9999,99 €" fails with a space before the € formatter.locale = germanLocale let germanCurrency = formatter.number(from: "9999,99€") // Note: "9.999,99€" fails with grouping separator formatter.locale = englishUKLocale let englishUKCurrency = formatter.number(from: "£9,999.99")

Lea más en la publicación de mi blog sobre cómo convertir Cadena en tipos Dobles (y moneda) .


Swift 4

extension String { func toDouble() -> Double { let nsString = self as NSString return nsString.doubleValue } }


Swift: - 4

Posiblemente hay dos formas de hacer esto:

  1. Cadena -> Int -> Doble:

    let strNumber = "314" let intFromString = Int(strNumber) let dobleFromInt = Double(intFromString!) print(dobleFromInt)

  2. Cadena -> Cadena NS -> Doble

    let strNumber = "314" let NSstringFromString = NSString(string: strNumber as! NSString) let doubleFromNSString = NSstringFromString.doubleValue print(doubleFromNSString)

Úsalo como quieras según el código que necesites.


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