web-dev-qa-db-fra.com

Devise de format de chaîne

J'ai cette ligne

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

dans ma vue rasoir. Je veux qu'il affiche un signe dollar devant le prix, mais plutôt un signe livre Comment est-ce que je réalise ceci?

50
Sachin Kainth

Je soupçonne fortement que le problème est simplement que la culture actuelle du thread traitant la demande n'est pas définie correctement.

Vous pouvez soit le définir pour l'ensemble de la demande, soit spécifier la culture lors du formatage. Quoi qu'il en soit, je suggérerais que pas utilise string.Format avec un format composite à moins que vous n'ayez vraiment plus d'une chose à formater (ou un message plus large). Au lieu de cela, j'utiliserais:

@price.ToString("C", culture)

Cela simplifie un peu les choses.

EDIT: Compte tenu de votre commentaire, il semble que vous souhaitiez peut-être utiliser une culture britannique indépendamment de de la culture de l'utilisateur. Encore une fois, définissez la culture britannique comme culture de thread pour toute la requête ou introduisez éventuellement votre propre classe d’aide avec une "constante":

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

Ensuite:

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

D'après mon expérience, le fait de disposer d'un ensemble de cultures "nommé" comme celui-ci simplifie considérablement la lecture du code, sans qu'il soit nécessaire de placer la chaîne correctement à plusieurs endroits.

73
Jon Skeet

Comme d'autres l'ont dit, vous pouvez y parvenir grâce à IFormatProvider. Mais gardez à l'esprit que le formatage monétaire va bien au-delà du symbole monétaire. Par exemple, un prix correctement formaté aux États-Unis peut être de "12,50 $", mais en France, cela s’appelle "12,50 $" (la virgule est différente de la position du symbole monétaire). Vous ne voulez pas perdre ce formatage adapté à la culture uniquement pour changer le symbole monétaire. Et la bonne nouvelle est que vous n’avez pas à le faire, comme le montre ce code:

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".
39
Clafou

Vous devez fournir un IFormatProvider:

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

Personnellement, je suis contre l'utilisation de code spécifique à la culture, je suggère de faire:

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

et dans votre web.config faire:

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

Informations complémentaires: https://msdn.Microsoft.com/en-us/library/syy068tk(v=vs.90).aspx

11
Sam Jones

Pour rasoir, vous pouvez utiliser: culture, valeur

@String.Format(new CultureInfo("sv-SE"), @Model.value)
3
Luke Alderton
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();

Écran de la console de sortie:
 

1
Bhanu pratap

Utilisez ceci cela fonctionne et si simple:

  var price=22.5m;
  Console.WriteLine(
     "the price: {0}",price.ToString("C", new System.Globalization.CultureInfo("en-US")));
0
Coder992

Pour ceux qui utilisent la syntaxe d'interpolation de chaîne C # 6.0: par exemple: $"The price is {price:C}", la documentation suggère quelques façons d'appliquer différents a CultureInfo.

J'ai adapté les exemples pour utiliser la devise:

decimal price = 12345.67M;
FormattableString message = $"The price is {price:C}";

System.Globalization.CultureInfo.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo("nl-NL");
string messageInCurrentCulture = message.ToString();

var specificCulture = System.Globalization.CultureInfo.GetCultureInfo("en-IN");
string messageInSpecificCulture = message.ToString(specificCulture);

string messageInInvariantCulture = FormattableString.Invariant(message);

Console.WriteLine($"{System.Globalization.CultureInfo.CurrentCulture,-10} {messageInCurrentCulture}");
Console.WriteLine($"{specificCulture,-10} {messageInSpecificCulture}");
Console.WriteLine($"{"Invariant",-10} {messageInInvariantCulture}");
// Expected output is:
// nl-NL      The price is € 12.345,67
// en-IN      The price is ₹ 12,345.67
// Invariant  The price is ¤12,345.67
0
Andrew