0

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

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

似乎SpecificCultures这两台机器中的列表一样。当可执行文件在 Windows 8 上运行时,SpecificCultures会返回更多文件,并且还会重命名一些现有文件。

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

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();

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

如果您在 Notepad++ 或其他工具中比较它们,您会发现差异。

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

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

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

4

1 回答 1

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 日元。
  • 日元兑换成美元(假设 100 日元 = 1 美元):10 美元并保存它。
  • 数据将在另一个使用欧元的欧洲国家/地区读取,应用程序读取 10 美元,然后将其转换为 10 欧元。

这当然是错误的,因为:

  • 更改 YEN <-> DOLLARS 可能会从您编写它的那一天开始更改,并以欧元读取它。
  • 更改 YEN <-> EURO 不等于 YEN <-> DOLLARS <-> EURO。

这不是一个容易解决的问题,您根本不能依靠“自动”转换,CultureInfo但您必须自己实现(以最适合您要求的方式)。例如(当然非常幼稚)实现可能会像这样存储货币:

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

这可能会根据需要变得复杂(例如,使用类层次结构而不是货币而不是字符串),但请记住,这种转换绝对不是微不足道的。

总结

不要关心这种转换,只需使用中性语言环境存储所有内容,并且转换(到和从)将发生在用户计算机中(您不需要关心正在使用哪个语言环境)。

如果您必须管理像货币这样的特殊类型,那么您必须实现自己的库来以正确的方式处理它们。什么是“正确方式”取决于您的完整应用程序要求,因此无法在这里回答。

于 2013-04-12T09:59:54.370 回答