读取四则运算的字符串(Formula)返回计算结果

最初主要的用处是。将用户定义的简单公式。转为数字。

首先将公式中的变量转为数字。然后对这个四则运算的数字表达式进行运算。

(Total -count)*2  ==> (7-1)*2

下面的5个 using 是必须的

using System;

using System.Collections;

using System.Data;

using System.Linq;

using System.Text.RegularExpressions;

主要工作方法

用 “加减乘除()” 符号将字符串分割。

var list = Regex.Split(input, "([+*-/()])")

.Where(x => !string.IsNullOrWhiteSpace(x));

将要计算的数字及符号分别放在两个栈里面。

依据符号栈 依次取出数字栈里面相应的数据进行计算。

事实上数字栈里面里所存储是四则运算的字符以外的任何字符

所以我们将数字栈里面提出的东西只提取提取数字数过滤掉其他的杂项。

string p2 = Regex.Match(numStack.Pop().ToString(), "[0-9.]*").ToString();

举例来说。  20X10 ==> 2010

整个计算double 数据类型为基础的

这两个方法的代码

double Calculate(string input)
    {
 
      var list = Regex.Split(input, "([+*-/()])")
          .Where(x => !string.IsNullOrWhiteSpace(x));
      double result = 0;

Stack numStack = new Stack();
      Stack opStack = new Stack();
      bool fetchNumber = true;
      foreach (var m in list)
      {
        if (m == "(")
        {
          opStack.Push(m);
        }
        else if (m == ")")
        {
          Walk(numStack, opStack, true);
        }
        else
        {
          if (fetchNumber)
          {
            double number = double.Parse(m.Trim());
            numStack.Push(number);
          }
          else
          {
            if (m == "+" || m == "-")
              Walk(numStack, opStack);
            opStack.Push(m);
          }
          fetchNumber = !fetchNumber;
        }
      }
      Walk(numStack, opStack);
      var p = Regex.Match(numStack.Pop().ToString(), "[0-9.]*").ToString();
      result = p==null ||p==""?0.0:double.Parse(p);
      return result;
    }

void Walk(Stack numStack, Stack opStack, bool close = false)
    {
      while (opStack.Count > 0 && numStack.Count > 1)
      {
        if (opStack.Peek().ToString() == "(")
        {
          if (close)
            opStack.Pop();
          break;
        }
        string operation = (string)opStack.Pop();
        string p2 = Regex.Match(numStack.Pop().ToString(), "[0-9.]*").ToString();
        string p1 = Regex.Match(numStack.Pop().ToString(), "[0-9.]*").ToString();
 
        double d1 = Double.Parse(p1);
        double d2 = Double.Parse(p2);
        if (Math.Abs(d2) < Math.Abs(double.MinValue * 100) &&
          operation=="/")
          d2 = 0.0000001;
        double z1 = 0;
        switch (operation)
        {
          case "+": z1 = d1 + d2; break;
          case "-": z1 = d1 - d2; break;
          case "*": z1 = d1 * d2; break;
          case "/": z1 = d1 / d2; break;
        }
        numStack.Push(z1);
      }
    }

读取四则运算的字符串(Formula)返回计算结果 c#相关推荐

  1. python字符串可以使用+进行计算吗_python用正则对字符串进行运算

    importredefnul_div(source):"""处理乘法和除法,先利用搜索出需要进行乘法和除法的表达式,然后利用正则将字符串分割,进行乘法和除法的运算 :pa ...

  2. C语言:(旧)用字符串自由输入计算的计算器(加减乘除)

    已更新:功能更强的新版计算器代码点击这里 小学期课里老师曾让写一个能够自由输入并计算的计算器,例如:3-5+2,计算结果为0 第一次尝试不断修改字符串来计算,但是发现十分容易出错 第二次改用读入变量和 ...

  3. php字符串转换表达式,php处理字符串格式的计算表达式

    有时候我们对每一种产品都有一个提成公式,而这个计算提成的公式是以字符串格式存在表中的 当我们用这个计算公式时,他并不像我们写的:$a=2+3*5;这样简单的能计算出结果,而它是个字符串 所以,我们就必 ...

  4. 【C 语言】二级指针案例 ( 字符串切割 | 返回 自定义二级指针 作为结果 | 每个 一级指针 指向不同大小内存 | 精准分配每个 一级指针 指向的内存大小 )

    文章目录 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 二.完整代码示例 一.二级指针案例 ( 返回自定义二级指针 | 精准控制内存大小 ) 博客 [C 语言]二级指针案例 ( ...

  5. formula 返回list_python正则实现计算器功能

    本文实例为大家分享了python正则实现计算器功能的具体代码,供大家参考,具体内容如下 # -*- coding: utf-8 -*- # Author :Gogh # @Time :2017/12/ ...

  6. c语言int超出范围字符串,Go返回int64类型字段超出javascript Number范围的解决方法...

    Go返回int64类型字段超出javascript Number范围的解决方法 最近在项目中,一个go服务给前端提供了一个接口,返回json格式数据,其中Int64字段会超出javascript Nu ...

  7. java实现将图片读取成base64字符串,将base64字符串存储为图片。

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java实现将图片读取成base64字符串 ,将base64字符串存储为图片. 将图片转化为字符串以后,由于字符串更方便在网络上通过ajax传输. ...

  8. Cris 的 Python 数据分析笔记 05:Pandas 数据读取,索引,切片,计算,列整合,过滤,最值

    Pandas 数据读取,索引,切片,计算,列整合,过滤,最值 文章目录 Pandas 数据读取,索引,切片,计算,列整合,过滤,最值 1. read_csv 函数 2. DataFrame 数据结构的 ...

  9. 字符串(字节)长度计算

    前置知识 字节 字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位,也表示一些计算机编程语言中的数据类型和语言字符. 一个字节(byte)8位(bit),十进制表示0-255. 两个字节1 ...

  10. JSTL 读取数组 和 字符串连接

    2019独角兽企业重金招聘Python工程师标准>>> JSTL读取数组: 从后台取得一个字符串,如:AA-50-3,通过-划分成字符串数组.然后读取每个字符串. <c:set ...

最新文章

  1. 【转】Spring 4.x实现Restful web service
  2. mysql sql 检测磁盘_MySQL 找到临时表用到磁盘的SQL
  3. [MATLAB粒子模拟笔记]差分泊松方程求静电场分布
  4. 离散数学平面图对偶图和着色问题
  5. python统计窗口函数怎么处理_python时间序列:移动窗口函数前篇
  6. Android基础知识大纲
  7. Android studio JNI jni实例
  8. 在Amazon FreeRTOS V10中使用运行时统计信息
  9. python-day02
  10. vue baidu map之获取选中点的经纬度
  11. Armchart Js版属性学习与总结
  12. Python3.5 学习八 附加知识点 paramiko和rsa非对称秘钥的适用
  13. 机器学习、数据分析类面经分享
  14. android信息实现,Android 信息分享实现
  15. 数字信号处理教程答案及解析(第五版)
  16. vmware整套实施项目文档(包含vmware安装配置,emc存储安装配置,emc光纤交换配置,...
  17. 计算过去的某天距离今天多少天
  18. poj3294Life Forms
  19. 如何用一句话证明你是做产品的?
  20. ERA5-Land hourly data数据直接计算出来数据量偏大,monthly单位等

热门文章

  1. 在桌面计算机找不到驱动,电脑杀毒后桌面不见了的原因是什么_怎么解决 - 驱动管家...
  2. 《诗经·王风·黍离》
  3. R语言使用rnorm函数生成正太分布数据、使用stem函数可视化茎叶图、茎叶图很直观的表现出数据的分布情况
  4. H5如何获取内网IP和公网IP
  5. python定义一个汽车类_定义一个创造汽车的工厂类
  6. 痞子衡嵌入式:ARM Cortex-M文件那些事(5)- 映射文件(.map)
  7. java基础入门习题答案_传智播客-Java基础入门习题答案
  8. Latest for Mac 0.7.3 应用更新管理器
  9. Cisco Aironet WLAN系列AP的瘦胖模式转换
  10. 流落在北京的80后北漂们的未来在哪儿