没有正则表达式的字符串中的多个数字

Multiple numbers from strings with-out regex

我正在构建一个将输入数字作为字符串的控制台计算器。

例如:

string inputNumber = "190+154+114"
double[] number = new double[5];

我想将该字符串转换为数字数组,示例:

number[0] = 190;
number[1] = 154;
number[2] = 114;

我知道有一个库可以处理它,但我想了解如何读取符号,然后将数字放入数组中。

到目前为止,我能想到的就是将字符串作为单个字符读取,然后找到“+”字符,然后我将数字作为字符读取,直到 character!="null" || character=='+'。但是问题是不知道怎么转化成代码

============================================= ========================= 编辑

我读了答案,发现它们真的很有趣。但是,如何在插入运算符后创建一个新字符串?

例如:

string inputNumber = string.Empty;
string[] number = new string[20];
//Input number
Console.WriteLine("enter a number"); //190+155+220
inputNumber = Console.ReadLine();

那么输入运算符时如何获取字符串,所以新字符串必须是这样的:

number[0] = "190";
number[1] = "155";
number[2] = "220";

这对我有用:

string inputNumber = "190+154+114";
double[] number = inputNumber.Split('+').Select(x => double.Parse(x)).ToArray();

我明白了:

当然,当您需要其他数学运算时,这会变得更加复杂,尤其是 - 带有负数和括号的情况。

您真正需要的是一种解析数学表达式并生成表达式树的方法。

我最初的回答只是拆分“+”字符,但听起来您还需要存储运算符,然后在构建计算器时进行一些数学运算。如果是这样,那么这里有另一种方法。

首先,创建一组您将使用的已知运算符。然后,我们将通过搜索这些运算符来分解字符串。每次找到一个,我们就抓取从前一个运算符到当前运算符的字符串,并将其存储在我们的 'numbers' List<double> 中,然后我们抓取当前运算符并将其存储在我们的 'operators' List<char>。最后,我们获取最后一个数字(最后一个运算符之后的字符串的其余部分)。

在一个数组中包含数字并在另一个数组中包含运算符后,您可以验证数字是否比运算符多一个(因为如果不匹配,那么我们可能会得到错误的输出)。假设字符串格式正确,可以将第一个数字存储为 result,读取下一个运算符和下一个数字,然后对 result 进行运算。我会留给你实现某种运算符优先级!

也许代码比所有这些词更容易阅读:

static void Main()
{
    var knownOperators = new[] { '+', '-', '*', '/' };

    // Get input string from user
    Console.Write("Please input a math string: ");
    string inputNumber = Console.ReadLine(); // "190+154+114";

    var numbers = new List<double>();
    var operators = new List<char>();
    double tmp = 0;

    // We will break up the string by searching for operators. Each time we find
    // one, we grab the string from the previous operator to the current one and
    // store it in 'numbers' as a double, then we grab the current operator and
    // store it in 'operators' as a char. At the very end, we grab the last number.
    var previousOperatorIndex = 0;
    var operatorIndex = inputNumber.IndexOfAny(knownOperators, previousOperatorIndex);
    while (operatorIndex > -1)
    {
        // Add the number part - the string from the previous operator to this one
        if (double.TryParse(inputNumber.Substring(previousOperatorIndex, 
            operatorIndex - previousOperatorIndex), out tmp))
        {
            numbers.Add(tmp);
        }

        operators.Add(inputNumber[operatorIndex]);
        previousOperatorIndex = operatorIndex + 1;
        operatorIndex = inputNumber.IndexOfAny(knownOperators, previousOperatorIndex);
    }
    // Add the last number (after the last operator)
    if (double.TryParse(inputNumber.Substring(previousOperatorIndex), out tmp))
    {
        numbers.Add(tmp);
    }

    // Validate we have one more number than operator
    if (numbers.Count < (operators.Count + 1))
    {
        Console.WriteLine("Error: there were too many operators!");
    }
    else if (numbers.Count > (operators.Count + 1))
    {
        Console.WriteLine("Error: there were too many numbers!");
    }
    else
    {
        // Do the math!
        double result = numbers[0];

        for (int i = 1; i < numbers.Count; i++)
        {
            switch (operators[i - 1])
            {
                case '+':
                    result += numbers[i];
                    break;
                case '-':
                    result -= numbers[i];
                    break;
                case '*':
                    result *= numbers[i];
                    break;
                case '/':
                    result /= numbers[i];
                    break;
                default:
                    break;
            }
        }

        Console.WriteLine("The result is: {0}", result);
    }

    Console.Write("\nDone!\nPress any key to exit...");
    Console.ReadKey();
}