带空格和不带空格的解析 C#

例如,我有一个程序可以计算中间有空格的 1 + 1,但是如何在我的代码中使其也可以计算没有空格的 1 + 1?我正在考虑正则表达式或分割字符串,但我无法成功!

有人可以帮我吗?

这是我的代码:

private char[] SPACE = new char[] { ' ' };

private void GetAnswer(string clipboardText)

{

    //Loop through all questions and answers//

    foreach (question q in questionList)

    {

        //If we have found an answer that is exactly the same show an Notification//


        //Startwith zoekt naar alle vragen die matchen vanaf het begin van de zin en Endwith alle vragen die matchen vanaf het eind van de zin//

        if (q._question.StartsWith(clipboardText) || q._question.EndsWith(clipboardText))

        {

            ShowNotification(q._question, q._answer);

            break;

        }

    }

    var parts = clipboardText.Split(SPACE);

    var isValid = true;

    Double a, b;


    // Make sure it's format A # B

    if (parts.Length != 3)

        return;


    // Parse first number

    isValid = Double.TryParse(parts[0], out a);

    if (!isValid)

        return;


    var validOperators = new char[] { '+', '-', ':', 'x', '%' };


    // Parse operator

    if (parts[1].Length != 1)

        return;

    var op = parts[1][0];

    if (!validOperators.Contains(op))

        return;


    // Parse 2nd number

    isValid = Double.TryParse(parts[2], out b);

    if (!isValid)

        return;


    // Now calculate the answer

    string answer = null;

    switch (op)

    {

        case '+':

            answer = (a + b).ToString();

            break;

        case '-':

            answer = (a - b).ToString();

            break;

        case ':':

            if (b == 0)

                answer = "NaN";

            else

                answer = (a / b).ToString();

            break;

        case 'x':

            answer = (a * b).ToString();

            break;

        // rekent percentage van een bedrag 

        case '%':

            answer = (a / b * 100).ToString();

            break;

        default:

            throw new InvalidOperationException();

    }


    // Show the answer

    ShowNotification(clipboardText, answer);

}

提前致谢!


元芳怎么了
浏览 70回答 3
3回答

偶然的你

假设您只有两个数字,如问题中所述,这是解决方案// this code will work for all of the text mentioned in comments&nbsp;//string text = "1 + 1";//string text = "1+1";//string text = "100.998+ 2000.7";//string text = "10&nbsp; &nbsp; &nbsp; &nbsp;+&nbsp; &nbsp;2000.7";&nbsp; &nbsp; &nbsp; &nbsp; string text = "100+ 2000";&nbsp; &nbsp; &nbsp; &nbsp; text = Regex.Replace(text, @"\s+", "");&nbsp; &nbsp; &nbsp; &nbsp; double num1 = 0;&nbsp; &nbsp; &nbsp; &nbsp; double num2 = 0;&nbsp; &nbsp; &nbsp; &nbsp; char operand&nbsp; ;&nbsp; &nbsp; &nbsp; &nbsp; int startIndex = 0;&nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0; i < text.Length; i++)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // look for first operator&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (isOperator(text[i]) || (i+1) == text.Length) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (startIndex == 0) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; double.TryParse(text.Substring(startIndex, i), out num1);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; operand = text[i];&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; startIndex = i + 1;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; double.TryParse(text.Substring(startIndex), out num2);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; // calculate(num1,operand,num2) // Implement this method with a simple switch case and this will calculate the final answer for you&nbsp;isOperator 方法的实现:&nbsp;public static bool isOperator(char opt) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; switch (opt)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case '+':&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case '-':&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case '*':&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case '/':&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }

月关宝盒

实际上我建议首先尝试从clipboardText. 如果有效,则按其拆分并在拆分时删除空条目(空格):var validOperators = new char[] { '+', '-', ':', 'x', '%' };char op = validOperators.FirstOrDefault(o => clipboardText.Contains(o));if (op == default(char))&nbsp; &nbsp; return;var parts = clipboardText.Split(new char[] { op}, StringSplitOptions.RemoveEmptyEntries);最后一件事是现在您的格式将只是数字!零件将只有 2 个元素(希望如此):// Make sure it's format A # Bif (parts.Length != 2)&nbsp; &nbsp; return;这也意味着取第一个和最后一个数字:// Parse first numberisValid = Double.TryParse(parts.First(), out a);if (!isValid)&nbsp; &nbsp; return;// Parse last numberisValid = Double.TryParse(parts.Last(), out b);if (!isValid)&nbsp; &nbsp; return;不,您现在可以摆脱运算符转换和检查:// Parse operatorif (parts[1].Length != 1)&nbsp; &nbsp; return;var op = parts[1][0];if (!validOperators.Contains(op))&nbsp; &nbsp; return;

紫衣仙女

您可以尝试var parts = clipboardText.Replace(" ", "");这样做,这应该使您的输出始终没有空间。private static void GetAnswer(string clipboardText){&nbsp; &nbsp; //Loop through all questions and answers//&nbsp; &nbsp; foreach (question q in questionList)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; //If we have found an answer that is exactly the same show an Notification//&nbsp; &nbsp; &nbsp; &nbsp; //Startwith zoekt naar alle vragen die matchen vanaf het begin van de zin en Endwith alle vragen die matchen vanaf het eind van de zin//&nbsp; &nbsp; &nbsp; &nbsp; if (q._question.StartsWith(clipboardText) || q._question.EndsWith(clipboardText))&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ShowNotification(q._question, q._answer);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; var parts = clipboardText.Replace(" ", "");&nbsp; &nbsp; var isValid = true;&nbsp; &nbsp; Double a, b;&nbsp; &nbsp; // Make sure it's format A # B&nbsp; &nbsp; char? op = null;&nbsp; &nbsp; int end;&nbsp; &nbsp; var validOperators = new char[] { '+', '-', ':', 'x', '%' };&nbsp; &nbsp; // find operator&nbsp;&nbsp; &nbsp; foreach (char oper in validOperators)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; if (parts.Contains(oper))&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end = parts.IndexOf(oper);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; op = oper;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; if (!op.HasValue)&nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; // split to argument with op&nbsp; &nbsp; var arguments = parts.Split(op.Value);&nbsp; &nbsp; // Parse first number&nbsp; &nbsp; isValid = Double.TryParse(arguments[0], out a);&nbsp; &nbsp; if (!isValid)&nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; // Parse 2nd number&nbsp; &nbsp; isValid = Double.TryParse(arguments[1], out b);&nbsp; &nbsp; if (!isValid)&nbsp; &nbsp; &nbsp; &nbsp; return;&nbsp; &nbsp; // Now calculate the answer&nbsp; &nbsp; string answer = null;&nbsp; &nbsp; switch (op)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; case '+':&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; answer = (a + b).ToString();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; case '-':&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; answer = (a - b).ToString();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; case ':':&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (b == 0)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; answer = "NaN";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; answer = (a / b).ToString();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; case 'x':&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; answer = (a * b).ToString();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; // rekent percentage van een bedrag&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; case '%':&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; answer = (a / b * 100).ToString();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new InvalidOperationException();&nbsp; &nbsp; }&nbsp; &nbsp; // Show the answer&nbsp; &nbsp; ShowNotification(clipboardText,answer);}
打开App,查看更多内容
随时随地看视频慕课网APP