2010-02-23 14 views
8

Ho un problema con l'override decimal.ToString("C"). Fondamentalmente quello che vuole fare è la seguente:Simbolo di valuta personalizzato e posizioni decimali utilizzando decimal.ToString ("C") e CultureInfo

CultureInfo usCulture = new CultureInfo("en-US"); 
Thread.CurrentThread.CurrentCulture = usCulture; 

NumberFormatInfo LocalFormat = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone(); 
LocalFormat.CurrencySymbol = "RM"; 

mi vuole fare sopra il codice a (ToString esclusione ("C")) la funzione per cui quando vengono eseguiti il ​​seguente codice:

decimal paid = Convert.ToDecimal(dr["TotalPaids"]); 
lblPaids.Text = paid.ToString("C"); 

i risultati sarebbero RM4,900.00 invece di $ 4.900,00

Come faccio a creare un override per decimal.ToString("C") che avrebbe risolto il mio problema

Grazie in anticipo.

+2

Qualsiasi possibilità che tu possa modificare il titolo per essere più descrittivo? "decimal.ToString (" C ")" non indica quello che stai chiedendo, quindi quando viene visualizzato in Google non è chiaro di quale sia la domanda. –

+1

@SteveHiner che ne dici del titolo ora? – Korayem

+1

@ Korayem: Molto meglio. :-) –

risposta

16

Per ottenere un formato simile RM 11,123,456.00 è anche necessario impostare le seguenti proprietà

CurrentCulture modified = new CultureInfo(Thread.CurrentThread.CurrentCulture.Name); 
Thread.CurrentThread.CurrentCulture = modified; 
var numberFormat = modified.NumberFormat; 
numberFormat.CurrencySymbol = "RM"; 
numberFormat.CurrencyDecimalDigits = 2; 
numberFormat.CurrencyDecimalSeparator = "."; 
numberFormat.CurrencyGroupSeparator = ","; 

Se lo fai, allora all'avvio dell'applicazione questo dovrebbe rendere il formato ms-MY come en-US ma con il simbolo di valuta RM ogni volta che si chiama il metodo ToString("C").

+0

Grazie Mike. My CultureInfo è ms-MY. Ma allo scopo di visualizzare il valore della valuta, ho bisogno di usare en-US perché viene visualizzato correttamente. E.g ms-MY = R11.747.435 e en-US = RM11.747.435.00. Esiste un altro modo, per quanto riguarda il metodo ToString ("C") che sovrascrive. Potresti per favore aiutarmi con quello. –

+0

@Agamand True - È possibile chiamare sempre 'ToString (" C ", LocalFormat)' Oppure modificare alcune delle altre proprietà sulle culture correnti NumberFormatInfo. Sembra che tu voglia solo cambiare il separatore e il numero di cifre decimali. Modificherò la risposta per includerla. –

+0

Grazie Mike, questo è perfetto. Ma quando lo metto in Global.asax, metodo Application_Start.Ottengo questo errore 'System.Globalization.CultureInfo' non contiene una definizione per 'NumberFormatInfo' e nessun metodo di estensione 'NumberFormatInfo' accettare un primo argomento di tipo 'System.Globalization.CultureInfo' stato trovato (che le manca una usando la direttiva o un riferimento all'assembly?) Ho già importato System.Globalization. Come posso risolvere questo ... –

2

uso questa stringa di formato:

#,##0.00 $;#,##0.00'- $';0 $ 
decimal paid = Convert.ToDecimal(dr["TotalPaids"]); 
lblPaids.Text = paid.ToString("#,##0.00 $;#,##0.00'- $';0 $"); 
+2

Boiiiiiing (la testa cade) – demoncodemonkey

6

Se ho capito la tua domanda correttamente ciò che si vuole è quello di sostituire il $ con RM. Se è così, è necessario passare il formato personalizzato ...

lblPaids.Text = paid.ToString("C", LocalFormat); 
+0

Tq per la risposta, ma la Localizzazione cultura locale è (ms-MY). Dal momento che sto usando Windows XP il segno di valuta per questa cultura è R e non RM che è il segno corretto. –

+0

Bene, allora è necessario modificare il valore che si sta impostando: LocalFormat.CurrencySymbol = "R"; – Jonathan

-1
lblPaids.Text = paid.ToString("C",usCulture.Name); 

O

lblPaids.Text = paid.ToString("C",LocalFormat.Name); 

deve lavorare

2

È possibile utilizzare il metodo Double.ToString (String, IFormatProvider) https://msdn.microsoft.com/en-us/library/d8ztz0sa(v=vs.110).aspx

double amount = 1234.95; 

amount.ToString("C") // whatever the executing computer thinks is the right fomat 

amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-ie")) // €1,234.95 
amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("es-es")) // 1.234,95 € 
amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-GB")) // £1,234.95 

amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-au")) // $1,234.95 
amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-us")) // $1,234.95 
amount.ToString("C", System.Globalization.CultureInfo.GetCultureInfo("en-ca")) // $1,234.95