C#编程中字符串公式的计算

  在一个程序开发当中,有很多涉及到公式的定义与计算,在用户给定的文档中,公式采用字符串形式定义,包含了一些变量名和各种运算符号,程序需要先进行字符变量的值替换后再进行计算,取得结果后再进行后续的操作。

  这个动态字符串公式的自动计算以前遇到过,在JavaScript中或者其他的开发语言如Powerbuilder中有过类似的需求,JavaScript中的比较好解决,Powerbuilder直接使用数据窗口的DS就可以轻松解决。

  所以,首先想到的肯定是使用C#的Datatable。
**  1、使用DataTable**

复制代码
            Single msz = 1.5F;
            Single bhcs = 2.1F;
            Single xxpl = 4.7F;
            string  StrResult = "";

            string StrFormula = textBox1.Text.Trim ();
            //变量替换
            StrFormula= StrFormula.Replace("msz",msz.ToString());
            StrFormula = StrFormula.Replace("bhcs", bhcs.ToString());
            StrFormula = StrFormula.Replace("xxpl", xxpl.ToString());
            //开始计算
            DataTable dataTable = new DataTable();
            object result = dataTable.Compute(StrFormula, null);
            StrResult= Convert.ToSingle(result).ToString ();

            //输出
            label3.Text = StrResult;

**  2、使用JavaScript也可以,需要添加引用**

  在管理NuGet程序包中安装 Microsoft.ClearScript 并在程序中添加引用:

复制代码
using Microsoft.ClearScript.V8;

  然后就可以在程序中直接调用:

复制代码
            using (var JSEngine = new V8ScriptEngine())
            {
                object result = JSEngine.Evaluate(StrFormula);
                StrResult= Convert.ToSingle(result).ToString ();
            }

  同样可以得到正确的结果。

  3、使用使用Excel表单元格的计算

  这个也是很容易想到的,安装包EPPlus,因为我的程序是基于.NET Framework,所以安装EPPlus,如果是基于基于 .NET Core,那么就需要安装EPPlus.Core。

  这里有两种方法,一个是在本地新建一个Excel文件供使用,另外直接在内存中创建文件。

  在程序中添加引用:

复制代码
using OfficeOpenXml;

  代码实现:

复制代码
            OfficeOpenXml.LicenseContext licenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
            ExcelPackage.LicenseContext = licenseContext;
            using (var package = new ExcelPackage())
            {
                // 添加一个工作表
                var worksheet = package.Workbook.Worksheets.Add("Sheet1");
                // 设置 A1 单元格的公式
                worksheet.Cells["A1"].Formula = StrFormula;
                package.Workbook.CalcMode = ExcelCalcMode.Automatic;
                // 计算公式并获取结果
                worksheet.Calculate();
                // 获取计算后的结果值
                StrResult = worksheet.Cells["A2"].Value.ToString ();
            }

  上面是最容易想到和实现的计算方式,另外也可以使用第三方库来实现,还可以通过C#的动态编译执行代码的功能来实现,就是将字符串公式包装成一个可以编译的代码块,然后使用动态编译将它编译成可执行的代码从而获取计算结果,这个技术有点麻烦。

  动态编译这一项技术很实用,值得深入学习和掌握。

相关推荐
嵌入式学习菌7 分钟前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug
长征coder33 分钟前
【无标题】
java·性能优化
matlab代码1 小时前
基于matlab数字图像处理的指纹识别系统【源码68期】
开发语言·matlab
新时代牛马1 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
Bs_MoneyMagnet1 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
matlab代码1 小时前
基于matlab的水果识别系统(苹果香蕉菠萝梨桃子)【源码65期】
开发语言·matlab
wuyk5552 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
weixin199701080162 小时前
[特殊字符]《跨境二手ERP对接Back Market:标准化API + 7~10工作日技术合规审核实录》(附Python源码)
开发语言·python·pandas
sunshine22 girl2 小时前
Java学习一 环境配置2 Idea的入门使用和maven配置,项目启动脚本配置
java·maven
尘客-追梦2 小时前
Day 01:插件化之前,先看清 ABI 这堵墙
开发语言·c++·qt