int.TryParse по сравнению с другими методами определения того, содержит ли char значение int

При использовании типа данных char есть ли причина использовать int.TryParse

int.TryParse(inputChar.ToString(), NumberStyles.Integer, 
                             CultureInfo.InvariantCulture, out curNum)

vs.

inputChar - '0'

И проверить, находится ли результат между 0-9?


person Yakov    schedule 26.02.2014    source источник
comment
Не могли бы вы уточнить вопрос - как он читается, очень сложно понять, о чем спрашивают.   -  person Charleh    schedule 26.02.2014
comment
А как насчет того, что у вас не char, а строка, содержащая значение "192384"? Как бы вы вычесть 0? Кроме того, хотя это может работать в нашей культурной среде, особенность разных культур и наборов символов заключается в том, что код символа для 0 не во всех случаях может быть меньше, чем код символа любого другого числа.   -  person Thorsten Dittmar    schedule 26.02.2014
comment
Ага, понятно. Вы говорите о случае, когда это только один char, а не строка.   -  person Martin Smith    schedule 26.02.2014
comment
Что непонятного в вопросе? ОП спрашивает, почему он должен использовать стандартную библиотечную функцию для анализа целого числа, а не выполнять собственное преобразование обычным хакерским способом. Это может считаться не по теме для SO, но что в этом неясного?   -  person Luaan    schedule 26.02.2014


Ответы (3)


Если вы хотите проверить, является ли char цифрой, используйте Char.IsDigit:

if (Char.IsDigit(inputChar))
{ 
    // ...
}
person Tim Schmelter    schedule 26.02.2014
comment
Похоже, что это включает дополнительные символы Юникода за пределами Ascii 0-9, поэтому я полагаю, это зависит от того, для чего это требуется OP. - person Martin Smith; 26.02.2014
comment
@MartinSmith: обычно он просто проверяет c >= '0' && c <= '9' с помощью latin- 1. - person Tim Schmelter; 26.02.2014
comment
Char.IsDigit('۵') верно, например. Не проверял, является ли это той же семантикой, что и int.parse, показанная в вопросе. - person Martin Smith; 26.02.2014
comment
@MartinSmith: я предполагаю, что если вам нужно возиться с такими символами, вам также нужно, чтобы это была цифра / число. Так что либо это не имеет значения, потому что вы их не используете, либо было бы неправильно проверять только c >= '0' && c <= '9'. - person Tim Schmelter; 26.02.2014
comment
@MartinSmith: кстати, поскольку я просмотрел подход с регулярными выражениями, который вы указали в другом ответе, интересно, что он возвращает тот же список из 310 символов, что и Char.IsDigit. - person Tim Schmelter; 26.02.2014
comment
И похоже, что это не то же самое, что принято [Try]Parse, если я не пропустил какой-то вариант? например int.Parse("3", NumberStyles.Any, CultureInfo.InvariantCulture) возвращает ошибку, а не 3. - person Martin Smith; 26.02.2014

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

  1. Использование хорошо протестированной библиотечной функции всегда лучше, чем заново изобретать велосипед.
  2. В мире за пределами США не используется «ASCII», поэтому могут быть случаи, когда код символа для 0 не является наименьшим для цифры. В таком случае '9' - '0' != 9;. Это может быть. А поскольку мне лень гуглить, я на всякий случай использую TryParse :-)
person Thorsten Dittmar    schedule 26.02.2014
comment
@MartinSmith Интересно: как это может быть, что за принятый ответ на вопрос, который вы цитируете, проголосовали 1068 раз, но человек, написавший ответ, имеет только 6371 репутацию? - person Thorsten Dittmar; 26.02.2014
comment
Репс колпачок. Вероятно, многие из этих 1000 голосов пришлись на одни и те же несколько дней. - person Martin Smith; 26.02.2014
comment
О, видите? Я этого не знал. Это позор, правда. Предположим, что сегодня я отвечу на 5 вопросов, и за каждый ответ сегодня проголосуют 10 раз, но я все равно получу только 200 баллов... Что ж, скорее всего, это широко обсуждалось в мете ;-) - person Thorsten Dittmar; 26.02.2014

Речь идет только о ясности кода. int.TryParse четко указывает свое намерение - я хочу проанализировать строку как число, если это возможно. Это относительно быстро и безопасно.

Если вы обнаружите, что застряли на TryParses, вы всегда можете написать свой собственный синтаксический анализ. В некоторых случаях это может сэкономить значительное количество времени. Например, я сделал такую ​​реализацию при синтаксическом анализе DBF, что в противном случае вызывало много накладных расходов при синтаксическом анализе байтов в строки и строк в целые числа. Непосредственное преобразование из потока в целое сэкономило много времени и ресурсов.

В конце концов, если вы не хотите использовать встроенные методы, зачем вообще использовать .NET? Почему бы не написать все в машинном коде? :))

person Luaan    schedule 26.02.2014
comment
Теперь, когда вопрос прояснился, я хочу и могу удалить свои комментарии :-) - person Thorsten Dittmar; 26.02.2014