2012-09-20 21 views
17

Estoy usando NSNumberFormatter para obtener un valor de moneda de una cadena y funciona bien.NSNumberFormatter ¿Moneda sin símbolo?

que utiliza este código para hacerlo:

NSNumberFormatter *nf = [[NSNumberFormatter alloc] init]; 
    [nf setNumberStyle:NSNumberFormatterCurrencyStyle]; 
    NSString *price = [nf stringFromNumber:[NSNumber numberWithFloat:[textField.text floatValue]]]; 

Sin embargo, siempre me da un símbolo de moneda en el inicio de la cadena. En lugar de hacerlo manualmente, ¿no puedo de alguna manera que el formateador no le dé a la cadena ningún símbolo de moneda?

Se agradece cualquier ayuda, gracias.

+0

cuenta que no siempre va a estar en el inicio - para los precios en euros que tendrá algo como 12,34 € – ATV

Respuesta

57

Sí, después de establecer el estilo, que se pueden manipular aspectos específicos:

NSNumberFormatter *nf = [[NSNumberFormatter alloc] init]; 
[nf setNumberStyle:NSNumberFormatterCurrencyStyle]; 
[nf setCurrencySymbol:@""]; // <-- this 
NSDecimalNumber* number = [NSDecimalNumber decimalNumberWithString:[textField text]]; 
NSString *price = [nf stringFromNumber:number]; 

Así como algunos consejos, probablemente debería utilizar un formateador de número para leer el valor de cadena, especialmente si un usuario está entrando en ella (como lo sugiere tu código). En este caso, si el usuario ingresa texto de formato específico de la configuración regional, los métodos de tipo genéricos -floatValue y -doubleValue no le darán números truncados. Además, probablemente deba usar -doubleValue para convertir a un número de punto flotante del texto ingresado por el usuario que sea una moneda. Hay más información sobre esto en el video de la sesión de desarrollador de la WWDC'12 sobre internacionalización.

Editar: Usé NSDecimalNumber en el código de ejemplo para representar el número que ingresa el usuario. Todavía no está haciendo una validación adecuada, pero es mejor que el código original. Gracias @Mark!

+0

Por dinero, es posible que desee utilizar NSDecimalNumber en lugar de duplicar para no tener problemas de redondeo – Mark

+0

@Mark Sí, estoy de acuerdo, en realidad voy a editar el código original para hacer eso. –

0

como para Swift Idioma

let mymoney = 12000 

let formatter = NSNumberFormatter() 
formatter.numberStyle = .CurrencyStyle 
formatter.currencySymbol = "" 
formatter.locale = NSLocale.currentLocale() 

let resultString = formatter.stringFromNumber(mymoney)! 
2

Con Swift 3, NumberFormatter tiene una propiedad llamada currencySymbol. currencySymbol tiene la siguiente declaración:

var currencySymbol: String! { get set } 

La cadena utilizado por el receptor como un símbolo de la moneda local.

Por lo tanto, si es necesario para su estilo de formato, puede establecer esta propiedad en un String vacío.


El siguiente código de juegos de cómo ajustar su estilo de formato de moneda con un símbolo vacío:

import Foundation 

let amount = 12000 

let formatter = NumberFormatter() 
formatter.numberStyle = .currency 
formatter.currencySymbol = "" 
formatter.locale = Locale(identifier: "en_US") // set only if necessary 

let result = formatter.string(for: amount) 
//let result = formatter.string(from: NSNumber(value: amount)) // also works 

print(String(describing: result)) 
// prints Optional("12,000.00") 
Cuestiones relacionadas