web-dev-qa-db-ja.com

バイナリ文字列から整数へ

ユーザーが入力したバイナリ文字列があり、整数に変換する必要があります。

最初、私はナイーブにこの単純な行を使用しました:

Convert.ToInt32("11011",2);

残念ながら、ユーザーが整数を直接入力すると、例外がスローされます。

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

ユーザーが入力した文字列が実際にバイナリ文字列であることを確認するにはどうすればよいですか?

  • try..catch ....しかし、それはあまりにも醜いです。
  • 「Int32.TryParse」のようなものかもしれません。

ありがとう

25
eric

Regexを使用して、 "^ [01] + $"(または、より良い、 "^ [01] {1,32} $")であることを確認できますthenConvert

もちろん例外はありそうにないとにかく大きな問題です!エレガンス?多分。しかし、彼らは働きます。

例(垂直スペース用にフォーマット済み):

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);
    }
}
29
Marc Gravell

素晴らしく信じられないほど速い答えをありがとう!

残念ながら私の要件は変わりました。これで、ユーザーはほとんどすべての形式を入力できます。 2進数、10進数、16進数。だから私は試してみることにしました-キャッチは最も単純でクリーンなソリューションを提供するだけです。

だからちょうど良い基準のために、私が今使っているコードを投稿しています。かなりクリアで、ややエレガントでもあると思います^^。

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の使用を勧めてくれてありがとう、コードの可読性が本当に向上したと思います。

ありがとう

4
eric