【问题标题】:Converting string to integer by selecting the elements to stay通过选择要保留的元素将字符串转换为整数
【发布时间】:2017-06-19 06:39:06
【问题描述】:

我必须消除所有特殊字符、字母并仅保留字符串中的数字并将其存储为整数。例如“67%!”或“$127a%”。我正在从串行端口获取数据,在某些情况下,$ 和 % 之间有字母/特殊字符,或者可能是 % 之后的数字。目前,我有这个sn-p

string UartInput = serialcom.ReadLine();
int[] ints = UartInput.Trim(new[] { '$', '%' }).Split(' ').Select(int.Parse).ToArray();

我做了一些必要的更改,一次只传输一个值。 sn-p 改为

int ints = Convert.ToInt16(serialcom.ReadLine().Trim(new[] { '$', '%' }))

不够用

【问题讨论】:

标签: c#


【解决方案1】:

这可能对你有用

string serialcomnum = Regex.Match(serialcom,"\\d+").ToString();
int ints = Convert.ToInt32(serialcomnum);

另一种可能是

string serialcom = "$67%!$127a%";
var serialcomnum = Regex.Replace(serialcom, @"[^0-9]+", ",");
serialcomnum = serialcomnum.TrimStart(',').TrimEnd(',');
int[] serialints = serialcomnum.Split(',').Select(int.Parse).ToArray();

【讨论】:

  • 哇。你能解释一下 \\d 部分吗?
  • \d 是数字(0-9 范围内的字符),+ 表示 1 次或多次。因此,\d+ 是 1 个或多个数字。 @Anand
  • 为什么不使用 Convert.ToInt32() 而使用 'ToInt16()'?
  • 顺便说一句,如果用户期望字符串中有多个整数,您的代码将不起作用。
  • @Ghasan 那是我添加的另一种方式。是的,让我把它改成 32 而不是 16
【解决方案2】:

可能一个简单的正则表达式是不使用其他字符串解析方法的最简单的解决方案

string input = "$67%!$127a%";
var matches = Regex.Matches(input, @"[0-9]+", RegexOptions.Compiled);
var result = matches.Cast<Match>()
                    .Select(x => Int32.Parse(x.Value)).ToArray();

foreach (int x in result)
    Console.WriteLine(x);

这里的示例要求输入字符串中有多个数字,并返回一个整数数组。如果不是这种情况(只需要一个整数),那么您可以将ToArray 替换为SingleOrDefault() 并将结果分配给一个整数变量。

另外,如果您的数字大于Int32.MaxValue,那么您应该将Int32.Parse 更改为Int64.Parse

【讨论】:

【解决方案3】:

还没有测试过,但我认为它可能有效

int result = Int32.Parse(string.Concat(yourStringVarible.ToCharArray().TakeWhile(char.IsNumber)));

编辑:

用于获取由其他字符包围的整数(也未测试):

public List<int> GetInts(string text){
 char[] chars = text.ToCharArray()
 bool prevIsNum = false;
 int startI = 0;
 int lenI = 0;
 List<int> ints = new List<int>();
 for(i=0;i<chars.length;i++){
    if(Char.IsNumber(chars[i])){
        if(prevIsNum){
            lenI ++;
        }else{
            startI = i;
            lenI ++;
        }
        prevIsNum = true;
    }else if(prevIsNum){
        prevIsNum = false;
        ints.add(Int32.Parse(string.Concat(chars.SubArray(startI,lenI)));
    }
 }
 return ints;
}

【讨论】:

  • 如果用户希望每个字符串有一个整数,这将起作用,但是,如果它可以包含多个,那么它将不起作用。
  • Where 而不是 TakeWhile 应该修复它。此外,ToCharArray 不是必需的,Where(以及 TakeWhile 也是)需要IEnumerable,字符串为IEnumerable。您将需要检查不包含数字的字符串,因为Int32.Parse 将抛出空字符串
猜你喜欢
  • 2018-06-15
  • 2015-01-04
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 2014-10-15
  • 1970-01-01
  • 2015-08-02
  • 1970-01-01
相关资源
最近更新 更多