Je travaille avec un service qui renvoie des valeurs de type String
qui contient des virgules flottantes comme Double
comme par exemple "1240.86". Je veux le transformer en Int
et quand j'essaye de convertir comme Int(stringObject)
la distribution échoue quand les valeurs ont des points flottants. Comment puis-je le diffuser? Merci!Convertir des valeurs de chaîne du serveur formaté en tant que double
Répondre
Essayez en deux étapes:
if let aDouble = Double(someString) {
let someInt = Int(aDouble)
}
ou peut-être:
let someInt = Int(Double(someString) ?? 0)
si ce dernier est un peu bidouille puisque vous ne voulez probablement pas forcer une valeur de 0
si la chaîne n'est pas un nombre valide.
Oui, je ne voudrais pas aller avec ce dernier parce qu'il est impossible de distinguer une chaîne ' "0" 'd'un nombre invalide. – JeremyP
J'ajouterais aussi 'let someInt = Int (round (aDouble))' comme option –
@VasiliiMuravev Si le 'Double' devrait être arrondi ou non est une décision distincte et pas vraiment importante pour la question. – rmaddy
vous pouvez utiliser la méthode map(_:)
de Optional
pour éventuellement la chaîne une conversion (initialisation par, en particulier) String
-Double
suivie d'une Double
-Int
et lier conditionnellement l'entier résultant dans le cas où il est nil
(ie succès converti):
let str = "1240.86"
if let number = Double(str).map(Int.init) {
// number is of type Int and, in this example, of value 1240
}
@down elector: considérez donner votre avis plutôt que de vous laisser abattre. Ou est-ce juste un vote de colère vers le bas ...? – dfri
Je ne connaissais pas la fonction 'Optional map'. J'aime ça. – rmaddy
@rmaddy la plupart du temps, ses cas d'utilisation peuvent être remplacés simplement par un chaînage optionnel, mais pour des cas comme celui-ci, cela peut être une bonne approche. Notez également qu'il existe une méthode 'flatMap (_ :)' de 'Optional' qui peut aussi parfois être utile (passe le seul argument en option sans le déballer). – dfri
Vous pouvez séparer la chaîne par point .
:
func printInt(from str: String) {
let intValue = Int(str.components(separatedBy: ".")[0]) ?? 0
print(intValue)
}
printInt(from: "1234.56") // 1234
printInt(from: "1234") // 1234
printInt(from: "0.54") // 0
printInt(from: ".54") // 0
printInt(from: "abc") // 0
jus t une note, ce n'est pas le moulage mais la conversion. As-tu essayé * de convertir * la corde en double et de partir de là? – luk2302
Cest ma solution maintenant, mais je cherchais façon plus élégante –
Essayez ici: https://stackoverflow.com/a/39658447/6479530 –