Avant de mettre à jour xCode 6, je n'avais aucun problème à convertir un double en chaîne mais maintenant cela me donne une erreur
var a: Double = 1.5
var b: String = String(a)
Cela me donne le message d'erreur "le double n'est pas convertible en chaîne". Y a-t-il un autre moyen de le faire?
var b = "\(a)"
Réponses:
Il ne s'agit pas de cast, il crée une chaîne à partir d'une valeur avec un format.
Avec un format différent:
Vous pouvez également omettre la
format
propriété si aucune mise en forme n'est nécessaire.la source
format:"%.1f" = 1 digit // 1.5
;format:"%.5f" = 5 digits // 1.50000
String(yourDouble)
.mettre à jour Xcode 7.1 • Swift 2.1:
Maintenant, Double est également convertible en String, vous pouvez donc simplement l'utiliser comme vous le souhaitez:
Swift 3 ou version ultérieure, nous pouvons l'étendre
LosslessStringConvertible
et le rendre génériqueXcode 11.3 • Swift 5.1 ou version ultérieure
Pour un nombre fixe de chiffres de fraction, nous pouvons étendre le
FloatingPoint
protocole:Si vous avez besoin de plus de contrôle sur votre format de nombre (chiffres de fraction minimum et maximum et mode d'arrondi), vous pouvez utiliser NumberFormatter:
la source
String(format: "%.\(digits)f", self as! CVarArg)
parString(format: "%.*f", digits, self as! CVarArg)
En plus de @Zaph answer, vous pouvez créer
extension:
Usage:
la source
a.toString()
est vue par un autre développeur, il y aura certainement un moment WTF.myToString()
pour être sûr que sa définition personnalisée. Mais comme dans d'autres langages, le prototypage permet d'éviter la duplication de code et une bonne maintenance.println("output: \(a.toString())")
etprintln("output: \(a)")
. La deuxième option ne provoque pas d'erreurs de compilation. Cette option est-elle une mauvaise pratique?yourDouble?.toString() ?? ""
Swift 3+: essayez ces lignes de code
la source
pour faire quoi que ce soit une chaîne en swift sauf peut-être les valeurs enum faites simplement ce que vous faites dans la méthode println ()
par exemple:
la source
Swift 4 : utilisez le code suivant
la source
Cette fonction vous permettra de spécifier le nombre de décimales à afficher:
Usage:
la source
String(format:"%."+numberOfDecimalPlaces.description+"f", number)
parString(format:"%.*f", numberOfDecimalPlaces, number)
Il y a de nombreuses réponses ici qui suggèrent une variété de techniques. Mais lorsque vous présentez des nombres dans l'interface utilisateur, vous souhaitez invariablement utiliser a
NumberFormatter
pour que les résultats soient correctement formatés, arrondis et localisés:Si vous voulez un nombre fixe de décimales, par exemple pour les valeurs monétaires
Mais la beauté de cette approche, c'est qu'elle sera correctement localisée, aboutissant
10,000.50
aux États-Unis mais10.000,50
en Allemagne. Différents paramètres régionaux ont différents formats préférés pour les nombres, et nous devrions laisserNumberFormatter
utiliser le format préféré par l'utilisateur final lors de la présentation de valeurs numériques dans l'interface utilisateur.Il va sans dire que bien que ce
NumberFormatter
soit essentiel lors de la préparation de représentations sous forme de chaîne dans l'interface utilisateur, il ne doit pas être utilisé si vous écrivez des valeurs numériques sous forme de chaînes pour un stockage persistant, une interface avec des services Web, etc.la source
Dans Swift 3:
la source
Dans swift 3, c'est simple comme indiqué ci-dessous
la source
"Optional(6.1696108999999995)"
pour moi.Cela fonctionne pour moi. Vous pouvez avoir un essai
la source
Dans Swift 4, si vous souhaitez modifier et utiliser un Double dans l'interface utilisateur en tant que textLabel "String", vous pouvez l'ajouter à la fin de votre fichier:
}
Et utilisez-le comme ceci si vous aimez l'avoir dans un texte:
Ou imprimez-le comme un Int:
la source
Je préférerais l'approche NSNumber et NumberFormatter (le cas échéant), vous pouvez également utiliser l'extension pour éviter le code de ballonnement
U peut également avoir besoin d'une approche inversée
la source
LossLessStringConvertible
protocole d'extension plus générique au lieu d'étendre Doubleextension LosslessStringConvertible { var string: String { return .init(self) } }
Swift 5 : utilisez le code suivant
la source
String(format: "%.\(points)f", self)
parString(format: "%.*f", points, self)