Ответ 1
Вы можете установить культуру для своего потока с помощью:
Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.InvariantCulture;
Я занимаюсь разработкой программного обеспечения, в котором используется точность чисел, но у меня возникла эта проблема. Бывает, что когда я беру строку для преобразования, чтобы удвоить ее, я получаю другую культуру.
Например я использую
Convert.ToDouble("4089.90"); // it outputs 40.899,00
Странно, но на моем компьютере все работает нормально, но на клиентском ПК (с той же культурой в региональных настройках) отображается последний вывод. Я знаю, что могу это исправить используя
Convert.ToDouble("4089.90", System.Globalization.CultureInfo.InvariantCulture);
Но в программе много кода, использующего "Convert.ToDouble", и я не хотел бы менять все это, с другой стороны, я хочу понять, почему это происходит.
Вы можете установить культуру для своего потока с помощью:
Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.InvariantCulture;
Вы не говорите, где вы находитесь, но результат соответствует текущей культуре, которая имеет ".". как разделитель тысяч и десятичная запятая, а не десятичная точка.
Однако вы утверждаете, что культура такая же, что противоречит этому. Вы или клиент изменили (или настроили) "Стандарты и форматы" на региональные и языковые параметры? Если настройка была настроена, она по-прежнему будет считаться "английским (Великобритания)" (или где бы то ни было), но приведет к разным результатам по умолчанию.
Я не знаю ни С#, ни asp.net, но я думаю, что проблема такова: вы выполняете операцию в культуре, где точка .
является разделителем тысяч, а не десятичным разделителем. Сам вывод, который вы цитируете, является доказательством: 40.899,00
.
В какой культуре/регионе вы работаете?
Культура может быть основана на том, где работает приложение ASP.Net, а не на клиентском ПК, на котором запущен браузер. Хотя их настольный ПК может иметь аналогичные настройки культуры, сервер может отличаться.
Это ваш компьютер, который не дает правильного ответа, а не своего. В вашей культуре указано, что "4089.90" совпадает с 4089900, поскольку точка (.) Используется для разделения тысяч (и, следовательно, должно быть три цифры после точки).
Похоже, вы хотите использовать точку в качестве разделителя с десятичной запятой, в отличие от настроек вашей культуры; поэтому у вас есть, чтобы использовать System.Globalization.CultureInfo.InvariantCulture
в вашей программе. К сожалению.
На самом деле очень редко это поведение приводит к тому, что все машины имеют одинаковые настройки культуры, однако я считаю, что лучшим решением было бы изменить файл web.config следующим образом:
configuration>
<system.web>
<globalization culture = "es-HN" />
</system.web>
</configuration
И примените настройки для всего приложения.
Спасибо всем за помощь.
Хотя решение dkantowitz может быть самым простым для быстрого исправления, вы должны действительно рассмотреть возможность передачи аргумента IFormatProvider (как во втором фрагменте) по причинам, указанным в http://msdn.microsoft.com/en-us/library/ms182190(VS.80).aspx.
Эти проблемы легко избежать, включив анализ статических кодов с самого начала. Если ваш Visual Studio SKU не предлагает эту функцию, вы можете перейти на FxCop - бесплатную версию.
Вернемся к предлагаемому решению, вы должны принять во внимание, что любой код может изменить поток CurrentCulture в любое время и в зависимости от размера вашей базы кода и количества людей на нем, вы можете попасть в ситуацию различного часть настройки кода Thread.CurrentCulture для другого значения, чтобы исправить свою проблему, запуская ваши.