Подтвердить что ты не робот

Двоичная строка в целое

У меня есть двоичная строка, введенная пользователем, которую мне нужно преобразовать в целое число.

Сначала я наивно использовал эту простую строку:

Convert.ToInt32("11011",2);

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

Convert.ToInt32("123",2); // throws Exception

Как я могу убедиться, что строка, введенная пользователем, фактически является двоичной строкой?

  • try..catch.... но это просто слишком уродливо.
  • возможно, что-то вроде "Int32.TryParse".

Спасибо

4b9b3361

Ответ 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, я думаю, что это действительно улучшило читабельность моего кода.

Спасибо