2015-01-15 3 views
0

У меня странная ситуация, когда я использую API. Я получаю объект в JSON, который я deserialize. Этот объект содержит свойство строки, которое анализируется десятичным.Decimal.TryParse - отсутствует разделитель?

Для этого я использую этот код. Я живу в Польше, где десятичный разделитель «,», поэтому я использую метод replace.

string input ="160.00"; //value from API 

decimal result; 
decimal.TryParse(input.Replace('.',','), out result); 

Время от времени я получаю равные 16000 !! (Я полагаю, TryParse метод delete separator, он не определен). Как я могу предотвратить эту ситуацию? Могу ли я разобрать

+13

Вместо того, чтобы менять разделитель десятичных знаков, почему бы не указать культуру для вызова 'TryParse'? –

+0

Не могли бы вы написать пример кода? – Jacek

ответ

6

Номера должны быть сериализованы как InvariantCulture в любом случае, поэтому InvariantCulture для синтаксического анализа является хорошим началом. Кодирование сериализации номеров также должно быть проверено, следует ли это правило .

string input ="160.00"; 
decimal result = decimal.Parse(
    input, 
    System.Globalization.CultureInfo.InvariantCulture); 

Не сериализации числа как культуры инварианта является одним из наиболее распространенных источников проблем, как он работает на моей машине, я понятия не имею, почему он не на вашей ... ой вы говорите, ваша система находится в другой язык oops ;-)

+0

Даже большая компания, создающая очень сложное программное обеспечение для 3D-кэдов, имела эту ошибку в своей библиотеке. В нашей компании, где я использую английскую систему, все было в порядке, однако у клиента была немецкая система и пришлось переключать languguage, потому что не было другого способа запуска некоторых функций, поскольку они генерировали недопустимые файлы cad, и это было не для них исправить (без поддержки). – t3chb0t

+0

Если API возвращает разные значения в зависимости от культуры, это будет работать неправильно. Если API вернет 160,00, ваш код вернет 16000 для результата. Но если значение всегда с., Возможно, ваше решение лучше. – mybirthname

+0

Да, это правда. Вот почему я написал, чтобы проверить сериализацию, чтобы убедиться, что числа всегда находятся в формате _correct_. – t3chb0t

5

Вместо замены символа десятичной точки вы должны использовать правильную перегрузку TryParse метода, т.е. decimal.TryParse(String, NumberStyles, IFormatProvider, Decimal):

string input ="160.00"; 
NumberStyles style = NumberStyles.Number; 
decimal number = 0; 

CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US"); 
decimal.TryParse(input, style, culture, out number) 

Убедитесь, чтобы указать правильную культуру, которая подходит для вашего случая.