如何让所有文化都避免使用CultureNotFoundException

时间:2013-04-12 09:30:15

标签: c# c#-4.0 currency cultureinfo culture

伙计我正在开发一个可以在多台机器上运行的应用程序。我最近在其中引入了Cultures来支持所有货币。

我有两台主要的开发PC,我在它们之间移动代码。一个是Windows 8笔记本电脑,另一个是Windows 7 PC。

这两台机器中的SpecificCultures列表似乎相同。当可执行文件在Windows 8上运行时,会返回几个SpecificCultures,并且还会重命名一些现有的。{/ p>

我使用以下代码来文本文件转储所有特定文化:

StringBuilder sb = new StringBuilder();

foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{
    sb.Append(ci.Name + "\t" + new RegionInfo(ci.LCID).CurrencyEnglishName);
    sb.AppendLine();
}

StreamWriter f = new StreamWriter(@"specificCulturesFound.txt");
f.Write(sb);
f.Close();

我的Windows 8笔记本电脑返回的SpecificCultures是:http://pastebin.com/cznLRG62 从我的Windows 7 PC返回的SpecificCultures是:http://pastebin.com/MwMXwSdb

如果你在Notepad ++中比较它们,你会发现不同之处。

例如:例如,et-EE Estonian Kroon条目仅适用于我的Windows 7 PC,而ku-Arab-IQ Iraqi Dinar仅适用于Windows 8笔记本电脑

问题是,我该如何处理这种情况?应用程序发布后,它将在具有不同.NET框架版本的不同计算机上运行。

有没有办法可以使用应用程序导出所有收集的CultureInfo数据,以便可以使用它而不是从已安装的.NET框架中获取它?

1 个答案:

答案 0 :(得分:0)

这并非易事,在正常情况下您的应用程序不应该意识到不同文化之间的差异,应该注意的是存在差异。

这通常是将所有内容保存在中立文化(例如,en-US语言环境),然后转换回用户的特定区域设置应用程序运行例如,如果用户输入日期值列表,您要保存它们的方法是将每个日期转换为其中性表示并使用列表分隔符连接它们(使用中性文化,您可以这样做,因为您可以获得当前用户的区域设置,你知道中性的)。稍后,在另一台具有不同语言环境的计算机上,其他人将读取该文件,您的应用程序知道该日期处于中性文化,然后它可以读取它们并以必需的格式将它们呈现给用户。例如:

  • it-IT区域设置的用户输入两个日期:01/01/1960;25/12/2013
  • 应用程序将其存储为中性en-US格式:01/01/1977,12/25/2013
  • 另一位jp-JP区域设置的用户会阅读它,应用程序将读取中性区域设置,并将1977/01/01・2013/12/25显示给用户。

当这些数据不固定时,情况会变得更加复杂,例如货币。在这种情况下,您不能简单地转换为中性值,让我们想象一下(值非常随机):

  • 用户输入一个值,比方说1000日元。
  • YEN转换为DOLLARS(想象100 YEN = 1 DOLLAR):10 DOLLARS并保存。
  • 将在欧洲其他使用欧元的国家/地区读取数据,应用程序读取10美元,然后将其转换为10欧元。

这是错误的当然是因为:

  • 更改YEN< - > DOLLARS可能会从您编写它的那天起以及在EURO中读取的那天更改。
  • 更改YEN< - > EURO不等于YEN< - >美元< - > EURO。

这不是一个简单的解决问题,您只能通过CultureInfo依靠“自动”转换,但您必须自己实现(以最适合您的要求的方式)。例如(非常天真,当然)实现可以存储这样的货币:

struct CurrencyValue
{
    public decimal Value;
    public string Currency;
}

根据需要,这可能很复杂(例如,使用类层次结构而不是货币而不是字符串),但请记住,这种转换绝对不是一件容易的事。

总结

不关心此转换,只需使用中性语言环境存储所有内容,并在用户计算机中进行转换(往返)(您无需关心正在使用的语言环境)。

如果您必须管理特殊类型之类的货币,那么您必须实施自己的库以正确的方式处理它们。 “正确的方法”取决于您的完整申请要求,因此无法在此处回答。