Convert.ToDouble( "4089.90" ) выводит 40.899,00, почему?

Я занимаюсь разработкой программного обеспечения, в котором используется точность чисел, но у меня возникла эта проблема. Бывает, что когда я беру строку для преобразования, чтобы удвоить ее, я получаю другую культуру.

Например я использую

Convert.ToDouble("4089.90"); // it outputs 40.899,00

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

Convert.ToDouble("4089.90", System.Globalization.CultureInfo.InvariantCulture);

Но в программе много кода, использующего "Convert.ToDouble", и я не хотел бы менять все это, с другой стороны, я хочу понять, почему это происходит.

Ответ 1

Вы можете установить культуру для своего потока с помощью:

Thread.CurrentThread.CurrentCulture = 
       System.Globalization.CultureInfo.InvariantCulture;

Ответ 2

Вы не говорите, где вы находитесь, но результат соответствует текущей культуре, которая имеет ".". как разделитель тысяч и десятичная запятая, а не десятичная точка.

Однако вы утверждаете, что культура такая же, что противоречит этому. Вы или клиент изменили (или настроили) "Стандарты и форматы" на региональные и языковые параметры? Если настройка была настроена, она по-прежнему будет считаться "английским (Великобритания)" (или где бы то ни было), но приведет к разным результатам по умолчанию.

Ответ 3

Я не знаю ни С#, ни asp.net, но я думаю, что проблема такова: вы выполняете операцию в культуре, где точка . является разделителем тысяч, а не десятичным разделителем. Сам вывод, который вы цитируете, является доказательством: 40.899,00.

В какой культуре/регионе вы работаете?

Ответ 4

Культура может быть основана на том, где работает приложение ASP.Net, а не на клиентском ПК, на котором запущен браузер. Хотя их настольный ПК может иметь аналогичные настройки культуры, сервер может отличаться.

Ответ 5

Это ваш компьютер, который не дает правильного ответа, а не своего. В вашей культуре указано, что "4089.90" совпадает с 4089900, поскольку точка (.) Используется для разделения тысяч (и, следовательно, должно быть три цифры после точки).

Похоже, вы хотите использовать точку в качестве разделителя с десятичной запятой, в отличие от настроек вашей культуры; поэтому у вас есть, чтобы использовать System.Globalization.CultureInfo.InvariantCulture в вашей программе. К сожалению.

Ответ 6

На самом деле очень редко это поведение приводит к тому, что все машины имеют одинаковые настройки культуры, однако я считаю, что лучшим решением было бы изменить файл web.config следующим образом:

configuration>
  <system.web>
    <globalization culture = "es-HN" />
  </system.web>
</configuration

И примените настройки для всего приложения.

Спасибо всем за помощь.

Ответ 7

Хотя решение dkantowitz может быть самым простым для быстрого исправления, вы должны действительно рассмотреть возможность передачи аргумента IFormatProvider (как во втором фрагменте) по причинам, указанным в http://msdn.microsoft.com/en-us/library/ms182190(VS.80).aspx.

Эти проблемы легко избежать, включив анализ статических кодов с самого начала. Если ваш Visual Studio SKU не предлагает эту функцию, вы можете перейти на FxCop - бесплатную версию.

Вернемся к предлагаемому решению, вы должны принять во внимание, что любой код может изменить поток CurrentCulture в любое время и в зависимости от размера вашей базы кода и количества людей на нем, вы можете попасть в ситуацию различного часть настройки кода Thread.CurrentCulture для другого значения, чтобы исправить свою проблему, запуская ваши.