Формат строкового формата - программирование
Подтвердить что ты не робот

Формат строкового формата

У меня есть эта строка

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

в моем режиме бритвы. Я хочу, чтобы он отображал знак доллара перед ценой, но вместо этого показывал знак фунта. Как достичь этого?

4b9b3361

Ответ 1

Я сильно подозреваю, что проблема в том, что текущая культура потока, обрабатывающего запрос, не установлена ​​надлежащим образом.

Вы можете либо установить его для всего запроса, либо указать культуру во время форматирования. В любом случае, я бы предложил не использовать string.Format с композитным форматом, если у вас действительно есть более чем одна форма для форматирования (или более широкое сообщение). Вместо этого я бы использовал:

@price.ToString("C", culture)

Это просто делает его несколько проще.

EDIT: Учитывая ваш комментарий, похоже, что вы можете захотеть использовать британскую культуру независимо от культуры пользователя. Так или иначе, либо настройте культуру Великобритании как культуру потока для всего запроса, либо, возможно, представите свой собственный класс-помощник с константой:

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

Тогда:

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

По моему опыту, наличие "именованного" набора культур, подобных этому, делает использование кода более простым для чтения, и вам не нужно получать строку в нескольких местах.

Ответ 2

Как говорили другие, вы можете достичь этого через 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".

Ответ 3

Вам необходимо предоставить IFormatProvider:

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

Ответ 4

Лично я против использования специального кода для культуры, я предлагаю сделать:

@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

Ответ 5

Для бритвы вы можете использовать: culture, value

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

Ответ 6

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();

Экран консоли вывода:

Ответ 7

Используйте это, это работает и так просто:

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

Ответ 8

Для тех, кто использует синтаксис интерполяции строки С# 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