Estoy tratando de escribir un programa de IMC en lenguaje rápido. Y tengo este problema: ¿cómo convertir una cadena en un doble?
En Objective-C, puedo hacer así:
double myDouble = [myString doubleValue];
Pero, ¿cómo puedo lograr esto en lenguaje Swift?
Respuestas:
Swift 4.2+ String to Double
Debería usar los nuevos inicializadores de tipo para convertir entre String y tipos numéricos (Double, Float, Int). Devolverá un tipo Opcional (¿Doble?) Que tendrá el valor correcto o nulo si la Cadena no era un número.
Nota: La propiedad NSString doubleValue no se recomienda porque devuelve 0 si el valor no se puede convertir (es decir: entrada incorrecta del usuario).
Desenvuelva los valores para usarlos usando if / let
Puede convertir números y monedas con formato utilizando la
NumberFormatter
clase.Formatos de moneda
Lea más en mi publicación de blog sobre cómo convertir String a tipos dobles (y moneda) .
fuente
Swift 2 Actualización Hay nuevas inicializadores failable que le permiten hacer esto de una manera más idiomática y seguros (como han dicho en muchas respuestas, el valor doble de NSString no es muy seguro, ya que devuelve 0 para valores no numéricos. Esto significa que el
doubleValue
de"foo"
y"0"
están lo mismo.)Esto devuelve un opcional, por lo que en casos como pasar
"foo"
dondedoubleValue
habría devuelto 0, volverá el intializer fallablenil
. Puede utilizar unaguard
,if-let
omap
para manejar laOptional<Double>
Publicación original: no necesita usar el constructor NSString como propone la respuesta aceptada. Simplemente puede puentearlo así:
fuente
- [NSString doubleValue]
estáDouble
en rápido como se aplicó aDouble?
(Optional<Double>
). Esto es diferente de la función Swift StringtoInt()
que devuelveInt?
y dice en los documentos que "... acepta cadenas que coinciden con la expresión regular" [- +]? [0-9] + "solamente"..toInt()
sería mejor. Sin embargo, esto fue más una respuesta a cómo hacer exactamente lo mismo, pero en Swift.Double.init?(_ text: String)
un inicializador disponible ahora disponible.Para un poco más de sensación de rapidez, el uso
NSFormatter()
evita la conversión aNSString
, y regresanil
cuando la cadena no contiene unDouble
valor (por ejemplo, "prueba" no volverá0.0
).Alternativamente, extendiendo el
String
tipo de Swift :y úsalo como
toInt()
:Esto devuelve un opcional
Double?
que debe desenvolverse.Ya sea con desenvoltura forzada:
o con una declaración if let:
Actualización: para la localización, es muy fácil aplicar configuraciones regionales a NSFormatter de la siguiente manera:
Finalmente, puede usar
NSNumberFormatterCurrencyStyle
el formateador si está trabajando con monedas donde la cadena contiene el símbolo de moneda.fuente
Otra opción aquí es convertir esto a an
NSString
y usar eso:fuente
(swiftString as NSString).doubleValue
Aquí hay un método de extensión que le permite simplemente llamar a doubleValue () en una cadena Swift y obtener una doble vuelta (la salida de ejemplo es lo primero)
Aquí está el método de extensión:
No hay comprobación de errores, pero puede agregarlo si lo necesita.
fuente
A partir de Swift 1.1, puede pasar directamente
String
alconst char *
parámetro.Si no te gusta obsoleto
atof
:Una advertencia: el comportamiento de la conversión es diferente de
NSString.doubleValue
.atof
ystrtod
aceptar0x
cadena hexadecimal prefijada:Si prefiere el
.doubleValue
comportamiento, aún podemos usar elCFString
puente:fuente
NSString
.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 un doble", sino que debe "inicializar un doble de una cadena". Documento de Apple por aquí: https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_Double_Structure/index.html#//apple_ref/swift/structctr/Double/s:FSdcFMSdFSSGSqSd_
Es un init opcional, por lo que puede usar el operador de fusión nula (??) para establecer un valor predeterminado. Ejemplo:
fuente
Double.init?(_ text: String)
estar disponible en Swift 2.0. Deberías mencionar esto. Otras respuestas aquí no es porque la gente piense como los desarrolladores de Objective-C sino porque este inicializador no estaba disponible antes.En SWIFT 3 , puede usar:
Nota: - Si una cadena contiene caracteres que no sean dígitos numéricos o separadores decimales o de grupo apropiados para la localidad, el análisis fallará. - Se ignoran los caracteres separadores de espacio 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
fuente
No he visto la respuesta que estaba buscando. Acabo de publicar aquí el mío en caso de que pueda ayudar a alguien. Esta respuesta es válida solo si no necesita un formato específico .
Swift 3
fuente
Prueba esto:
NOTA
Eliminado en Beta 5. ¿Esto ya no funciona?
fuente
Esto se basa en la respuesta de @Ryu
Su solución es excelente siempre que esté en un país donde los puntos se usan 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 utiliza una coma como separador predeterminado (incluido 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, usar puntos como separadores reemplaza la líneacon
Por lo tanto, el código completo se convierte
Para usar esto, solo llame
"Your text goes here".toDouble()
Esto devolverá un opcional
Double?
Como @Ryu mencionó, puedes forzar el desenvolvimiento:
o use una
if let
declaración:fuente
NumberFormatter().number(from: myString)?.doubleValue
SWIFT 4
fuente
Swift 4.0
prueba esto
fuente
Swift: 4 y 5
Posiblemente hay dos formas de hacer esto:
Cadena -> Int -> Doble:
Cadena -> NSString -> Doble
Úselo de la manera que desee según la necesidad del código.
fuente
Por favor, compruébalo en el patio de recreo!
Por cierto en mi Xcode
.toDouble () - no existe
.doubleValue crea el valor 0.0 a partir de cadenas no numéricas ...
fuente
1)
2)
Puede ser esta ayuda para ti.
fuente
Como ya se señaló, la mejor manera de lograr esto es con el casting directo:
A partir de eso, puede hacer una elegante extensión nativa de Swift String:
Esto le permite usar directamente:
Que realizará el casting por ti. Si Apple agrega un
doubleValue
a la cadena nativa, solo necesita eliminar la extensión y el resto de su código se compilará automáticamente.fuente
SWIFT 3
Para borrar, hoy en día hay un método predeterminado:
public init?(_ text: String)
deDouble
clase.Se puede usar para todas las clases.
let c = Double("-1.0")
let f = Double("0x1c.6")
let i = Double("inf")
etc.fuente
Extensión con configuración regional opcional
Swift 2.2
Swift 3.1
fuente
O podrías hacer:
fuente
Puedes usar StringEx . Se extiende
String
con conversiones de cadena a número incluidastoDouble()
.Verifica la cadena y falla si no se puede convertir al doble.
Ejemplo:
fuente
Swift 4
fuente
Lo que también funciona:
fuente
Use este código en Swift 2.0
let strWithFloat = "78.65" let floatFromString = Double(strWithFloat)
fuente
Usar
Scanner
en algunos casos es una forma muy conveniente de extraer números de una cadena. Y es casi tan poderoso comoNumberFormatter
cuando se trata de decodificar y manejar diferentes formatos de números y configuraciones regionales. Puede extraer números y monedas con diferentes separadores decimales y de grupo.Sin embargo, hay problemas con los separadores que podrían concebirse como delimitadores de palabras.
No hay problema para detectar automáticamente la configuración regional. Tenga en cuenta que el separador de agrupación en francés en la cadena "Mon salaire est 9 999,99 €" no es un espacio, aunque puede representar exactamente como espacio (aquí no lo hace). Es por eso que el siguiente código funciona bien sin
!$0.isWhitespace
que se filtren los caracteres.fuente
Encuentro más legible agregar una extensión a String de la siguiente manera:
y luego podrías escribir tu código:
fuente
mi problema era una coma, así que lo resuelvo de esta manera:
fuente
fuente
podemos usar el valor CDouble que será obtenido por myString.doubleValue
fuente