web-dev-qa-db-fra.com

Comment formater un double en devise - Swift 3

Je suis nouveau dans la programmation de Swift et je crée une application de calculateur de pourboires simple dans Xcode 8.2. Mes calculs sont configurés dans mon IBAction ci-dessous. réellement exécuter mon application et entrer un montant à calculer (tel que 23,45), il arrive 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)"
    }
}
37
Gar

Vous pouvez utiliser cet initialiseur de chaîne si vous souhaitez forcer la devise à $:

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

Si vous souhaitez qu'il soit totalement dépendant des paramètres régionaux du périphérique, vous devez utiliser un paramètre NumberFormatter. Cela tiendra compte du nombre de décimales de la devise et du positionnement correct du symbole de la devise. Par exemple. la double valeur 2.4 retournera "2,40 €" pour la locale es_ES et "¥ 2" pour la locale jp_JP.

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)"
}
73
silicon_valley

La meilleure façon de faire est de créer un NSNumberFormatter. (NumberFormatter in Swift 3.). Vous pouvez demander une devise et configurer la chaîne pour qu'elle suive 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 US, vous pouvez la formater de la manière suivante:

let amount: Double = 123.45

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

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
9
Camilo Ortegón

En plus des NumberFormatter ou String(format:) discutés par d’autres personnes, vous pouvez envisager d’utiliser Decimal ou NSDecimalNumber et de contrôler vous-même les arrondis, évitant ainsi de flotter. points de problèmes. Si vous utilisez un simple calculateur de pourboire, cela n’est probablement pas nécessaire. Mais si vous faites quelque chose comme additionner les astuces à la fin de la journée, si vous n’arrondissez pas les nombres et/ou ne calculez pas à l’aide de nombres décimaux, vous pouvez introduire des erreurs.

Alors, allez-y et configurez votre formateur:

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

et ensuite, utilisez 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
    }
}

Bien entendu, vous pouvez remplacer toutes les références "2 décimales" ci-dessus par le nombre approprié pour la devise que vous utilisez (ou éventuellement utiliser une variable pour le nombre de décimales).

9
Rob

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

7
king_T

Vous pouvez convertir comme ça: cette fonction de conversion conserve pour vous le maximum de chiffres de transaction chaque fois que vous le souhaitez.

static func df2so(_ price: Double) -> String{
        let numberFormatter = NumberFormatter()
        numberFormatter.groupingSeparator = ","
        numberFormatter.groupingSize = 3
        numberFormatter.usesGroupingSeparator = true
        numberFormatter.decimalSeparator = "."
        numberFormatter.numberStyle = .decimal
        numberFormatter.maximumFractionDigits = 2
        return numberFormatter.string(from: price as NSNumber)!
    } 

je le crée dans la classe Model puis quand vous appelez, vous pouvez l'accepter une autre classe, comme celle-ci

 print("InitData: result convert string " + Model.df2so(1008977.72))
//InitData: result convert string "1,008,977.72"
5
Chung Nguyen
extension Float {
    var localeCurrency: String {
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        formatter.locale = .current
        return formatter.string(from: self as NSNumber)!
    }
}
    amount = 200.02
    print("Amount Saved Value ",String(format:"%.2f", amountSaving. localeCurrency))

Pour moi, son retour 0.00! Looks to me Extenstion Parfait pour y accéder, retournez 0.00! Pourquoi?

0
KkMIW