2012-06-13 10 views
9

momento stiamo utilizzando i seguenti per la creazione di valori in dollari degli Stati Uniti nella nostra applicazione web:Come utilizzare NumberFormatInfo per rimuovere le parentesi per i valori negativi

string.Format("{0:C0}", dollarValue); 

In questo esempio, se dollarValue è 145, poi ci vedi: $ 145. Se è -145, vedremo ($ 145) anziché - $ 145. Nota che per noi, dollarValue è un doppio, ma potrebbe essere qualsiasi tipo di numero. Credo.

In ogni caso, quello che voglio è che sia $ 145 o - $ 145.

Ora, secondo la mia ricerca, potrebbe essere possibile farlo utilizzando la classe NumberFormatInfo. Non riesco a capire come usarlo, e non riesco a trovare alcun esempio valido. Ho visto questa domanda qui: C# creating a custom NumberFormatInfo to display "Free" when a currency value is $0.00 ma l'esempio da MSDN collegato a questa domanda sembra un po 'diverso da quello che voglio veramente fare.

mi rendo conto, ho bisogno di fare qualcosa di quanto segue:

double dollarValue = -145d; 
string myMoney = dollarValue.ToString("C0", someIFormatProvider); 

dove someIFormatProvider rischia di tipo NumberFormatInfo. Ora, quello che ho fatto è questo:

NumberFormatInfo ni = new NumberformatInfo(); 
ni.CurrencyNegativePattern = 1; // The value 1 should mean not to use parenthesis 
string myMoney = dollarValue.ToString("C0", ni); 

... e ottengo un'eccezione "Istanza è di sola lettura". Mentre la "documentazione" per la proprietà CurrencyNegativePattern dice che è possibile impostare e ottenere il valore, a quanto pare, non è possibile. Inoltre, NumberFormatInfo è una classe sigillata. Non riesco facilmente a creare una nuova classe basandoci su di essa e sovrascrivendo il valore.

Sono in perdita su come affrontare questo. In questo momento, la mia soluzione è di negare il mio valore negativo e avere un risultato positivo che faccio di nuovo il string.Format(...). Sì, mi rendo conto che non c'è alcun segno negativo davanti a questo, ma, naturalmente, questo è facilmente risolto aggiungendo un "-" di fronte al risultato, se necessario.

Qualcuno sarebbe in grado di fornirmi un esempio funzionante di come utilizzare correttamente la classe NumbefFormatInfo correttamente in questa situazione? Grazie.

+0

Sei sicuro l'errore deriva dall'impostazione di CurrencyNegativePattern di un'istanza NumberFormatInfo? Ho visto questa eccezione di sola lettura, ma viene sollevato dal tentativo di modificare le proprietà CurrentUICulture? – Tisho

+0

Il codice funziona per me (dopo aver risolto il caso su 'NumberformatInfo') –

risposta

2
double dollarValue = -145d; 
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US"); 
string mymoney = dollarValue.ToString("C", modCulture); 
      MessageBox.Show(mymoney); 

Se il vostro sistema operativo attuale cultura è en-US, allora non avete bisogno la seguente riga

System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US"); 

Il codice sarà

double dollarValue = -145d; 
string mymoney = dollarValue.ToString("C"); 

e Se si vuole fare con NumberFormatInfo

double dollarValue = -145d; 
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US"); 
    NumberFormatInfo number = modCulture.NumberFormat; 
    string mymoney = dollarValue.ToString("C", number); 

un altro modo

double dollarValue = -145d; 
System.Globalization.CultureInfo modCulture = new System.Globalization.CultureInfo("en-US"); 
NumberFormatInfo number = modCulture.NumberFormat; 
string mymoney = dollarValue.ToString(String.Format("C",number)); 
Console.WriteLine(mymoney); 
+0

E qui [il documento] (http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.currencynegativepattern.aspx). –

+1

Ho provato questa risposta in un'app console per i test e il risultato è stato ($ 145). Se ho usato "C" invece di "0: C0", per il formato, ho ottenuto ($ 145,00). – Dan7el

+0

controlla la risposta modificata per favore. – MMK

3

Prova questo ...

string.Format("{0:$#.;-$#.}", -145) 

o

dollarValue.ToString("$#.;-$#.") 
+0

È necessario scambiare il' $ 'e il' -'. –

+0

E, naturalmente, 'string.Format (" {0: $ #.; - $ #.} ", DollarValue)' è equivalente a 'dollarValue.ToString (" $ #.; - $ #. ")' Nel allo stesso modo di 'string.Format (" {0: C0} ", dollarValue)' è equivalente a 'dollarValue.ToString (" C0 ")'. –

+0

@Jeppe formato risolto .... grazie per la cattura ... e mi piace la tua seconda opzione un po 'meglio ... cambiato per riflettere questo. –

1

'istanza è ReadOnly' significa che avete un'istanza di sola lettura di NumberFormatInfo.È possibile ottenere un'istanza scrivibile clonando un'istanza di sola lettura:

NumberFormatInfo writeable = (NumberFormatInfo) ni.Clone(); 
1

Sei sicuro il CurrencyNegativePattern non può essere assegnare? Ho provato con questo codice:

double dollarValue = -145d; 
System.Globalization.NumberFormatInfo ni = new System.Globalization.NumberFormatInfo(); 
ni.CurrencyNegativePattern = 1; 
dropDownList.Items.Add(new ListItem(dollarValue.ToString("C0", ni))); 

ed è un successo.

10

È possibile creare un clone della proprietà NumberFormat nel numero CurrentCulture (questo farà sì che si mantenga il simbolo di valuta corretto se si globalizza l'applicazione). Dopo di che, basta impostare la proprietà CurrencyNegativePattern al valore desiderato e passare il vostro NumberFormatInfo nella funzione double.ToString(), in questo modo:

NumberFormatInfo noParens = (NumberFormatInfo)CultureInfo.CurrentCulture.NumberFormat.Clone(); 
noParens.CurrencyNegativePattern = 1; 
double dollarValue = -145d; 
string output = dollarValue.ToString("C0", noParens); // outputs -$145 
+0

Interessante. Grazie, ha funzionato. Sono contento di vedere che non ero troppo distante dall'implementazione generale. Non sapevo di doverlo clonare. – Dan7el

+1

Ciò consentirà anche di utilizzare la cultura corrente, quindi non è necessario codificarla su "en-US" nel caso in cui si finisca per globalizzare la propria applicazione web. –

1

per essere sicuri di rimanere in una "USA-contesto" Mi piacerebbe fare qualcosa di simile questo:

double val = -145d; 
NumberFormatInfo nfi = new CultureInfo("en-US").NumberFormat; 
nfi.CurrencyNegativePattern = 1; 
val.ToString("C0", nfi).Dump(); 

Il Dump viene da LINQPad, che visualizza -$145 come risultato.

L'errore che si stanno ottenendo sente come esso viene da voi ottenere il vostro NumberFormatInfo qualcosa di simile:

NumberFormatInfo nfi = Thread.CurrentThread.CurrentCulture.NumberFormat; 

Nel qual caso mi piacerebbe sostituire con qualcosa di simile:

NumberFormatInfo nfi = (NumberFormatInfo)Thread.CurrentThread.CurrentCulture.NumberFormat.Clone();