2017-10-16 18 views
0

Le problème est ma réponse API retourne commandes [indexPath.row]. Prix en tant que chaîne. La chaîne est en réalité une double valeur comme 3.55973455234. J'ai besoin de convertir cette valeur à quelque chose comme 3.56 et afficher dans l'étiquette de l'interface utilisateur. Je me suis tiré les cheveux depuis le matin pour y arriver. Pourquoi Swift est-il si horrible aux conversions?Convertir chaîne en double, puis de nouveau en chaîne

 cell.lblPayValue.text = orders[indexPath.row].price 
+0

[Cochez cette réponse] (https://stackoverflow.com/q/41558832/335858), il peut avoir une bonne explication pour vous. – dasblinkenlight

Répondre

1

Vous pouvez également utiliser NumberFormatter mais vous devrez reconvertir en un NSNumber ...

let formatter = NumberFormatter() 
formatter.numberStyle = .decimal 
formatter.maximumFractionDigits = 2 
formatter.locale = Locale(identifier: "en_US") 

if let number = formatter.number(from: orders[indexPath.row].price) { 
    cell.lblPayValue.text = formatter.string(from: number) 
} 

Mais s'il vous plaît ne pas créer de N NumberFormatter. Créez-en un et enregistrez-le quelque part.

+0

Hé Il ne semble pas être en train de frapper l'instruction if pouvons-nous faire quelque chose pour que ça passe toujours dans le bloc if? – Ackman

+0

Cela peut poser un problème avec le séparateur décimal. Lors de l'analyse, les paramètres régionaux doivent toujours être définis correctement. – Sulthan

+0

Votre numéro est peut-être mis en forme d'une manière différente de celle supposée par les paramètres régionaux (car NumberFormatter est spécifique à l'environnement local). Essayez avec le code mis à jour. De toute façon, essayez de ne pas utiliser cette solution car vous créerez * peut-être * des ressources inutiles. Mais NumberFormatter offre encore quelques avantages. – McNight

1

suffit de le faire comme ceci:

let formatter = NumberFormatter() 
formatter.numberStyle = .currency 

if let price = Double(orders[indexPath.row].price), let formattedPrice = formatter.string(for: price) { 
    cell.lblPayValue.text = formattedPrice 
} 
  1. Ainsi, vous obtenez la valeur double d'abord avec le si-let
  2. Ensuite, vous l'utilisez pour définir votre cell.lblPayValue.text
  3. Vous utilisez le formateur pour obtenir un format monétaire sur votre Double
+0

Non. Ne définit aucune valeur. – Ackman

+0

Etes-vous sûr que 'orders [indexPath.row] .price' a un double valide? Vérifiez la réponse mise à jour btw avec 'NumberFormatter –

+0

Pas besoin de convertir en' NSNumber' plus. L'OP a déclaré que 'price' est une chaîne de caractères. – Sulthan

1

Les conversions sont assez simples à mon humble avis. Vous pouvez créer un nouveau double en utilisant l'initialiseur avec une chaîne. Ensuite, vous avez un double optionnel. Cela peut ensuite être converti en une chaîne formatée. Donc ...

let price: String = "3.55973455234" // your price 
    let text = String(format: "%.2f", Double(price)!) 
    print(text) // prints 3.56