Вопрос по c#, .net – Валюта формата строки

51

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

<code>@String.Format("{0:C}", @price)
</code>

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

Привет, Джон, большой твой фанат. Будучи британцем, я имею в виду & # xA3 ;. Sachin Kainth
Когда вы говорите «знак фунта» что именно ты имеешь ввиду? # или & # xA3 ;? Jon Skeet
@TimBJames - это то, что мы называем в штатах (хотя я слышал, что это упоминается как «знак хеша», чаще всего в наши дни, как это всегда делали британцы). William
@JonSkeet - вы можете помнить из нашего времени в TDWTF, что он также называется Octothorp (по крайней мере, курсивом). Там был комментатор по имени C-Octothorp (от музыкального символа). hoodaticus
@JonSkeet Очень интересно, никогда не видел # со ссылкой на «знак фунта», но быстрый Google выводит некоторую хорошую информацию. Tim B James

Ваш Ответ

8   ответов
0

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

Как уже говорили другие, вы можете достичь этого с помощью 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".
В 99% случаев это единственный правильный ответ. У Джона Скита может быть больше поклонников, и он прав, говоря, чтоCultureInfo/NumberFormatInfo модель не является оптимальной (по меньшей мере), но в этом случае его ответ просто не является наиболее подходящим. Кстати, я изначально создал новыйCultureInfo объект на основе текущей культуры только для изменения символа валюты (так что вы можете сделать это тоже), но клонирование толькоNumberFormatInfo объект определенно лучше.
0

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

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

Вы можете установить его для всего запроса или указать язык при форматировании. В любом случае, я бы предложил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; такой набор культур значительно упрощает чтение кода, использующего его, и вам не нужно правильно интерпретировать строку в нескольких местах.

@golergka: это просто синтаксис бритвы, сообщающий нам, что цена - это переменная c #, а не разметка html.
Я согласен, это, по меньшей мере, неудобно (я думаю, что форматирование валюты является темой глобализации, которая смущает большинство людей). К счастью, есть сторонние библиотеки, такие какNMoneys которые делают это хорошо.
@ Клафу: Иногда он выбрасывает ребенка с водой; иногда это правильно. Я согласен, что это сложная тема. Это боль (IMO), что существует «формат валюты» которая включает в себя валюту, а не «деньги»; введите сумму и валюту, которые затем можно отформатировать в соответствии с местной культурой.
@golergka: Просто потому, что в этом вопросе. Я не знаю достаточно о бритве, чтобы точно сказать, нужна она или нет - она не будет в пределах нормального C #.
Жесткое кодирование CultureInfo для получения определенного символа валюты - это выбросить ребенка с водой из ванны. Кроме того, нет гарантии, что определенный CultureInfo сохранит символ валюты, который вы ожидаете получить. Но главная проблема заключается в том, что вы вводите ошибку глобализации, теряя адекватное форматирование культуры (десятичный символ, расположение символа валюты). Пожалуйста, смотрите мой ответ для объяснения.
11

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

@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

3

Для бритвы вы можете использовать: культура, ценность

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

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

Я бы предложил уменьшить ответ на заданный вопрос. Хотя это может быть правильно, только около 10% ответов связано с вопросом. Кроме того, я также думаю, что плакат уже использует правильный формат, но имеет некоторые проблемы с локалью. Так что этот ответ не очень полезен
29

@String.Format(new CultureInfo("en-US"), "{0:C}", @price)
тип или пространство имен «cultureInfo»; не может быть найден...

Похожие вопросы