Comment faire pour formater un Double dans la Monnaie - Swift 3
Je suis nouveau sur Swift programmation et j'ai été la création d'un simple calculateur de pourboire application dans Xcode 8.2, j'ai mes calculs mis en place au sein de mon IBAction
ci-dessous. Mais quand j'exécute mon application et d'entrée d'un montant à calculer (comme 23h45), il est livré avec plus de 2 décimales. Comment puis-je formater .currency
dans ce cas?
@IBAction func calculateButtonTapped(_ sender: Any) {
var tipPercentage: Double {
if tipAmountSegmentedControl.selectedSegmentIndex == 0 {
return 0.05
} else if tipAmountSegmentedControl.selectedSegmentIndex == 1 {
return 0.10
} else {
return 0.2
}
}
let billAmount: Double? = Double(userInputTextField.text!)
if let billAmount = billAmount {
let tipAmount = billAmount * tipPercentage
let totalBillAmount = billAmount + tipAmount
tipAmountLabel.text = "Tip Amount: $\(tipAmount)"
totalBillAmountLabel.text = "Total Bill Amount: $\(totalBillAmount)"
}
}
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser cette chaîne d'initialiseur si vous voulez de la force de la devise en dollars:
Si vous voulez qu'il soit entièrement dépendante de la configuration locale de l'appareil, vous devez utiliser un
NumberFormatter
. Cela permettra de prendre en compte le nombre de décimales pour la monnaie ainsi que le positionnement du symbole de la monnaie correctement. E. g. la double valeur de 2,4 sera de retour "2,40 €" pour l'locale es_ES et "¥ 2" pour la jp_JP locale.locale
àLocale.current
puisque c'est la valeur par défaut.Comment faire dans Swift 4:
La meilleure façon de le faire est de créer un
NSNumberFormatter
. (NumberFormatter
dans Swift 3.) Vous pouvez demander de la monnaie et il va mettre en place la chaîne de suivre l'utilisateur des paramètres de localisation, ce qui est utile.Si vous voulez forcer un format AMÉRICAIN en dollars et en cents chaîne de caractères, vous pouvez le formater de cette manière:
En plus de la
NumberFormatter
ouString(format:)
discuté par d'autres, vous pouvez envisager d'utiliserDecimal
ouNSDecimalNumber
et de contrôle de l'arrondissement de vous-même, ainsi éviter virgule flottante questions. Si vous êtes en train de faire un simple calculateur de pourboire, ce n'est probablement pas nécessaire. Mais si vous faites quelque chose comme additionnant les conseils à la fin de la journée, si vous n'avez pas arrondir les nombres et/ou faire des mathématiques à l'aide de nombres décimaux, vous pouvez introduire des erreurs.Donc, aller de l'avant et de configurer votre formateur:
et ensuite, utiliser des nombres décimaux:
Où
Évidemment, vous pouvez remplacer tous les "2 décimale" références avec ce numéro est approprié pour la devise que vous utilisez (ou peut-être utiliser une variable pour le nombre de décimales).
NumberFormatter
? Pas toutes les monnaies utiliser 2 chiffres après la virgule..currency
introduit d'autres problèmes (par exemple, l'analyse des cordes devient persnickety; il suppose que vous ne voyagez pas et de traiter avec d'autres devises, etc.). Selon l'application, il est parfois plus facile de permettre à l'utilisateur de spécifier le nombre de décimales et être fait avec elle. De plus, mon point n'était pas le formatage, mais plutôt l'avocat-conseil pour éviter de calcul en virgule flottante avec des monnaies.Decimal
est beaucoup plus complexe que la simple integersinteger. Il représente les valeurs décimales à l'aide de BCD, et ne les mathématiques un chiffre décimal à un moment plutôt qu'à l'aide de mathématiques binaires et de conversion. Il prend également en charge des valeurs fractionnaires. En conséquence, il est BEAUCOUP plus lent que l'binaire à virgule flottante entier ou en mathématiques. Pour les calculs simples, la différence de vitesse n'a pas d'importance, mais si vous êtes en train de faire un grand nombre de calculs, la différence peut être très importante.Vous pouvez convertir comme ça: ce func convertir les garder pour vous maximumFractionDigits chaque fois que vous voulez faire
j'ai créer dans le Modèle de classe
puis, quand vous appelez , vous pouvez accecpt il une autre classe , comme ceci
vous pouvez créer une Extension pour en string ou Int, je voudrais montrer un exemple avec de la Ficelle
lien pour obtenir tous identificateur de paramètres régionaux
Locale.current
pour obtenir le courant de l'appareil paramètres régionaux.Pour moi Son retour 0.00!
Me semble Extenstion Parfait lorsque vous accédez au retour 0.00! Pourquoi?
localeCurrency
est déjà une chaîne de caractères. Pourquoi essayez-vous de le nourrir à travers une chaîne d'initialiseur?String(format:"%.2f", amountSaving. localeCurrency)
Voici comment:
1ère ligne: Vous obtenez les paramètres régionaux en cours
2e ligne: Vous obtenez la currencySymbol pour que locale. (le$, le £, etc)
3ème ligne: en Utilisant le format de l'initialiseur de tronquer votre Double à 2 décimales.
NumberFormatter
. Cette approche a de nombreux problèmes qui sont facilement évitées par l'utilisation deNumberFormatter
.