Короткая и сладкая версия:
На одной машине приблизительно из ста тестовых десятичных чисел машин. TryParse () преобразовывает "1.01" в 0,01
Хорошо, это собирается звучать сумасшедшим, но терпеть меня...
У нас есть клиентские приложения, который общается с веб-сервисом через JSON, и тот сервис возвращает десятичное значение как строку, таким образом, мы храним его как строку в нашем объекте модели:
[DataMember(Name = "value")]
public string Value { get; set; }
Когда мы отображаем то значение на экране, это отформатировано к определенному количеству десятичных разрядов. Таким образом, процесс, который мы используем, является строкой-> десятичное число затем десятичное число-> строка.
Приложение в настоящее время подвергается заключительному тестированию и работает больше чем на 100 машинах, где это все хорошо работает. Однако на одной машине, если десятичное значение имеет продвижение '1' затем, оно заменяется нулем. Я добавил простой вход к коду, таким образом, он похож на это:
Log("Original string value: {0}", value);
decimal val;
if (decimal.TryParse(value, out val))
{
Log("Parsed decimal value: {0}", val);
string output = val.ToString(format, CultureInfo.InvariantCulture.NumberFormat);
Log("Formatted string value: {0}", output);
return output;
}
На моей машине - любой любой клиентской машине - вывод файла журнала:
- Значение исходной строки: 1.010000
- Проанализированное десятичное значение: 1.010000
- Значение отформатированной строки: 1.01
На дефектной машине вывод:
- Значение исходной строки: 1.010000
- Проанализированное десятичное значение: 0.010000
- Значение отформатированной строки: 0.01
Таким образом, казалось бы что десятичное число. Метод TryParse виновным.
Вещи мы попробовали:
Кто-либо видел что-нибудь как это или имеет какие-либо предложения? У меня быстро заканчиваются идеи...
В то время как я вводил это, еще некоторая информация вошла: Передача строкового значения "10 000" для Преобразования. ToInt32 () возвращается 0, так, чтобы также, казалось, отбрасывал продвижение 1.
Дальнейшие тесты на основе комментариев:
Таким образом, казалось бы, что это только влияет на 1 с и только если они - первый символ строки. Очень нечетный, но по крайней мере это последовательно.
Я могу воспроизвести ваши результаты. Рассмотрим:
public NumberFormatInfo OneIsPositiveSignFormat()
{
NumberFormatInfo custom = new NumberFormatInfo();
custom.PositiveSign = "1";
return custom;
}
И далее:
if (decimal.TryParse(value, NumberStyles.Number, OneIsPositiveSignFormat(), out val))
Дело в том, что..: Региональные настройки не показывают вам текущий положительный знак, а главное: вы не установили культуру при разборе числа.
Значение может прийти из разных мест:
оно могло прийти из реестра как системное значение по умолчанию, или значение по умолчанию могло быть установлено кодом:
CultureInfo customCulture = (CultureInfo)CultureInfo.InvariantCulture.Clone();
customCulture.NumberFormat = OneIsPositiveSignFormat();
Thread.CurrentThread.CurrentCulture = customCulture;
посмотрите, как заданы региональные настройки для этого компьютера, может быть, что "." устанавливается как разделитель тысяч, а не как десятичный разделитель. Попробуйте использовать Decimal.TryParse (String, NumberStyles, IFormatProvider, out Decimal val) и передать NumberFormatInfo, созданное с десятичным разделителем "."