NSDecimalFormatter y símbolos de moneda: $ US en lugar de $

Debo estar perdiendo algo obvio, pero como perdí mucho time en esto, dejaré que los expertos echen un vistazo. Solo estoy dispuesto a get una cadena formateada exactamente como la quiero, pero el símbolo de moneda me está dando un problema: está usando algún tipo de código internacional cuando solo quiero el símbolo.

NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease]; [formatter setNumberStyle:NSNumberFormatterDecimalStyle]; [formatter setCurrencyCode:currencyCode]; [formatter setPositiveFormat:@"#,##0.00 ¤"]; [formatter setNegativeFormat:@"-#,##0.00 ¤"]; 

Esto resulta en: $ 1,250.56 en lugar de $ 1,250.56

No estableceré el entorno ya que solo tengo un símbolo: EUR / USD / GBP, etc.

Si desea un signo de dólar y solo un signo de dólar, ¿por qué no simplemente especificar un formatting como '$#,##0.00' con un $ literal? Alternativamente, especifique una configuration regional que formatee la cantidad de la forma que desee de forma pnetworkingeterminada.

Especificar NSNumberFormatterCurrencyStyle es solo un acceso directo para configurar el formatting de moneda estándar de la configuration regional, que includeá si el símbolo tiene un prefijo o un sufijo para la cantidad, pero tiene poca relación con lo que está haciendo, ya que está especificando el formatting manualmente.

Estás viendo US$ porque formatea la moneda USD de forma adecuada para tu región. (Aunque debe haber mezclado su cadena de formatting y su resultado, ya que respeta si solicita el prefijo o la colocación de sufijo del código de moneda). Pero darvids0n es principalmente correcto:

  • Un símbolo de moneda en la cadena de formatting coloca el símbolo de la localidad para esa moneda, que es "$" in y US$ en muchos otros;
  • Dos lugares el símbolo internacional, como "USD";
  • Tres lugares el nombre de visualización de la configuration regional para esa moneda, como "dólar estadounidense".

Aquí hay un ejemplo de este comportamiento que utiliza la configuration regional sueca (henetworkingada de forma pnetworkingeterminada, no establecida explícitamente; eso es lo que establece mi máquina ahora mismo):

 > nf := NSNumberFormatter alloc init > nf setNumberStyle:NSNumberFormatterDecimalStyle > amt := 1250.56 > nf setPositiveFormat:'¤ #,##0.00' > nf stringFromNumber:amt 'US$ 1 250,56' > nf setPositiveFormat:'#,##0.00 ¤' > nf stringFromNumber:amt '1 250,56 US$' > nf setPositiveFormat:'#,##0.00 ¤¤' > nf stringFromNumber:amt '1 250,56 USD' > nf setPositiveFormat:'#,##0.00 ¤¤¤' > nf stringFromNumber:amt '1 250,56 US-dollar' 

(La syntax es la de F-Script .)

Pruebe NSNumberFormatterCurrencyStyle.

Este simple código:

 NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease]; [currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; [currencyFormatter setCurrencyCode:currencyCode]; NSString *formatted = [currencyFormatter stringFromNumber:[NSDecimalNumber decimalNumberWithString:@"1250.56"]]; NSLog(@"%@", formatted); 

Salidas:

 2011-10-26 19:18:49.141 Craplet[8716:707] $1,250.56 

Dicho eso, no puedo repro tu problema. Si uso el estilo decimal, con sus trabajos de formatting explícito positivo y negativo:

 // ... [currencyFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; // ... [currencyFormatter setPositiveFormat:@"#,##0.00 ¤"]; [currencyFormatter setNegativeFormat:@"-#,##0.00 ¤"]; 2011-10-26 19:29:28.943 Craplet[9458:707] 1,250.56 $ 2011-10-26 19:29:28.949 Craplet[9458:707] -1,250.56 $ 

El estilo de número debe establecerse en NSNumberFormatterCurrencyStyle para la moneda.

EDITAR: Según la corrección de @Jeremy W. Sherman, los $US que está viendo son el símbolo de la currencySymbol para el dólar de EE. UU. En algunos (todos?) No en locales, que deberían aparecer de forma pnetworkingeterminada en CurrencyStyle . El internationalCurrencySymbol para el dólar estadounidense es USD y solo debe mostrar el símbolo de moneda internacional si proporciona dos caracteres de moneda en el formatting de acuerdo con Unicode tr35-10 .

Creo que tendrás que analizar la cadena de moneda y eliminar los caracteres alfa. Suponiendo que no hay un símbolo de moneda que sea solo letras mayúsculas, por supuesto.