TryParse эквивалент преобразования с инвариантной культурой

в моем коде я часто использую следующие преобразования:

Convert.ToInt32(value, Cultureinfo.InvariantCulture);
Convert.ToDecimal(value, CultureInfo.InvariantCulture);

Теперь мне нравится использовать функции TryParse из-за недавних ошибок. Я не совсем уверен, правильно ли я использую следующие эквиваленты, поскольку я не полностью понимаю перечисление NumberStyles.

Int64.TryParse(value, NumberStyles.Any, CultureInfo.invariantCulture, out output);
Decimal.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out output);

редактировать ниже После ответов

следующий код должен быть правильной альтернативой:

Int64.TryParse(value, NumberStyles.Integer, CultureInfo.invariantCulture, out output);
Decimal.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out output);

3 ответов


вы можете прочитать о NumberStyles на документация. По сути, это позволяет указать, какой текст будет разбирать.

если вы хотите быть максимально гибкими, то NumberStyles.Any является "самым широким" вариантом.

Convert.ToInt32 эквивалентно использованию int.Parse и Convert.ToDecimal эквивалентно использованию decimal.Parse - они делегируют эти методы.

на документация на int.Parse по умолчанию NumberStyles.Integer. И в документация на decimal.Parse по умолчанию NumberStyles.Number. Если вы хотите быть в соответствии с поведением Convert.ToInt32 и Convert.ToDecimal, вы должны использовать эти значения.


на документация для Int64.Метод tryparse говорит NumberStyles.Integer по умолчанию:

параметр s интерпретируется с использованием NumberStyles.Целочисленный тип. В дополнение к десятичным цифрам допускаются только начальные и конечные пробелы вместе с ведущим знаком.

на Decimal.Метод tryparse, это NumberStyles.Number:

параметр s интерпретируется с использованием NumberStyles.Стиль номера. Это означает, что Белый разделители пространства и тысяч разрешены, но символы валюты-нет.


Да, ваш подход верен, оба подхода должны давать одинаковые результаты.

реализация Convert.ToInt32(string s) следующим образом:

public static int ToInt32(String value, IFormatProvider provider)
{
    if (value == null)
        return 0;
    return Int32.Parse(value, NumberStyles.Integer, provider);
 }

так как вы можете видеть, что внутри один метод вызывает другой-единственная разница в том, что с Convert у вас нет контроля над стилем номера-он жестко закодирован в NumberStyles.Integer. Если вы хотите идентичную функциональность, вы должны указать это значение перечисления в своих вызовах TryParse.

исходный код Convert класс доступен здесь.

могу я также отметить, что вы звоните Int64.TryParse если Convert.ToInt32 было достаточно тогда так должно быть Int32.TryParse.