2010-10-22 21 views
17

Tenemos un gran proyecto ASP.NET MVC donde todos los números que salen a la pantalla tienen el formato de moneda (es decir, ToString ("c"). Sin embargo, se muestran números negativos con) 's Por ejemplo:.Formato de cambio global de números de moneda negativos en C#

decimal d = -8.88m; 
Console.WriteLine(d.ToString("c")); 
//outputs $(8.88) 

esto es un poco molesto para los usuarios, sobre todo porque no están en los cuadros de texto tenemos unos cuantos miles de lugares en los que enviamos campos de moneda a la pantalla de este tipo, por lo que.' Me encantaría cambiar el formato de forma global. ¿Hay alguno? Todos los métodos que he visto indican que debe crear un formateador nuevo, similar a este:

string curCulture = System.Threading.Thread.CurrentThread.CurrentCulture.ToString(); 
System.Globalization.NumberFormatInfo currencyFormat = 
    new System.Globalization.CultureInfo(curCulture).NumberFormat; 
currencyFormat.CurrencyNegativePattern = 1; 

Preferimos no cambiar todos nuestros métodos ToString ("c") ... ¿hay alguna otra manera mejor? Lo primero que pensé fue cambiar nuestra configuración regional a Australia, pero me di cuenta de que el formato de la fecha se estropearía.

Respuesta

11

Aliostad estaba cerca ... probar esto en su base:

 System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US"); 
     modCulture.NumberFormat.CurrencyNegativePattern = 1; 
     Thread.CurrentThread.CurrentCulture = modCulture; 
+0

¡Funcionó! ¡Gracias! –

4

Estás en el camino correcto. Pero en lugar de crear un nuevo formateador, cambiar el formato de negativo de hilo actual:

// update: dont use this! 
    Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyNegativePattern = 1; 

Usted puede poner esto cuando se inicia la solicitud y en ASP.NET uno y sólo un hilo es responsable del manejo de un pedido, por lo que esto afectará todos los formatos de moneda (a menos que usted mismo cree un nuevo hilo, en cuyo caso tiene la opción de cambiarlo).

actualización

Sí anterior no funciona de sólo lectura, ya que está! intente esto:

  Console.WriteLine((-111.98).ToString("c")); 
      CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture; 
      CultureInfo newCulture = new CultureInfo(currentCulture.IetfLanguageTag); 
      newCulture.NumberFormat.CurrencyNegativePattern = 1; 
      Thread.CurrentThread.CurrentCulture = newCulture; 
      Console.WriteLine((-111.98).ToString("c")); 
+0

yo estaba excitado, pero esto no funcionó - He recibido un InvalidOperationException ... "es Instancia readonly " –

+0

HI Jess, de verdad no lo probé y sospechaba que algo en la línea sería de solo lectura. ver mi actualización – Aliostad

+0

Sí, eso funciona. Marqué la respuesta de la otra persona como correcta desde el principio. –

Cuestiones relacionadas