68 votes

Comment formater un double en devise - Swift 3

Je suis un nouveau venu dans la programmation Swift et je crée une application simple de calculateur de pourboires dans Xcode 8.2. Mes calculs sont configurés dans les IBAction ci-dessous. Mais lorsque je lance mon application et que je saisis un montant à calculer (par exemple, 23,45), il apparaît avec plus de 2 décimales. Comment puis-je le 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)"
    }
}
 

135voto

silicon_valley Points 1429

Vous pouvez utiliser cette chaîne d'initialiseur si vous voulez de la force de la devise en dollars:

String(format: "Tip Amount: $%.02f", tipAmount)

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.

let formatter = NumberFormatter()
formatter.locale = Locale.current // Change this to another locale if you want to force a specific locale, otherwise this is redundant as the current locale is the default already
formatter.numberStyle = .currency
if let formattedTipAmount = formatter.string(from: tipAmount as NSNumber) {
    tipAmountLabel.text = "Tip Amount: \(formattedTipAmount)"
}

38voto

Camilo Ortegón Points 817

Comment le faire dans Swift 4:

 let myDouble = 9999.99
let currencyFormatter = NumberFormatter()
currencyFormatter.usesGroupingSeparator = true
currencyFormatter.numberStyle = .currency
// localize to your grouping and decimal separator
currencyFormatter.locale = Locale.current

// We'll force unwrap with the !, if you've got defined data you may need more error checking

let priceString = currencyFormatter.string(from: NSNumber(value: myDouble))!
print(priceString) // Displays $9,999.99 in the US locale
 

13voto

Duncan C Points 18661

La meilleure façon de faire est de créer un NSNumberFormatter . ( NumberFormatter dans Swift 3.) Vous pouvez demander une devise et la chaîne sera configurée pour suivre les paramètres de localisation de l'utilisateur, ce qui est utile.

Si vous voulez forcer une chaîne en dollars et en cents au format américain, vous pouvez la formater de la manière suivante:

 let amount: Double = 123.45

let amountString = String(format: "$%.02f", amount)
 

12voto

king_T Points 161

vous pouvez créer une extension pour string ou Int, je montrerais un exemple avec String

 extension String{
     func toCurrencyFormat() -> String {
        if let intValue = Int(self){
           let numberFormatter = NumberFormatter()
           numberFormatter.locale = Locale(identifier: "ig_NG")/* Using Nigeria's Naira here or you can use Locale.current to get current locale, please change to your locale, link below to get all locale identifier.*/ 
           numberFormatter.numberStyle = NumberFormatter.Style.currency
           return numberFormatter.string(from: NSNumber(value: intValue)) ?? ""
      }
    return ""
  }
}
 

lien pour obtenir tous les identifiant de paramètres régionaux

10voto

Rob Points 70987

En plus de l' NumberFormatter ou String(format:) discutée par d'autres, vous pouvez envisager d'utiliser l' Decimal ou NSDecimalNumber 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:

let formatter: NumberFormatter = {
    let _formatter = NumberFormatter()
    _formatter.numberStyle = .decimal
    _formatter.minimumFractionDigits = 2
    _formatter.maximumFractionDigits = 2
    _formatter.generatesDecimalNumbers = true
    return _formatter
}()

et puis, utiliser des nombres décimaux:

let string = "2.03"
let tipRate = Decimal(sign: .plus, exponent: -3, significand: 125) // 12.5%
guard let billAmount = formatter.number(from: string) as? Decimal else { return }
let tip = (billAmount * tipRate).rounded(2)

guard let output = formatter.string(from: tip as NSDecimalNumber) else { return }
print("\(output)")

extension Decimal {

    /// Round `Decimal` number to certain number of decimal places.
    ///
    /// - Parameters:
    ///   - scale: How many decimal places.
    ///   - roundingMode: How should number be rounded. Defaults to `.plain`.
    /// - Returns: The new rounded number.

    func rounded(_ scale: Int, roundingMode: RoundingMode = .plain) -> Decimal {
        var value = self
        var result: Decimal = 0
        NSDecimalRound(&result, &value, scale, roundingMode)
        return result
    }
}

É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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X