ios - spanish - swift locale identifier list
Cómo formatear un doble en moneda-Swift 3 (7)
Soy nuevo en la programación de Swift y he estado creando una aplicación de calculadora de propinas simple en Xcode 8.2, tengo mis cálculos configurados dentro de mi IBAction
continuación. Pero cuando ejecuto mi aplicación e ingrese una cantidad para calcular (como 23.45), aparece con más de 2 decimales. ¿Cómo lo formateo a .currency
en este caso?
@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)"
}
}
Además del NumberFormatter
o String(format:)
discutido por otros, es posible que desee considerar el uso de Decimal
o NSDecimalNumber
y controlar el redondeo, evitando así los problemas de punto flotante. Si estás haciendo una simple calculadora de propinas, probablemente no sea necesario. Pero si está haciendo algo como sumar los consejos al final del día, si no redondea los números y / o no hace sus cálculos matemáticos usando números decimales, puede introducir errores.
Entonces, adelante y configura tu formateador:
let formatter: NumberFormatter = {
let _formatter = NumberFormatter()
_formatter.numberStyle = .decimal
_formatter.minimumFractionDigits = 2
_formatter.maximumFractionDigits = 2
_formatter.generatesDecimalNumbers = true
return _formatter
}()
y luego, usa números decimales:
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)")
Dónde
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
}
}
Obviamente, puede reemplazar todas las referencias anteriores de "2 posiciones decimales" con cualquier número que sea apropiado para la moneda que esté utilizando (o posiblemente utilice una variable para la cantidad de posiciones decimales).
Así es cómo:
let currentLocale = Locale.current
let currencySymbol = currentLocale.currencySymbol
let outputString = "/(currencySymbol)/(String(format: "%.2f", totalBillAmount))"
1ª línea: estás obteniendo el local actual
2ª línea: está obteniendo el símbolo de moneda para esa ubicación. ($, £, etc)
3ª línea: usando el inicializador de formato para truncar su doble a 2 decimales.
Como hacerlo en 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
La mejor manera de hacerlo es crear un NSNumberFormatter
. ( NumberFormatter
en Swift 3.) Puede solicitar dinero y configurará la cadena para que siga las configuraciones de localización del usuario, lo cual es útil.
Si desea forzar una cadena de dólares y centavos con formato de EE. UU., Puede formatearla de esta manera:
let amount: Double = 123.45
let amountString = String(format: "$%.02f", amount)
Puede convertir así: esta conversión de función guarda para usted el número máximo de dígitos cuando lo desee hacer
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)!
}
Lo creo en el modelo de clase, entonces cuando llamas, puedes acceder a otra clase, como esta.
print("InitData: result convert string " + Model.df2so(1008977.72))
//InitData: result convert string "1,008,977.72"
Puede usar este inicializador de cadena si desea forzar la moneda a $:
String(format: "Tip Amount: $%.02f", tipAmount)
Si desea que sea totalmente dependiente de la configuración regional del dispositivo, debe usar un NumberFormatter
. Esto tendrá en cuenta el número de lugares decimales para la moneda, así como la ubicación correcta del símbolo de moneda. Por ejemplo, el valor doble 2.4 devolverá "2,40 €" para el entorno local de es_ES y "¥ 2" para el entorno local de 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)"
}
puede crear una extensión para la cadena o Int, yo mostraría un ejemplo con Cadena
extension String{
func toCurrencyFormat() -> String {
if let intValue = Int(self){
let numberFormatter = NumberFormatter()
numberFormatter.locale = Locale(identifier: "ig_NG")/* Using Nigeria''s Naira here, 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 ""
}
}