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

news2025/2/25 6:24:40

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

  这个动态字符串公式的自动计算以前遇到过,在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#的动态编译执行代码的功能来实现,就是将字符串公式包装成一个可以编译的代码块,然后使用动态编译将它编译成可执行的代码从而获取计算结果,这个技术有点麻烦。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1158951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【EI会议征稿】第七届先进算法与控制工程国际学术会议(ICAACE 2024)

第七届先进算法与控制工程国际学术会议(ICAACE 2024) 2024 7th International Conference on Advanced Algorithms and Control Engineering 第七届先进算法与控制工程国际学术会议(ICAACE 2024)定于2024年1月26-28日在中国上海…

CPLEX获取模型的解池中的解方案

文章目录 1、前序2、解池中的解方案获取3、CPLEX求解模型的时间THE END 1、前序 \qquad CPLEX求解模型CAPI继续解读。最近在进行Bender decompostion的实验时,需要获取到CPLEX求解的所有的解方案信息,所以又头大翻了一通“gou pi不通”的CPLEX API官方文…

DDACO

算法 alternative set包括备用路径和禁忌表,roulette体现所占比例越大被选中概率越高的思想。在图2中,节点表示与图1中的边相同的路径,边表示邻接关系(AND关系) 所有的帕累托最优解构成帕累托最优解集 作者未提供代码…

数据通信——应用层(DHCP的原理与配置)

引言 假如我们的网络中有N台设备,它们都要设置IP地址,如果人工去一个个配置不仅不方便管理还很麻烦。因此我们用DHCP来自动分配地址。 一,系统的启动流程 不仅是计算机、很多网络设备的启动流程如下: 设备上电后,硬件…

Vue 插槽 组件插入不固定内容

定义好一个组件&#xff0c;如果想插入图片或视频这非常不好的控制应该显示什么&#xff0c;这个时候可以使用插槽插入自定义内容 默认插槽 <Login><template><h1>我是插入的内容</h1></template></Login >组件 <slot></slot>…

正则表达式续篇

位置锚定&#xff1a; ^:行首锚定&#xff0c;表示以什么为开头 例如&#xff1a; $:行尾锚定&#xff0c;表示以什么为结尾 例如&#xff1a; ^&#xff1a;匹配的是空行 例如&#xff1a; ^root$&#xff1a;匹配整行&#xff0c;而且整行只能有这一个字符串 实验&#x…

SpringBoot----自定义Start(自定义依赖)

一&#xff0c;为什么要定义Start 向阿里云OSS如果我们要引入的话很麻烦&#xff0c;所以我们可以自定义一些组件&#xff0c; 然后我们只需要在pom文件中引入对应的坐标就可以 二&#xff0c;怎么定义&#xff08;以阿里云OSS为例&#xff09; 1&#xff0c; 定义两个组件模块…

HarmonyOS数据管理与应用数据持久化(一)

一. 数据管理概述 功能介绍 数据管理为开发者提供数据存储、数据管理能力&#xff0c;比如联系人应用数据可以保存到数据库中&#xff0c;提供数据库的安全、可靠等管理机制。 数据存储&#xff1a;提供通用数据持久化能力&#xff0c;根据数据特点&#xff0c;分为用户首选项、…

AttributeError: partially initialized module ‘pandas‘ has no attribute ‘core‘

在使用jupyter notebook学习动手学深度学习时&#xff0c;出现以下错误&#xff1a; %matplotlib inline import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35 train_iter, voca…

【MySQL数据库】 二

本文主要介绍了数据库操作的操作流程 , 以及数据库和数据表的基本操作 . 一.数据库操作工作流程 1.用户在客户端输入SQL 2.客户端把SQL通过网络发送给服务器 3.服务器会执行这个SQL&#xff0c;把结果返回给客户端 4.客户端收到结果显示到界面上 二.数据库的操作 1.创建数…

C语言实现输入一个表示星期几的数,然后输出相应的英文单词,要求使用指针数组实现

完整代码&#xff1a; // 输入一个表示星期几的数&#xff0c;然后输出相应的英文单词&#xff0c;要求使用指针数组实现 #include<stdio.h>//指针数组就是数组中每个元素都是指针 int main(){//初始化七个字符常量&#xff0c;代表星期几,const修饰表示这是字符串常量&…

java--方法重载

1.方法重载 一个类中&#xff0c;出现多个方法的名称相同&#xff0c;但是他们的形参列表是不同的&#xff0c;那么这些方法就称为方法重载了。 2.方法重载的注意事项 ①一个类中&#xff0c;只要一些方法的名称相同、形参列表不同&#xff0c;那么他们就是方法重载了&#…

深入大模型与ChatGPT

关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、大模型原理 1.Transformer (1)求知之路&#xff1a;LLM 学到了什么知识 LLM 从海量自由文本中学习了大量知识&#xff0c;如果把这些知识做粗略分类的话&#xff0c;…

抖音协议最新版

主页信息、主页视频数据、发布作品、发布图文、验证可靠、验证点选、扫码登录协议、视频点赞、视频举报、视频详情解析(获赞、评论数、收藏数、无水印地址等)、视频评论、视频评论信息、视频评论点赞、用户关注、用户举报、用户资料、用户更改资料、用户粉丝和关注的用户详情、…

41 深度学习(五):图片增强|Transfer Learning|VGG|resnet50(fine-tune)|InceptionNet

文章目录 图片增强为什么要使用图片增强具体方式.flow_from_directory(directory)flow_from_dataframe 迁移学习&#xff08;Transfer Learning&#xff09;AlexNetVGGresnet50代码学习关键的源码分析 InceptionNet 图片增强 为什么要使用图片增强 数据增强是一种常用的神经网…

如何构建用于Skydel GNSS模拟仿真的SNMP代理方式?

使用Skydel API构建测试方案 凭借其现代、强大且直观的API&#xff0c;德思特Safran GNSS模拟引擎Skydel免费提供了Python、C#、C和Labview的开源客户端库&#xff0c;它具有600多条命令&#xff0c;并且有完善的文档与记录。 随着Skydel软件更新添加新功能&#xff0c;API得…

NI-9236 国产化10 kS/s/ch,350 Ω四分之一桥应变计,8通道C系列应变/桥输入模块

10 kS/s/ch&#xff0c;350 Ω四分之一桥应变计&#xff0c;8通道C系列应变/桥输入模块 NI‑9236可同步测量所有通道的动态应变&#xff0c;从而实现了高速同步测量。 该功能对于需要在特定时刻对多个通道进行比较的应用&#xff08;例如冲击测试&#xff09;非常重要。\n\nNI…

Jave语法的输入输出

基本语法 从键盘输入 使用 Scanner 读取字符串/整数/浮点数 在idea中这个包是自动导入的&#xff01; 使用 Scanner 循环读取 N 个数字&#xff0c;并求取其平均值 Scanner sc new Scanner(System.in); int sum 0; int num 0; while (sc.hasNextInt()) {int tmp sc.nex…

ssh登录界面变成vim提示,进不去系统

是ubuntu系统 使用远程连接root&#xff0c;进去后发现界面变成vim编辑器的介绍界面了 使用普通用户登录 查询用户的登录shell是不是有问题 sudo vim /etc/passwd 发现用户shell变成了vim编辑器 修改为/bin/bash就可以正常登录了 重新登录测试就正常了

Java数组转集合list中的神坑

目录 debug一下Arrays.asList源码一探究竟 大家好&#xff0c;我是哪吒。 今天在review代码的时候&#xff0c;发现一个同事的是这样写的。 public void getData() {int[] arr {1, 2, 3};List list Arrays.asList(arr);... }打眼没看出问题&#xff0c;一般不都这样写嘛。 …