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.