Значения CultureInfo различаются для разных приложений. Это ошибка?

У меня странная проблема, возникающая на моем компьютере с Windows 8 dev. Следующая строка кода приводит к двум различным значениям для NumberFormat.NumberDecimalSeparator при сравнении приложения ASP .NET, на котором выполняется Kentico, и консольного приложения (оба работают на.NET 4.0).

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

Значение разделителя:

  1. Приложение Kentico: "," <- запятая
  2. Консольное приложение: "." <- период

Правильный вывод для моих региональных настроек - точка.

Как это возможно? Когда я впервые обнаружил проблему с форматированием десятичных чисел, я подумал, что это может быть ошибка Kentico, однако этот тест указывает на обратное. Как это возможно, что новый экземпляр CultureInfo для конкретной локали возвращает экземпляр, который отличается в разных приложениях?

2 ответа

Решение

Комментарий Jason Evans указал мне верное направление. Смотрите ссылку, которую он разместил: приложение ASP.NET не отражает региональные настройки

Оказывается, региональные настройки хранятся на пользователя в Windows. Это то, что я должен был знать. Обновление пула приложений для запуска под моим именем привело к одинаковому результату в обоих приложениях.

Честно говоря, то, что до сих пор сбивает с толку, - это то, как Сетевая служба (учетная запись, под которой запускался пул приложений) получила неправильное значение. Я даже не уверен, как бы это исправить.

Редактировать:

Если вам нужно обновить региональные настройки для зарезервированных учетных записей. У вас есть два варианта.

  1. Панель управления> Региональные настройки> Откройте вкладку "Администрация" и выберите "Копировать настройки". На открывшемся экране убедитесь, что вы отметили "Экран приветствия и системные учетные записи". Старые версии Windows похожи, я верю.
  2. Для смелых. Реестр: HKEY_USERS > SID... > Панель управления> Международный. Идентификатор безопасности для сетевой службы: SID: S-1-5-20.

Убедитесь, что вы перезапустите пул приложений, чтобы настройки вступили в силу.

РЕДАКТИРОВАТЬ: Обратите внимание, что это не проблема - но в других случаях это может быть, поэтому я оставляю это здесь для потомков.

Я сильно подозреваю, что консольное приложение не работает на.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: .

Попробуйте этот код в обоих приложениях и посмотрите, какие версии они используют.

Другие вопросы по тегам