【问题标题】:CultureInfo result in visual studio is different between windows 8 and windows 10Visual Studio 中的 CultureInfo 结果在 windows 8 和 windows 10 之间是不同的
【发布时间】:2017-03-17 10:30:39
【问题描述】:

我发现 CultureInfo 类返回的信息如数字格式在 Windows 8.1 和 10 中执行时不同。我创建了一个简单的控制台应用程序以符合下面给出的要求。在 Windows 8.1 中,转换结果为 2235。但在 Windows 10 中,结果为 0。我在这两种环境中都使用了 Visual Studio 2013。

        CultureInfo cultureInfo = new CultureInfo(3079);
        System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo;
        System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;

        string value = "2.235";
        decimal test;
        decimal.TryParse(value, NumberStyles.Any, cultureInfo, out test); 

如果您需要任何进一步的信息以提供清晰的图片,请告诉我。

问候 普拉塔普

【问题讨论】:

  • 结果不是 0 但TryParse 返回了false,因为它无法解析它。始终将TryParse 的结果存储在变量中(或使用if)。
  • 或者,当然,如果您总是希望它正常工作(但它没有),则只使用常规 Parse 来获取异常
  • @Malachi:即使您希望它工作并且不解析是例外,最好使用TryParse。然后你可以决定是抛出一个有意义的异常还是做其他事情。仅当您 100% 确定它有效时才使用 Parse
  • @TimSchmelter 基本上同意,因此“你总是期望它起作用”强调总是......我个人很草率,不会去 100%,但我不会继续记录并说别人不应该:)

标签: c# visual-studio-2013 windows-10 windows-8.1 cultureinfo


【解决方案1】:

这个

CultureInfo cultureInfo = new CultureInfo(3079);

一样
CultureInfo cultureInfo = new CultureInfo("de-AT");

这是奥地利文化。他们使用逗号作为小数分隔符,但使用空格作为千​​位分隔符(与使用 . 表示千位的德国人相反)。

所以这有效(为清楚起见附加,99,您可以将其删除):

string value = "2 235,99";
bool valid = decimal.TryParse(value, NumberStyles.Any, new CultureInfo("de-AT"), out test);

但这种格式不是:string value = "2.235,99"

所以它与你的操作系统版本无关。

请注意,您应该始终将TryParse(bool) 的结果存储在一个变量中,或者使用if...else 而不是使用返回的out 值来确定它是否可以被解析。甚至 0 也可能是一个有效值。

【讨论】:

  • 非常感谢您的解释。我的问题是当我在 Windows 8.1 中执行应用程序时,输出为 2235,在 Windows 10 中为 0。
  • 好吧,也许他们已经为奥地利更改了 windows 中的区域设置。也许你可以change it
  • 您能否解释一下使用 CultureInfocultureInfo = new CultureInfo(3079) 和 var testcultureinfo = CultureInfo.GetCultureInfo(3079) 的区别。因为在第一个选项中,我获得了本地计算机区域设置配置。但是当我使用 GetCultureInfor 函数时,它会给出不同的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多