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)"
}
}
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)"
}
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)
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
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)")
Où
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).
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
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"
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?