字符串格式货币

Sac*_*nth 52 .net c# globalization

我有这条线

@String.Format("{0:C}", @price)
Run Code Online (Sandbox Code Playgroud)

在我的剃刀视图中.我希望它在价格前显示一个美元符号,但它显示一个英镑符号.我该如何实现这一目标?

Jon*_*eet 75

我强烈怀疑问题只是处理请求的线程的当前文化没有正确设置.

您可以为整个请求设置它,也可以在格式化时指定文化.无论哪种方式,我建议不要使用string.Format复合格式,除非你真的有多个格式(或更广泛的消息).相反,我会使用:

@price.ToString("C", culture)
Run Code Online (Sandbox Code Playgroud)

它只是使它更简单.

编辑:鉴于您的评论,听起来您可能想要使用英国文化,无论用户的文化.因此,要么将英国文化设置为整个请求的线程文化,要么可能引入自己的"常量"辅助类:

public static class Cultures
{
    public static readonly CultureInfo UnitedKingdom = 
        CultureInfo.GetCultureInfo("en-GB");
}
Run Code Online (Sandbox Code Playgroud)

然后:

@price.ToString("C", Cultures.UnitedKingdom)
Run Code Online (Sandbox Code Playgroud)

根据我的经验,拥有像这样的"命名"文化集使得使用它的代码相当简单易读,并且您不需要在多个位置获取字符串.

  • @Clafou:有时它会把婴儿扔出洗澡水; 有时这是正确的做法.我同意这是一个复杂的话题.这是一种痛苦(IMO),有一种"货币格式",其中包括货币,而不是存在金额和货币的"货币"类型,然后可以根据当地文化进行格式化. (3认同)
  • 为了获得某种货币符号而对一个CultureInfo进行硬编码就是用洗澡水将婴儿丢弃.此外,无法保证某个CultureInfo会保留您期望的货币符号.但主要问题是你通过失去足够的文化格式(小数符号,货币符号的定位)来引入全球化错误.请参阅我的答案以获得解释. (2认同)

Cla*_*fou 40

正如其他人所说,你可以通过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".
Run Code Online (Sandbox Code Playgroud)

  • 在 99% 的情况下,这是唯一正确的答案。Jon Skeet 可能有更多的粉丝,他正确地说“CultureInfo”/“NumberFormatInfo”模型不是最优的(至少可以这么说),但在这种情况下,他的答案根本不是最合适的。顺便说一句,我最初根据当前文化创建了一个新的“CultureInfo”对象,只是为了更改货币符号(因此您也可以这样做),但仅克隆“NumberFormatInfo”对象肯定会更好。 (3认同)

dtb*_*dtb 29

您需要提供IFormatProvider:

@String.Format(new CultureInfo("en-US"), "{0:C}", @price)
Run Code Online (Sandbox Code Playgroud)


Sam*_*nes 11

我个人反对使用特定文化的代码,我建议:

@String.Format(CultureInfo.CurrentCulture, "{0:C}", @price)
Run Code Online (Sandbox Code Playgroud)

并在您的web.config执行:

<system.web>
    <globalization culture="en-GB" uiCulture="en-US" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

其他信息:https: //msdn.microsoft.com/en-us/library/syy068tk(v = vs.90).aspx


Bha*_*tap 5

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();
Run Code Online (Sandbox Code Playgroud)

输出控制台屏幕: