【问题标题】:How do I convert part of a string to int in C#? [duplicate]如何在 C# 中将字符串的一部分转换为 int? [复制]
【发布时间】:2014-01-15 03:58:06
【问题描述】:
static void Main(string[] args)
{
    string foo = "jason123x40";
    char[] foo2 = foo.ToCharArray();
    string foo3 = "";

    for (int i = 0; i < foo2.Length; i++)
    {
        int num = 0;
        Int32.TryParse(foo2[i].ToString(), out num);
        if (num != 0)
        {
            foo3 += num.ToString();
        }
    }
    Console.WriteLine(foo3);
    Console.ReadLine();
}

假设我有一个名为“john10smith250”的字符串。结果应该是“10250”。但是,我会用我的代码得到“125”。

我过滤掉 0 的原因是因为我不希望任何非数字字符被视为零。

有没有更好的方法将字符串的一部分转换为 int?

【问题讨论】:

  • 你明确计算'0',所以你不应该对你的结果中没有任何内容感到惊讶......另外,char.IsNumber(char) .您错误地使用了 TryParse。如果失败,则返回 false。

标签: c# string int


【解决方案1】:

使用 LINQ:

var myString = "john10smith250";
var myNumbers = myString.Where(x => char.IsDigit(x)).ToArray();
var myNewString = new String(myNumbers);

【讨论】:

  • 呃,x在哪里定义?我不太确定如何使用 LINQ。
  • @puretppc x 代表字符串中的每个字符
  • @puretppc,如果您问var x = blah 在哪里,则没有。它在x =&gt; 中声明并内联使用。它的范围仅在那些括号中。
  • @puretppc,如果你不知道 linq 和 lambda 语句,你应该学习。因为你看到它们很酷,它们可以让你免于大量工作:)
  • @puretppc 我不是效率方面的专家,但我认为这取决于你的情况。在你的情况下可能没关系。但在最大的列表上应该很重要。更少的代码会减少痛苦
【解决方案2】:

您有几个很好的解决方案可以改变方法并缩短您的代码。为了完整起见,以下是您如何使代码正常工作。

您的代码假定如果num 为零,则解析失败:

int num = 0;
Int32.TryParse(foo2[i].ToString(), out num);
if (num != 0) // This is wrong
{
    foo3 += num.ToString();
}

您需要像这样更改代码:

int num = 0;
if (Int32.TryParse(foo2[i].ToString(), out num))
{
    foo3 += num.ToString();
}

您的代码不起作用的原因是您忽略了TryParse 的返回值。如果解析失败,则返回false,如果解析成功,则返回true,即使被解析的数字为零。事实上,这就是 TryParse 采用 out 参数背后的原因(而不是像 Int32.Parse 那样直接返回值)。

【讨论】:

    【解决方案3】:

    您可以使用Regx解决它

    \d+ 是整数的regex

    所以

    string outputstring = Regex.Match(yourstring, @"\d+").Value;
    

    会给你那个数字作为一个字符串。然后Int32.Parse(outputstring) 会给你号码。

    或者你可以这样做

    遍历字符串并使用Char.IsDigit

    string a = "str123";
    string b = string.Empty;
    int val;
    for (int i=0; i< a.Length; i++)
    {
        if (Char.IsDigit(a[i]))
            b += a[i];
    }
    if (b.Length>0)
    {
        val = int.Parse(b);
    }
    

    【讨论】:

      【解决方案4】:

      使用:

      var str= "jason123x40";
      var number=  str.Where(x => char.IsDigit(x)).Select(x => x);
      

      【讨论】:

        【解决方案5】:

        非常接近你那里的东西......

        int parseNumbersFromString(string data)
        {
            string number = "";
        
            for(int i = 0; i < data.Length; ++i)
            {
                if(char.IsDigit(data[i]))
                    number += data[i];
            }
            return Convert.ToInt32(number);
        }
        

        【讨论】:

          【解决方案6】:

          *您可以使用索引来访问字符串中的字符
          *IsDigit 检查此字符是否为数字,如果条件为真,则将其附加到字符串 foo2

          string foo = "jason0123x40";
          string foo2 = "";
          
          for (int i = 0; i < foo.Length; i++)
          {
              if (char.IsDigit(foo[i]))
                  foo2 += foo[i];
          }
          Console.WriteLine(foo2);
          Console.ReadLine();
          

          【讨论】:

          • 你来晚了,不过还是谢谢你。 +1 :)
          • 没问题,我只是注意到您对 Lambda 表达式和 Linq 不熟悉,并试图为您提供更高效的替代方案。
          • 是的,我都考虑过。至少它有助于人们发现这个问题,以便他们可以尝试任何他们喜欢的问题。 :)
          【解决方案7】:

          您可以按如下方式使用正则表达式:

          string foo = "jason123x40";
          string foo3 = Regex.Replace(foo, @"\D", "");
          

          【讨论】:

            猜你喜欢
            • 2010-09-17
            • 1970-01-01
            • 2013-11-12
            • 2020-01-30
            • 2012-07-04
            • 2011-06-18
            • 2015-09-21
            • 2019-04-25
            • 1970-01-01
            相关资源
            最近更新 更多