Двоичная строка в целое
У меня есть двоичная строка, введенная пользователем, которую мне нужно преобразовать в целое число.
Сначала я наивно использовал эту простую строку:
Convert.ToInt32("11011",2);
К сожалению, это вызывает исключение, если пользователь вводит целое число напрямую.
Convert.ToInt32("123",2); // throws Exception
Как я могу убедиться, что строка, введенная пользователем, фактически является двоичной строкой?
- try..catch.... но это просто слишком уродливо.
- возможно, что-то вроде "Int32.TryParse".
Спасибо
Ответы
Ответ 1
Вы можете использовать Regex
, чтобы проверить, что это "^ [01] + $" (или лучше, "^ [01] {1,32} $" ), а затем используйте Convert
?
Конечно, исключения вряд ли будут огромной проблемой! Безвкусный? может быть. Но они работают.
Пример (отформатирован для вертикального пространства):
static readonly Regex binary = new Regex("^[01]{1,32}$", RegexOptions.Compiled);
static void Main() {
Test("");
Test("01101");
Test("123");
Test("0110101101010110101010101010001010100011010100101010");
}
static void Test(string s) {
if (binary.IsMatch(s)) {
Console.WriteLine(Convert.ToInt32(s, 2));
} else {
Console.WriteLine("invalid: " + s);
}
}
Ответ 2
Спасибо за отличный и невероятно быстрый ответ!
К сожалению, мои требования изменились. Теперь пользователь может в значительной степени ввести любой формат. Двоичные, десятичные, шестнадцатеричные Поэтому я решил попробовать - catch просто предоставляет самое простое и чистое решение.
Так что просто для большей пользы я публикую код, который я сейчас использую. Я думаю, что это довольно ясно и даже несколько элегантно, или я так думаю ^^.
switch (format)
{
case VariableFormat.Binary:
try
{
result = Convert.ToInt64(value, 2)
}
catch
{
// error handling
}
break;
case VariableFormat.Decimal:
try
{
result = Convert.ToInt64(value, 10)
}
catch
{
// error handling
}
break;
case VariableFormat.Hexadecimal:
try
{
result = Convert.ToInt64(value, 16)
}
catch
{
// error handling
}
break;
}
Так что спасибо, что побудили меня использовать try - catch, я думаю, что это действительно улучшило читабельность моего кода.
Спасибо