【问题标题】:C# how to read a two digit number from a string to a charC#如何从字符串读取两位数到字符
【发布时间】:2018-08-21 10:35:16
【问题描述】:

嗨,我知道这可能有点傻。但我需要将我的字符串转换为数字,因此我需要使用 char 来遍历运算符。但是,如果我尝试使用两位或更多位数的数字,则该数字会分解为个位数。例如。

string str="2+16-42X"

char[] ch=str.toCharArray();

输出为(忽略逗号)

2,+,1,6,-,4,2,X

我想得到2,+,16,-42,X 关于如何解决这个问题的任何建议?谢谢

【问题讨论】:

  • 那是因为 char = 1 byte ... 你不能在 char 上保存 '16' - 那将是一个字符串 ... 你可以在 char 上保存 16 作为 ascii 代码....
  • 您不能拥有char foo = '-42'char foo = '16'
  • 因此在您的示例中,您将减号 (-) 作为负数而不是运算符,但 + 是加法。你需要定义你的规则。
  • 你刚刚开始学习解析。不幸的是,这是一个需要涵盖的广泛主题,但这本质上就是你想要做的(虽然不知道艺术的话)。例如,将字符拆分为逻辑单元的这一位称为 tokenizing(或 lexing)(并且输出称为令牌)
  • 这里有澄清规则的机会吗?还是应该因为不清楚而关闭?为什么+16 被解析为+16-42 被解析为-42

标签: c#


【解决方案1】:

你可以写一个简单的词法分析器:

string str="2+16-42X";

StringBuilder currentNumber = new StringBuilder();
List<string> tokens = new List<string>();

foreach(char chr in str) {
    if (Char.IsDigit(chr)) {
        currentNumber.Append(chr);
    }
    else {
        if (currentNumber.Length > 0) {
            tokens.Add(currentNumber.ToString());
            currentNumber.Clear();
        }
        if (chr == '-') {
            currentNumber.Append(chr);
        }
        else {
            tokens.Add(chr.ToString());
        }
    }
}
if (currentNumber.Length > 0) {
    tokens.Add(currentNumber.ToString());
}

tokens 列表包含您的数字和符号。

【讨论】:

  • 这将打印“-”、“42”而不是“-42”
【解决方案2】:

这是一个正则表达式方法

string str = "2+16-42X";
string[] result = Regex.Matches(str, "-?\\d+|[+/*X]")
                       .Cast<Match>().Select(x => x.Value).ToArray();

解释:

  • -? 可选 - 开头的字符
  • \d+一位或多位数字
  • |
  • [+/*X] 这些字符之一+/*X

https://dotnetfiddle.net/d2ZaGC

【讨论】:

  • OP 想要什么没有多大意义,但对于阅读实际问题的人来说是哈利路亚
【解决方案3】:

您可以尝试使用以下代码:

string str = "2+16-42X";

str = str.Replace("+", " +");
str = str.Replace("-", " -");
str = str.Replace("X", " X");

var numbers = str.Split(' ');

foreach (var number in numbers)
{
    Console.WriteLine(number);
}

输出:

2
+16
-42
X

【讨论】:

  • 请大家不要再添加不正确的答案...阅读问题
  • +16 应该是+,16
【解决方案4】:

使用正则表达式:

string str="2+16-42X";

var match = Regex.Match(str, @"(\d+|\D)+");

match.Groups[1].Captures.Cast<Capture>().Select(c => c.Value).ToList();

返回:

2,+,16,-,42,X

【讨论】:

  • 预期结果是 "-42" 而不是 "-","42"
  • 无论如何,我不明白为什么- 被认为是数字,但+ 不是。 -+ 一样是一个运算符。
  • @Liam 我刚刚写了答案,如果问题错了怎么可能是对的???
  • @Teejay 正确.. 但这就是 OP 想要的,所以也许先与他/她澄清一下,而不是跳到抛出答案。如果您在修改问题后发布它,请修改您的答案或删除它..显然它改变了上下文,这不是您的错,但您的答案不再相关...对此无能为力但是教 OP 更详细地了解他想要什么......
  • 无论如何,我的回答绝对足以达到任何解析目的。但如果他们想投反对票……阿门!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
相关资源
最近更新 更多