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
.