3

我的 Windows 8 开发盒上出现了一个奇怪的问题。在比较运行 Kentico 的 ASP .NET 应用程序和控制台应用程序(均在 .NET 4.0 上运行)时,以下代码行会导致 NumberFormat.NumberDecimalSeparator 的两个不同值。

var culture = new System.Globalization.CultureInfo("en-ZA");
var separator = culture.NumberFormat.NumberDecimalSeparator;

分隔符的值:

  1. Kentico 应用程序:"," <- 逗号
  2. 控制台应用程序:“.” <-期间

我的区域设置的正确输出是句号。

这怎么可能?当我第一次发现十进制数字的格式问题时,我认为这可能是一个 Kentico 错误,但是这个测试表明并非如此。特定语言环境的 CultureInfo 的新实例如何返回在应用程序中不同的实例?

4

2 回答 2

10

Jason Evans 的评论为我指明了正确的方向。请参阅他发布的链接:ASP.NET 应用程序不反映区域设置

事实证明,区域设置是按用户存储在 Windows 中的。这是我应该意识到的。更新应用程序池以像我自己一样运行在两个应用程序中产生了相同的结果。

公平地说,仍然令人困惑的是网络服务(运行应用程序池的帐户)如何获得不正确的值。我什至不确定我会如何纠正它。

编辑:

如果您需要更新保留帐户的区域设置。你有两个选择。

  1. 控制面板 > 区域设置 > 单击管理选项卡,然后选择“复制设置”。在启动的屏幕上,确保选中“欢迎屏幕和系统帐户”。我相信旧版本的 Windows 是相似的。
  2. 为勇者。注册表:HKEY_USERS > SID... > 控制面板 > 国际。网络服务的安全标识符是:SID:S-1-5-20。

确保您重新启动应用程序池以使设置生效。

于 2013-01-14T17:18:37.983 回答
2

编辑:请注意,这不是问题 - 但在其他情况下可能是,所以我将它留在这里以供后代使用。

我强烈怀疑控制台应用程序没有在 .NET 4.0 上运行。虽然很容易验证使用Environment.Version。这是一个简短的控制台应用程序和两个不同版本的框架的结果:

using System;
using System.Globalization;

class Test
{
    static void Main()
    {
        CultureInfo culture = new System.Globalization.CultureInfo("en-ZA");
        string separator = culture.NumberFormat.NumberDecimalSeparator;
        Console.WriteLine("Version: {0}", Environment.Version);
        Console.WriteLine("Separator: {0}", separator);
    }
}

针对 .NET 4.5 编译:

Version: 4.0.30319.18010
Separator: ,

针对 .NET 2.0 编译:

Version: 2.0.50727.6400
Separator: .

在这两个应用程序中尝试此代码,并查看它们正在运行的版本。

于 2013-01-14T16:59:04.197 回答