десятичное число. TryParse () отбрасывания, ведущие “1”

Короткая и сладкая версия:

На одной машине приблизительно из ста тестовых десятичных чисел машин. 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 виновным.

Вещи мы попробовали:

  • Удаление и переустановка клиентского приложения
  • Удаление и переустановка .net 3.5 sp1
  • Сравнение региональных настроек дефектной машины для чисел (использующий английский язык (Соединенное Королевство)) к тем из рабочей машины - никакие различия.

Кто-либо видел что-нибудь как это или имеет какие-либо предложения? У меня быстро заканчиваются идеи...


В то время как я вводил это, еще некоторая информация вошла: Передача строкового значения "10 000" для Преобразования. ToInt32 () возвращается 0, так, чтобы также, казалось, отбрасывал продвижение 1.


Дальнейшие тесты на основе комментариев:

  • 1.01-> 0.01
  • 111.01-> 11.01
  • 123.01-> 23.01
  • 231.01-> 231.01
  • 01.01-> 1.01

Таким образом, казалось бы, что это только влияет на 1 с и только если они - первый символ строки. Очень нечетный, но по крайней мере это последовательно.

15
задан Martin Harris 30 March 2010 в 09:49
поделиться

2 ответа

Я могу воспроизвести ваши результаты. Рассмотрим:

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;
16
ответ дан 1 December 2019 в 04:27
поделиться

посмотрите, как заданы региональные настройки для этого компьютера, может быть, что "." устанавливается как разделитель тысяч, а не как десятичный разделитель. Попробуйте использовать Decimal.TryParse (String, NumberStyles, IFormatProvider, out Decimal val) и передать NumberFormatInfo, созданное с десятичным разделителем "."

-1
ответ дан 1 December 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: