2017-07-17 3 views
0

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

+2

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

+0

Cest ma solution maintenant, mais je cherchais façon plus élégante –

+0

Essayez ici: https://stackoverflow.com/a/39658447/6479530 –

Répondre

3

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.

+0

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

+0

J'ajouterais aussi 'let someInt = Int (round (aDouble))' comme option –

+0

@VasiliiMuravev Si le 'Double' devrait être arrondi ou non est une décision distincte et pas vraiment importante pour la question. – rmaddy

2

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

@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

+0

Je ne connaissais pas la fonction 'Optional map'. J'aime ça. – rmaddy

+0

@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

0

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