3

Windows8開発ボックスで奇妙な問題が発生しています。次のコード行は、Kenticoを実行しているASP .NETアプリケーションとコンソールアプリケーション(両方とも.NET 4.0で実行されている)を比較すると、NumberFormat.NumberDecimalSeparatorに2つの異なる値をもたらします。

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

セパレータの値:

  1. Kenticoアプリケーション: "、"<-コンマ
  2. コンソールアプリケーション:「。」<-期間

私の地域設定の正しい出力は期間です。

これはどのように可能ですか?10進数のフォーマットの問題を最初に見つけたとき、それはKenticoのバグである可能性があると思いましたが、このテストはそうではないことを示しています。特定のロケールのCultureInfoの新しいインスタンスが、アプリケーション間で異なるインスタンスを返す可能性はありますか?

4

2 に答える 2

10

Jason Evansのコメントは、私を正しい方向に向けました。彼が投稿したリンクを参照してください:ASP.NETアプリケーションは地域の設定を反映していません

地域の設定は、Windowsのユーザーごとに保存されていることがわかります。これは私が知っておくべきことです。私自身として実行するようにアプリケーションプールを更新すると、両方のアプリケーションで同じ結果が得られました。

公平を期すために、まだ混乱しているのは、ネットワークサービス(アプリケーションプールが実行されていたアカウント)が誤った値を持つようになった方法です。どうすればそれを修正できるかさえわかりません。

編集:

予約済みアカウントの地域設定を更新する必要がある場合。2つのオプションがあります。

  1. [コントロールパネル]>[地域の設定]>[管理]タブをクリックし、[設定のコピー]を選択します。起動した画面で、「ようこそ画面とシステムアカウント」にチェックを入れてください。古いバージョンのWindowsも似ていると思います。
  2. 勇敢な人のために。レジストリ:HKEY_USERS>SID...>コントロールパネル>インターナショナル。ネットワークサービスのセキュリティ識別子は、SID:S-1-5-20です。

設定を有効にするには、アプリケーションプールを再起動してください。

于 2013-01-14T17:18:37.983 に答える
2

編集:これは問題ではなかったことに注意してください-しかし、他の場合には問題になる可能性があるので、後世のためにここに残しておきます。

コンソールアプリケーションが.NET4.0で実行されていないことを強く疑っています。ただし、それを使用して確認するのは簡単Environment.Versionです。短いコンソールアプリと、2つの異なるバージョンのフレームワークによる結果を次に示します。

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 に答える