2010-10-22 8 views
17

Abbiamo un grande progetto ASP.NET MVC in cui tutti i numeri emessi sullo schermo sono formattati come valuta (cioè ToString ("c"). Tuttavia, i numeri negativi vengono visualizzati con () 's. ad esempio:Formato a variazione globale dei numeri di valuta negativi in ​​C#

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

questo è un po' fastidioso per i nostri utenti, soprattutto perché ci sono in caselle di testo abbiamo qualche migliaio di posti in cui inviamo campi di valuta alla schermata come questa, così abbiamo.' Adoro un modo per cambiare la formattazione a livello globale. C'è uno? Tutti i metodi che ho visto indicano che devi creare un nuovo formattatore, simile a questo:

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

Preferiremmo non cambiare tutti i nostri metodi ToString ("c") ... c'è un modo migliore? Il mio primo pensiero è stato quello di cambiare il nostro locale in Australia, ma ho capito che la formattazione della data sarebbe stata rovinata.

risposta

11

Aliostad era vicino ... provare questo nel vostro controller di base:

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

Ha funzionato! Grazie! –

4

Sei sulla strada giusta. Ma invece di creare un nuovo formattatore, modificare il formato negativo del thread corrente:

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

si può mettere questo quando viene avviata la richiesta e in ASP.NET uno e un solo filo è responsabile per la gestione di una richiesta in modo questo influirà tutte le tue formattazioni di valuta (a meno che tu stesso non crei una nuova discussione, nel qual caso hai la possibilità di cambiarla).

Aggiornamento

Sì sopra non funziona perché è di sola lettura! provare questo:

  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

ero emozionato, ma questo non ha funzionato - ho ricevuto un InvalidOperationException ... "Istanza è readonly " –

+0

HI Jess, non l'ho provato e ho avuto il sospetto che qualcosa nella riga sia stato letto solo. guarda il mio aggiornamento – Aliostad

+0

Sì, funziona. Ho segnato la risposta dell'altra persona come corretta dal momento che era il primo però. –

Problemi correlati