2009-06-26 11 views
47

nutro una casella di testo un valore stringa mi mostra un equilibrio che deve essere formattata in questo modo:Formattare un doppio valore come moneta, ma senza il segno di valuta (C#)

###,###,###,##0.00 

ho potuto utilizzare il value.ToString ("c"), ma questo metterebbe il segno di valuta di fronte ad esso.

Qualsiasi idea di come avrei manipolare la stringa prima di alimentare la casella di testo per ottenere la formattazione di cui sopra?

ho provato questo, ma senza successo:

String.Format("###,###,###,##0.00", currentBalance); 

Molte grazie,

risposta

50
string forDisplay = currentBalance.ToString("N2"); 
+10

Questo non è accettabile perché se il simbolo negativo per la valuta nella cultura è() e il simbolo negativo per i decimali è -, la rappresentazione della valuta sarà errata. –

+2

@Bob: questo è accettato la risposta è quindi, per definizione, accettabile per l'OP. Poiché non esiste un identificatore di formato incorporato per "formato come una valuta ma senza il simbolo di valuta", in quella situazione sarebbe necessaria una sorta di elaborazione manuale: o * (1) * usa un 'NumberFormatInfo' personalizzato come per la risposta di Jon, * (2) * usa una stringa di formato personalizzata, o * (3) * chiama' ToString ("c") 'e poi post-process per rimuovere il simbolo. – LukeH

+0

@ Luca: Sebbene questa sia la risposta accettata la risposta che Jon Skeet dà è più corretta nel senso che usa le formattazioni Valuta fornite da NumberFormatInfo. –

58

Se la formattazione di valuta ti dà esattamente quello che vuoi, clonare un NumberFormatInfo con e impostare la proprietà CurrencySymbol su "". Dovresti controllare che gestisca i numeri negativi nel modo che vuoi, naturalmente.

Ad esempio:

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main() 
    { 
     NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat; 
     nfi = (NumberFormatInfo) nfi.Clone(); 

     Console.WriteLine(string.Format(nfi, "{0:c}", 123.45m)); 
     nfi.CurrencySymbol = ""; 
     Console.WriteLine(string.Format(nfi, "{0:c}", 123.45m)); 
    } 
} 

L'altra opzione è quella di utilizzare una stringa di formato numerico personalizzato ovviamente - Dipende se si vuole veramente rispecchiare esattamente come una valuta apparirebbe, solo senza il simbolo, o il controllo il posizionamento esatto delle cifre.

+0

Questo funziona perfettamente. Se vuoi che la valuta sia formattata come la cultura corrente ma senza il simbolo, questa sembra essere la soluzione migliore. –

+1

È possibile aggiungere un Trim() al risultato per assicurarsi di non avere spazi iniziali (o finali). –

+1

@BenjaminWegman: Suppongo che se il formato di valuta sensibile alla cultura includesse spazi vuoti, è lì per una buona ragione. –

7

Hai provato:

currentBalance.ToString("#,##0.00"); 

Questo è l'equivalente di lunga mano:

currentBalance.ToString("N2"); 
2
CultureInfo cultureInfo = new CultureInfo("en-US"); 
cultureInfo.NumberFormat.CurrencySymbol = "Rs."; 

Thread.CurrentThread.CurrentCulture = cultureInfo; 
decimal devimalValue = 3.45M; 
this.Text = devimalValue.ToString("C2"); //Rs.3.45 
5

risultato stringa = string.Format ("{0: N2} ", valore); . // Per risultato come ### ### ## ##

3

Si può fare questo con the group separator e the section separator, in questo modo:

currentBalance.ToString("#,0.00;(#,0.00)"); 

Questo non tiene conto per la cultura varianze come la risposta da @JonSkeet sarebbe, ma questo posto mimica decimale, arrotondamento, separazione migliaia e movimentazione che en-US formato valuta cultura produce utilizzando una singola stringa di formato personalizzata numero negativo.

.NET Fiddle Demo

0

Questo può essere eccessivo, ma tondi, formati ...

@helper TwoDecimalPlaces(decimal? val) 
{ 
    decimal x = 0; 
    decimal y = 0; 
    string clas = "text-danger"; 
    if (val.HasValue) 
    { 
     x = (decimal)val; 
     if (val > 0) 
     { 
      clas = ""; 
     } 
    } 
    y = System.Math.Round(x, 2); 
    IFormatProvider formatProvider = new System.Globalization.CultureInfo(string.Empty); 
    <span class="@clas">@string.Format("{0:N2}", y)</span> 
} 
0

Questa semplice soluzione funziona per me con valuta statunitense.

Se non necessitano l'uso internazionale supporto per la valuta questo e sostituire il $ con il simbolo (s) da rimuovere:

// for USD 
string result = currentBalance.ToString("C").Replace("$", "") 

o

// for EUR 
string result = currentBalance.ToString("C").Replace("€", "") 
Problemi correlati