C#中的字符串格式化到货币

5

我是ASP.NET网站开发的新手,现在想要展示肯尼亚先令的货币。肯尼亚先令的符号是KES。

以下是我的代码:

<span>
    <b>Price: </b><%#:String.Format(new System.Globalization.CultureInfo("sw-KE"), "{0:c}", Item.BeatPrice)%> 
</span>

http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.80%29.aspx获取的文化名称。
然而,价格显示为S3,000而不是KES 3,000
我需要做什么才能正确格式化价格?

如果您查看所选择的区域设置的货币符号,它被列为"S",所以除非有一个大错误,这是正确的格式。 - Steve
1
货币符号和货币代码是有区别的。同样的,你可以问为什么可以写成USD 12和$12或GBP 12和£12。 - Ondrej Svejdar
@Steve,货币符号“S”不正确。我住在肯尼亚,货币的写法要么是“KES”,要么是“Ksh”(请参见Ondrej Svejdar的评论),从未是“S”。 - Kinyanjui Kamau
6个回答

4
如果格式不符合您的预期,您可以添加自定义字符串格式:
String.Format("KES {0:N3}", Item.BeatPrice)

希望这能起作用。

感谢快速回复。为什么格式不符合预期?我已经尝试过许多其他国家的货币,都没有出现问题。 - Kinyanjui Kamau
非常奇怪:我使用.NET 4.5.1,在测试后它给了我“KSh”。 - Michael Mairegger
因为由于某种原因,Windows 将 System.Globalization.CultureInfo.GetCultureInfo("sw-KE").NumberFormat.CurrencySymbol 定义为 S - hometoast
@xxMUROxx。我也在使用.NET 4.5.1和VS 2013,但遇到了S问题。 - Kinyanjui Kamau
这很奇怪。 - Michael Mairegger

3
最好不要硬编码货币符号,你应该使用
var regionInfo = new RegionInfo("sw-KE");
var currencySymbol = regionInfo.ISOCurrencySymbol;

为了获取符合您文化的正确货币符号。 //编辑: 或者您可以尝试这个函数:
public static string FormatCurrency(decimal value)
{
    CultureInfo cultureInfo = Thread.CurrentThread.CurrentUICulture;
    RegionInfo regionInfo = new RegionInfo(cultureInfo.LCID);
    string formattedCurrency = String.Format("{0} {1:C}", regionInfo.ISOCurrencySymbol, value);
    return formattedCurrency.Replace(cultureInfo.NumberFormat.CurrencySymbol, String.Empty).Trim();

}

根据当前的UICulture,它可以为您提供格式化的货币字符串。

1
如果您的计算机的区域设置正确,则可以使用以下内容:
Console.WriteLine(string.Format(CultureInfo.InvariantCulture, "{0:c}", Item.BeatPrice));

它会根据您的计算机区域设置自动选择语言环境。

1

就像Ondrej Svejdar所说的那样,有两个符号,比如$和USD:

var region = new System.Globalization.RegionInfo("sw-KE");

Console.WriteLine(region.CurrencySymbol);  // "S"
Console.WriteLine(region.ISOCurrencySymbol);  // "KES"

注意:当我在IDEone上运行这个程序(使用Mono编译器),结果出乎意料(显示为“KES”和“肯尼亚先令”)。

1
使用String.Format中的“c”或“C”可以为指定的文化显示货币符号。您想要显示肯尼亚先令的货币ISO代码。下面的代码将显示您想要的内容。
String.Format("{0} {1}", (new RegionInfo("sw-KE")).ISOCurrencySymbol, Item.BeatPrice)

如果您不想改变应用程序的文化,有一个简单的方法可以做到这一点。
String.Format("{0} {1}", "KES", Item.BeatPrice)

0

最佳实践是将字符串格式化为货币格式{0:C},并将当前线程的UICulture或Culture更改为KES,ASP.NET足够智能,可以根据您当前的文化显示页面。

注意: 您可以通过更改浏览器的文化来更改文化(您可以出于开发目的这样做),但最佳实践是以编程方式更改文化,例如在此处,我根据用户Cookie更改文化,并且我的默认文化是en-us,如下所示。

protected override void InitializeCulture()
{
    HttpCookie cultureCookie = Request.Cookies["culture"];

    if (cultureCookie == null)
    {
        cultureCookie = new HttpCookie("culture", "en-US");
        Response.Cookies.Add(cultureCookie);
    }

    Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureCookie.Value);
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureCookie.Value);

    base.InitializeCulture();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接