Вопрос по c#, .net – Валюта формата строки
У меня есть эта строка
<code>@String.Format("{0:C}", @price) </code>
на мой взгляд бритвы. Я хочу, чтобы он отображал знак доллара перед ценой, но вместо этого он показывает знак фунта. Как мне этого добиться?
Как уже говорили другие, вы можете достичь этого с помощью IFormatProvider. Но имейте в виду, что форматирование валюты выходит далеко за рамки символа валюты. Например, правильно отформатированная цена в США может составлять «$ 12,50». но во Франции это будет написано "12,50 $" (десятичная запятая отличается от позиции символа валюты). Вы не хотите потерять форматирование, соответствующее культуре, только ради изменения символа валюты. И хорошей новостью является то, что вам это не нужно, поскольку этот код демонстрирует:
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".
CultureInfo
/NumberFormatInfo
модель не является оптимальной (по меньшей мере), но в этом случае его ответ просто не является наиболее подходящим. Кстати, я изначально создал новыйCultureInfo
объект на основе текущей культуры только для изменения символа валюты (так что вы можете сделать это тоже), но клонирование толькоNumberFormatInfo
объект определенно лучше.
Для тех, кто использует синтаксис интерполяции строк C # 6.0: например:$"The price is {price:C}"
, документация предлагает несколько способов применения различныхCultureInfo
.
Я адаптировал примеры для использования валюты:
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
Я сильно подозреваю, что проблема заключается в том, что текущая культура потока, обрабатывающего запрос, установлена неправильно.
Вы можете установить его для всего запроса или указать язык при форматировании. В любом случае, я бы предложилnot использованиеstring.Format
с составным форматом, если у вас действительно есть больше чем одна вещь для форматирования (или более широкое сообщение). Вместо этого я бы использовал:
@price.ToString("C", culture)
Это просто делает это несколько проще.
РЕДАКТИРОВАТЬ: Учитывая ваш комментарий, звучит так, что вы вполне можете использовать британскую культуруregardless культуры пользователя. Итак, еще раз, либо установите британскую культуру в качестве культуры потоков для всего запроса, либо, возможно, представьте свой собственный вспомогательный класс с «константой»:
public static class Cultures
{
public static readonly CultureInfo UnitedKingdom =
CultureInfo.GetCultureInfo("en-GB");
}
Затем:
@price.ToString("C", Cultures.UnitedKingdom)
По моему опыту, имея & quot; имя & quot; такой набор культур значительно упрощает чтение кода, использующего его, и вам не нужно правильно интерпретировать строку в нескольких местах.
Лично я против использования кода, специфичного для культуры, я предлагаю сделать:
@String.Format(CultureInfo.CurrentCulture, "{0:C}", @price)
и в вашем web.config сделайте:
<system.web>
<globalization culture="en-GB" uiCulture="en-US" />
</system.web>
Дополнительная информация: https://msdn.microsoft.com/en-us/library/syy068tk(v=vs.90).aspx
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();