二进制字符串到整数

发布于 2024-07-30 11:49:51 字数 343 浏览 2 评论 0原文

我有一个由用户输入的二进制字符串,我需要将其转换为整数。

起初,我天真地使用了这个简单的行:

Convert.ToInt32("11011",2);

不幸的是,如果用户直接输入整数,这会引发异常。

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

如何确保用户输入的字符串确实是二进制字符串?

  • try..catch
  • Int32.TryParse

谢谢

I have a binary string, entered by the user, which I need to convert to an integer.

At first, I naively used this simple line:

Convert.ToInt32("11011",2);

Unfortunately, this throws an exception if the user enters the integer directly.

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

How can I make sure that the string entered by the user actually is a binary string?

  • try..catch
  • Int32.TryParse

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

听你说爱我 2024-08-06 11:49:52

您可以使用 Regex 检查它是否为“^[01]+$”(或者更好的是“^[01]{1,32}$”),然后 使用转换

当然,无论如何,异常不太可能是一个大问题! 不优雅? 或许。 但它们有效。

示例(针对垂直空间格式化):

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);
    }
}

You could use a Regex to check that it is "^[01]+$" (or better, "^[01]{1,32}$"), and then use Convert?

of course, exceptions are unlikely to be a huge problem anyway! Inelegant? maybe. But they work.

Example (formatted for vertical space):

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);
    }
}
落叶缤纷 2024-08-06 11:49:52

感谢您的出色且快速的回答!

不幸的是,我的要求发生了变化。 现在用户几乎可以输入任何格式。 二进制、十进制、十六进制。 所以我决定 try - 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,我认为它确实提高了我代码的可读性。

谢谢

Thanks for the great and incredibly fast answer!

Unfortunately, my requirements changed. Now the user can pretty much enter any format. Binary, Decimal, Hex. So I decided try - catch just provides the simplest and cleanest solution.

So just for good measure I am posting the code I am using now. I think it is pretty clear and even somewhat elegant, or so I think^^.

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;
}

So thanks for encouraging me to use try - catch, I think it really improved the readibility of my code.

Thanks

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文