J'essaie d'écrire un programme IMC en langage rapide. Et j'ai ce problème: comment convertir une chaîne en double?
Dans Objective-C, je peux faire comme ceci:
double myDouble = [myString doubleValue];
Mais comment puis-je y parvenir en langage Swift?
Réponses:
Swift 4.2+ String to Double
Vous devez utiliser les nouveaux initialiseurs de type pour convertir entre les types String et numériques (Double, Float, Int). Il renverra un type facultatif (Double?) Qui aura la valeur correcte ou nil si la chaîne n'était pas un nombre.
Remarque: La propriété NSString doubleValue n'est pas recommandée car elle renvoie 0 si la valeur ne peut pas être convertie (c'est-à-dire: mauvaise entrée utilisateur).
Déballez les valeurs pour les utiliser en utilisant if / let
Vous pouvez convertir des nombres et des devises formatés à l'aide de la
NumberFormatter
classe.Formats monétaires
En savoir plus sur mon article de blog sur la conversion des types String en Double (et en devise) .
la source
Mise à jour Swift 2 Il existe de nouveaux initialiseurs disponibles qui vous permettent de le faire de manière plus idiomatique et sûre (comme de nombreuses réponses l'ont noté, la valeur double de NSString n'est pas très sûre car elle renvoie 0 pour les valeurs non numériques. Cela signifie que les valeurs
doubleValue
de"foo"
et"0"
sont le même.)Cela retourne une option, donc dans des cas comme en passant
"foo"
oùdoubleValue
aurait retourné 0, l'intialiseur disponible sera de retournil
. Vous pouvez utiliser unguard
,if-let
oumap
pour gérer laOptional<Double>
Message d'origine: vous n'avez pas besoin d'utiliser le constructeur NSString comme le propose la réponse acceptée. Vous pouvez simplement le combler comme ceci:
la source
- [NSString doubleValue]
estDouble
en rapide comme apposé surDouble?
(Optional<Double>
). Ceci est différent de la fonction Swift StringtoInt()
qui retourneInt?
et indique dans les documents qu'elle "... accepte les chaînes qui correspondent à l'expression régulière" [- +]? [0-9] + "uniquement.".toInt()
serait mieux. Cependant, c'était plus une réponse à la façon de faire exactement la même chose, mais dans Swift.Double.init?(_ text: String)
un initialiseur disponible est désormais disponible.Pour un peu plus de sensation Swift, l'utilisation
NSFormatter()
évite le transtypage enNSString
et retournenil
lorsque la chaîne ne contient pas deDouble
valeur (par exemple, "test" ne reviendra pas0.0
).Alternativement, étendre le
String
type de Swift :et l'utiliser comme
toInt()
:Cela renvoie une option
Double?
qui doit être déballée.Soit avec déballage forcé:
ou avec une instruction if let:
Mise à jour: pour la localisation, il est très facile d'appliquer des paramètres régionaux à NSFormatter comme suit:
Enfin, vous pouvez utiliser
NSNumberFormatterCurrencyStyle
sur le formateur si vous travaillez avec des devises où la chaîne contient le symbole monétaire.la source
Une autre option ici consiste à convertir ceci en un
NSString
et à l'utiliser:la source
(swiftString as NSString).doubleValue
Voici une méthode d'extension qui vous permet d'appeler simplement doubleValue () sur une chaîne Swift et d'obtenir un double retour (l'exemple de sortie vient en premier)
Voici la méthode d'extension:
Aucune vérification d'erreur, mais vous pouvez l'ajouter si vous en avez besoin.
la source
Depuis Swift 1.1, vous pouvez directement passer
String
auconst char *
paramètre.Si vous n'aimez pas obsolète
atof
:Une mise en garde: le comportement de conversion est différent de
NSString.doubleValue
.atof
etstrtod
accepter la0x
chaîne hexadécimale préfixée:Si vous préférez le
.doubleValue
comportement, nous pouvons toujours utiliser leCFString
pontage:la source
NSString
.Dans Swift 2.0, le meilleur moyen est d'éviter de penser comme un développeur Objective-C. Vous ne devez donc pas «convertir une chaîne en double» mais vous devez «initialiser un double à partir d'une chaîne». Doc Apple ici: https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_Double_Structure/index.html#//apple_ref/swift/structctr/Double/s:FSdcFMSdFSSGSqSd_
Il s'agit d'un init facultatif, vous pouvez donc utiliser l'opérateur de coalescence nul (??) pour définir une valeur par défaut. Exemple:
la source
Double.init?(_ text: String)
devenir disponible dans Swift 2.0. Vous devez le mentionner. Les autres réponses ne sont pas ici parce que les gens pensent comme les développeurs Objective-C mais parce que cet initialiseur n'était pas disponible plus tôt.Sur SWIFT 3 , vous pouvez utiliser:
Remarque: - Si une chaîne contient des caractères autres que des chiffres ou un groupe approprié aux paramètres régionaux ou des séparateurs décimaux, l'analyse échouera. - Tous les caractères de séparateur d'espace avant ou arrière dans une chaîne sont ignorés. Par exemple, les chaînes «5», «5» et «5» produisent toutes le nombre 5.
Tiré de la documentation: https://developer.apple.com/reference/foundation/numberformatter/1408845-number
la source
Je n'ai pas vu la réponse que je cherchais. Je viens de poster ici le mien au cas où cela pourrait aider quelqu'un. Cette réponse n'est valable que si vous n'avez pas besoin d'un format spécifique .
Swift 3
la source
Essaye ça:
REMARQUE
Supprimé dans la version bêta 5. Cela ne fonctionne plus?
la source
Ceci s'appuie sur la réponse de @Ryu
Sa solution est excellente tant que vous êtes dans un pays où les points sont utilisés comme séparateurs. Par défaut,
NSNumberFormatter
utilise les paramètres régionaux des périphériques. Par conséquent, cela échouera dans tous les pays où une virgule est utilisée comme séparateur par défaut (y compris la France comme @PeterK. Mentionné) si le nombre utilise des points comme séparateurs (ce qui est normalement le cas). Pour définir les paramètres régionaux de ce NSNumberFormatter sur US et donc utiliser des points comme séparateurs, remplacez la ligneavec
Par conséquent, le code complet devient
Pour l'utiliser, appelez simplement
"Your text goes here".toDouble()
Cela retournera une option
Double?
Comme @Ryu l'a mentionné, vous pouvez soit forcer le déballage:
ou utilisez une
if let
déclaration:la source
NumberFormatter().number(from: myString)?.doubleValue
SWIFT 4
la source
Swift 4.0
essaye ça
la source
Swift: 4 et 5
Il existe peut-être deux façons de procéder:
Chaîne -> Int -> Double:
Chaîne -> NSString -> Double
Utilisez-le comme bon vous semble en fonction de vos besoins en code.
la source
Veuillez le vérifier sur le terrain de jeu!
Au fait dans mon Xcode
.toDouble () - n'existe pas
.doubleValue crée une valeur 0.0 à partir de chaînes non numériques ...
la source
1.
2.
Peut-être cette aide pour vous.
la source
Comme déjà souligné, la meilleure façon d'y parvenir est de lancer directement:
À partir de cela, vous pouvez créer une extension Swift String native élégante:
Cela vous permet d'utiliser directement:
Qui effectuera le casting pour vous. Si Apple ajoute un
doubleValue
à la chaîne native, il vous suffit de supprimer l'extension et le reste de votre code se compilera automatiquement très bien!la source
SWIFT 3
Pour effacer, il existe aujourd'hui une méthode par défaut:
public init?(_ text: String)
deDouble
classe.Il peut être utilisé pour toutes les classes.
let c = Double("-1.0")
let f = Double("0x1c.6")
let i = Double("inf")
, etc.la source
Extension avec paramètres régionaux facultatifs
Swift 2.2
Swift 3.1
la source
Ou vous pourriez faire:
la source
Vous pouvez utiliser StringEx . Il s'étend
String
avec des conversions de chaîne en nombre, y compristoDouble()
.Il vérifie la chaîne et échoue si elle ne peut pas être convertie en double.
Exemple:
la source
Swift 4
la source
Ce qui fonctionne aussi:
la source
Utilisez ce code dans Swift 2.0
let strWithFloat = "78.65" let floatFromString = Double(strWithFloat)
la source
L'utilisation
Scanner
dans certains cas est un moyen très pratique d'extraire des nombres d'une chaîne. Et il est presque aussi puissant queNumberFormatter
lorsqu'il s'agit de décoder et de gérer différents formats de nombres et paramètres régionaux. Il peut extraire des nombres et des devises avec différents séparateurs décimaux et de groupe.Cependant, il existe des problèmes avec les séparateurs qui pourraient être conçus comme des délimiteurs de mots.
Il n'y a aucun problème pour détecter automatiquement les paramètres régionaux. Notez que groupingSeparator dans les paramètres régionaux français dans la chaîne "Mon salaire est 9 999,99 €" n'est pas un espace, bien qu'il puisse s'afficher exactement comme un espace (ici ce n'est pas le cas). C'est pourquoi le code ci-dessous fonctionne
!$0.isWhitespace
correctement sans filtrer les caractères.la source
Je trouve plus lisible pour ajouter une extension à String comme suit:
et alors vous pourriez juste écrire votre code:
la source
mon problème était une virgule donc je le résous de cette façon:
la source
la source
nous pouvons utiliser la valeur CDouble qui sera obtenue par myString.doubleValue
la source