我有这条线
@String.Format("{0:C}", @price)
在我看来。我希望它在价格前显示一个美元符号,而是显示一个英镑符号。我如何实现这一目标?
我有这条线
@String.Format("{0:C}", @price)
在我看来。我希望它在价格前显示一个美元符号,而是显示一个英镑符号。我如何实现这一目标?
我强烈怀疑问题仅仅是处理请求的线程的当前文化设置不正确。
您可以为整个请求设置它,也可以在格式化时指定文化。无论哪种方式,我都建议不要使用string.Format
复合格式,除非你真的有不止一个东西要格式化(或更广泛的信息)。相反,我会使用:
@price.ToString("C", culture)
它只是让它更简单一些。
编辑:鉴于您的评论,听起来您可能很想使用英国文化,而不管用户的文化如何。再说一遍,要么将 UK 文化设置为整个请求的线程文化,要么可能引入您自己的带有“常量”的助手类:
public static class Cultures
{
public static readonly CultureInfo UnitedKingdom =
CultureInfo.GetCultureInfo("en-GB");
}
然后:
@price.ToString("C", Cultures.UnitedKingdom)
根据我的经验,拥有这样的“命名”文化集会使使用它的代码更易于阅读,并且您不需要在多个位置正确获取字符串。
正如其他人所说,您可以通过 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".
您需要提供一个 IFormatProvider:
@String.Format(new CultureInfo("en-US"), "{0:C}", @price)
我个人反对使用特定于文化的代码,我建议这样做:
@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
对于剃须刀,您可以使用:文化、价值
@String.Format(new CultureInfo("sv-SE"), @Model.value)
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();
使用它就可以了,而且很简单:
var price=22.5m;
Console.WriteLine(
"the price: {0}",price.ToString("C", new System.Globalization.CultureInfo("en-US")));
对于那些使用 C# 6.0 字符串插值语法的人:例如:$"The price is {price:C}"
,文档建议了几种应用不同 a 的方法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