spanish ios swift formatting currency

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 "" } }

enlace para obtener todos los identificadores locales