2012-05-02 9 views
47

ho questa lineaString moneta formato

@String.Format("{0:C}", @price) 

a mio avviso rasoio. Voglio che mostri un segno di dollaro di fronte al prezzo, ma invece mostri un cancelletto. Come ottengo questo?

+4

Quando si dice "cancelletto" che cosa vuoi dire? # o £? –

+6

Ciao Jon, grande fan del tuo.Essendo inglese, intendo £. –

+2

@JonSkeet Molto interessante, mai visto in # in riferimento a "cancelletto", ma un rapido google fa apparire alcune buone informazioni. –

risposta

71

ho il forte sospetto che il problema è semplicemente che la cultura corrente della gestione della richiesta di filo non è impostata in modo appropriato.

È possibile impostarlo per l'intera richiesta oppure specificare la cultura durante la formattazione. Ad ogni modo, suggerirei non usare string.Format con un formato composito a meno che non si abbia davvero più di una cosa da formattare (o un messaggio più ampio). Invece, vorrei usare:

@price.ToString("C", culture) 

Semplicemente lo rende un po 'più semplice.

MODIFICA: Dato il tuo commento, sembra che potresti voler utilizzare una coltura del Regno Unito indipendentemente dallo della cultura dell'utente. Quindi, di nuovo, o impostare la cultura del Regno Unito come la cultura filo per tutta la richiesta, o, eventualmente, presentare la propria classe helper con un "costante":

public static class Cultures 
{ 
    public static readonly CultureInfo UnitedKingdom = 
     CultureInfo.GetCultureInfo("en-GB"); 
} 

Poi:

@price.ToString("C", Cultures.UnitedKingdom) 

Nella mia esperienza, avere un set "named" di culture come questo rende il codice molto più semplice da leggere, e non è necessario ottenere la stringa giusta in più punti.

+2

Hardcoding a CultureInfo per ottenere un determinato simbolo di valuta è buttare fuori il bambino con l'acqua del bagno. Inoltre, non vi è alcuna garanzia che un certo CultureInfo manterrà il simbolo di valuta che si aspetta che abbia. Ma il problema principale è che si introduce un bug di globalizzazione perdendo la corretta formattazione della cultura (simbolo decimale, posizionamento del simbolo di valuta). Si prega di vedere la mia risposta per una spiegazione. – Clafou

+3

@Clafou: a volte butta fuori il bambino con l'acqua sporca; a volte è la cosa giusta da fare. Sono d'accordo è un argomento complesso però. È un dolore (IMO) che ci sia un "formato valuta" che include la valuta, piuttosto che un tipo "Denaro" con importo e valuta, che potrebbe quindi essere formattato in base alla cultura locale. –

+0

Sono d'accordo, è a dir poco imbarazzante (penso che la formattazione della valuta sia l'argomento della globalizzazione che confonde la maggior parte delle persone). Fortunatamente ci sono librerie di terze parti come [NMoneys] (http://code.google.com/p/nmoneys/) che funzionano bene. – Clafou

28

è necessario fornire un IFormatProvider:

@String.Format(new CultureInfo("en-US"), "{0:C}", @price) 
+0

il tipo o lo spazio dei nomi 'cultureInfo' non può essere trovato ... – niico

36

Come altri hanno già detto, è possibile ottenere ciò tramite un IFormatProvider. Ma tieni presente che la formattazione della valuta va ben oltre il simbolo della valuta. Ad esempio, un prezzo correttamente formattato negli Stati Uniti potrebbe essere "$ 12,50", ma in Francia questo sarebbe scritto "12,50 $" (il punto decimale è diverso così come la posizione del simbolo di valuta). Non vuoi perdere questa formattazione adatta alla cultura solo per cambiare il simbolo della valuta. E la buona notizia è che non c'è bisogno di, come dimostra questo codice:

var cultureInfo = Thread.CurrentThread.CurrentCulture; // You can also hardcode the culture, e.g. var cultureInfo = new CultureInfo("fr-FR"), but then you lose culture-specific formatting such as decimal point (. or ,) or the position of the currency symbol (before or after) 
var numberFormatInfo = (NumberFormatInfo)cultureInfo.NumberFormat.Clone(); 
numberFormatInfo.CurrencySymbol = "€"; // Replace with "$" or "£" or whatever you need 

var price = 12.3m; 
var formattedPrice = price.ToString("C", numberFormatInfo); // Output: "€ 12.30" if the CurrentCulture is "en-US", "12,30 €" if the CurrentCulture is "fr-FR". 
+1

Nel 99% dei casi, questa è l'unica risposta corretta. Jon Skeet potrebbe avere più fan, e ha ragione nel dire che il modello 'CultureInfo' /' NumberFormatInfo' non è ottimale (per non dire altro), ma in questo caso la sua risposta semplicemente non è la più appropriata. A proposito, inizialmente ho creato un nuovo oggetto 'CultureInfo' basato sulla cultura corrente solo per cambiare il simbolo della valuta (quindi puoi farlo anche tu), ma la clonazione solo dell'oggetto' NumberFormatInfo' è decisamente migliore. – tne

3

Per rasoio è possibile utilizzare: la cultura, il valore

@String.Format(new CultureInfo("sv-SE"), @Model.value) 
9

Personalmente sono contro l'uso di codice specifico della cultura , vi suggerisco di fare:

@String.Format(CultureInfo.CurrentCulture, "{0:C}", @price) 

e nel tuo web.config fare:

<system.web> 
    <globalization culture="en-GB" uiCulture="en-US" /> 
</system.web> 

Ulteriori informazioni: https://msdn.microsoft.com/en-us/library/syy068tk(v=vs.90).aspx

1
decimal value = 0.00M; 
value = Convert.ToDecimal(12345.12345); 
Console.WriteLine(".ToString(\"C\") Formates With Currency $ Sign"); 
Console.WriteLine(value.ToString("C")); 
//OutPut : $12345.12 
Console.WriteLine(value.ToString("C1")); 
//OutPut : $12345.1 
Console.WriteLine(value.ToString("C2")); 
//OutPut : $12345.12 
Console.WriteLine(value.ToString("C3")); 
//OutPut : $12345.123 
Console.WriteLine(value.ToString("C4")); 
//OutPut : $12345.1234 
Console.WriteLine(value.ToString("C5")); 
//OutPut : $12345.12345 
Console.WriteLine(value.ToString("C6")); 
//OutPut : $12345.123450 
Console.WriteLine(); 
Console.WriteLine(".ToString(\"F\") Formates With out Currency Sign"); 
Console.WriteLine(value.ToString("F")); 
//OutPut : 12345.12 
Console.WriteLine(value.ToString("F1")); 
//OutPut : 12345.1 
Console.WriteLine(value.ToString("F2")); 
//OutPut : 12345.12 
Console.WriteLine(value.ToString("F3")); 
//OutPut : 12345.123 
Console.WriteLine(value.ToString("F4")); 
//OutPut : 12345.1234 
Console.WriteLine(value.ToString("F5")); 
//OutPut : 12345.12345 
Console.WriteLine(value.ToString("F6")); 
//OutPut : 12345.123450 
Console.Read(); 

uscita schermo della console:

+1

Suggerirei di ridurre la risposta alla domanda posta. Mentre questo potrebbe essere giusto, solo il 10% circa della risposta deve fare qualcosa con la domanda. Inoltre, penso anche che il poster usi già il formato giusto ma abbia alcuni problemi locali. Quindi questa risposta non è molto utile –

Problemi correlati