Короткий и сладкий вариант:decimal.TryParse() падает ведущий «1»
На одной машине из около ста испытательных машин decimal.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
Так это что метод decimal.TryParse виноват.
Вещи, которые мы уже пробовали:
- Удаление и повторная установка клиентского приложения
- Удаление и повторная установка .NET 3.5 sp1
- Сравнение региональных параметров дефектной аппарата для чисел (с использованием английского языка (United Kingdom)) к работающим машинам - никаких различий.
Кто-нибудь видел что-нибудь подобное или имеет какие-либо предложения? Я быстро иссякают идеи ...
В то время как я печатал это еще некоторая информация пришла: Передача строковое значение «10000» для преобразования.ToInt32() возвращает 0, так что и, кажется, падение ведущих 1.
Дальнейшие тесты, основанные на комментарии:
- 1,01 -> 0,01
- 111,01 -> 11,01
- 123.01 -> 23,01
- 231,01 -> 231,01
- 01,01 -> 1,01
Таким образом, похоже, что это влияет только на 1 и только в том случае, если они являются первым символом строки. Очень странно, но, по крайней мере, это непротиворечиво.
Weird. Что происходит с другими цифрами типа «123» или «321»? –
Плохое ОЗУ в машине? Вы пытались запустить что-то вроде memtest86? –
Это действительно плохая идея, но если вы предварительно набрали нуль ...? – spender