将值代入到一个字符串公式中

jinemirates 2012-07-13 03:51:38
主表中:数据库中的字段formula中存储的字符串公式是:(((V1-V2)*C*0.09)/(V*5/100))*100
子表中:Code的值和Parvlaue值分别是
Code Parvlaue
V 10
C 10
V2 10
V1 15
注:公式里面的值是不固定的,有可能下次就是换成V12,X呀之类的

我要的结果是将值代入到字符串里面,然后计算出结果
例:(((15-10)*10*0.09)/(10*5/100))*100 = 900
...全文
479 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahttzxj 2015-03-13
  • 打赏
  • 举报
回复
需要应用的jar 从import里面可以看到 这是我自己封装的一个util类 可以参考下 执行的过程如下: /** * 1.查询数据库得到公式(String 格式 ) * 2.获取参数(通过数据库,或者前台输入) * 4.导入参数执行公式 --整个流程就像执行一段JS一样,先定义参数,然后根据公式计算出结果,如下 */ import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.ingta.tax.house.manager.exception.AssessFormulaIllegalityException; import com.ingta.tax.house.manager.exception.AssessParamsIllegalityException; public class Javascript { private static final Logger logger = LoggerFactory.getLogger(Javascript.class); private static ScriptEngineManager factory = new ScriptEngineManager(); private static ScriptEngine engine = factory.getEngineByName("JavaScript"); private static final String RESULT = "result"; public static BigDecimal getMathValue(Map<String, Object> map, String script) throws AssessFormulaIllegalityException, AssessParamsIllegalityException { Double result = null; try { if (logger.isDebugEnabled()) { logger.debug("paramMap:{}", map); logger.debug("formula:{}", script); } logger.info("paramMap:{}", map); logger.info("formula:{}", script); engine.put("paramMap", map); engine.eval(script); result = (Double) map.get(RESULT); } catch (ScriptException e) { e.printStackTrace(); throw new AssessFormulaIllegalityException("response.assess.formula.illegality"); } if (logger.isDebugEnabled()) { logger.debug("result:{}", result == null ? "" : result); } if (result == null) throw new AssessParamsIllegalityException( "response.assess.params.illegality"); logger.info("result:{}", result); return new BigDecimal(result).setScale(4, BigDecimal.ROUND_HALF_UP); } public static BigDecimal getMathValue(String n, String script) throws AssessFormulaIllegalityException, AssessParamsIllegalityException { Map<String, Object> map = new HashMap<String, Object>(); map.put("n", n); return getMathValue(map, script); } }
jinemirates 2012-07-19
  • 打赏
  • 举报
回复
MSScriptControl.ScriptControl,用这个不行,这个只能用在32位机子上,64位的不支持
  • 打赏
  • 举报
回复
 /*
* 1.查询数据库得到公式
* 2.查询数据库得到该公式的参数列表
* 3.参数定义并赋值
* 4.执行公式 --整个流程就像执行一段JS一样,先定义参数,然后根据公式计算出结果,如下
*/
MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControl();
sc.Language = "JavaScript";
StringBuilder sb = new StringBuilder();//初始化参数值,这里应该从数据库得到参数列表,最终拼成类似格式:var a=10;var b=12;....
sb.Append("var i=10,j=12;");
sb.Append("var x=30;");
sc.ExecuteStatement(sb.ToString());//加入这段脚本
string formula = "(i+j)*x";//得到公式
MessageBox.Show(sc.Eval(formula).ToString());//执行公式,并得到返回结果,660
jinemirates 2012-07-14
  • 打赏
  • 举报
回复
谢谢SQL77,我已经做出来了,谢谢各位了,麻烦大家了
rczjp 2012-07-14
  • 打赏
  • 举报
回复
V V1 V2这样的替换,使用正则可以吗?
^V$这样就限制是V
^V1$这样限制为V1
jinemirates 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:
引用 7 楼 的回复:

SQL code
DECLARE @S NVARCHAR(4000)
SET @S='(((,V1,-,V2,)*,C,*0.09)/(,V,*5/100))*100'
--> 测试数据: #TB
if object_id('tempdb.dbo.#TB') is not null drop table #TB
create t……
[/Quote]而且我这个字符串公式只是数据库中一条记录里面的一个字段而已,这个公式是不固定的,里面的变量是会发生变化的
jinemirates 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 9 楼 的回复:
引用 7 楼 的回复:

SQL code
DECLARE @S NVARCHAR(4000)
SET @S='(((,V1,-,V2,)*,C,*0.09)/(,V,*5/100))*100'
--> 测试数据: #TB
if object_id('tempdb.dbo.#TB') is not null drop table #TB
create t……
[/Quote]大哥,能不能来段代码
SQL77 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 7 楼 的回复:

SQL code
DECLARE @S NVARCHAR(4000)
SET @S='(((,V1,-,V2,)*,C,*0.09)/(,V,*5/100))*100'
--> 测试数据: #TB
if object_id('tempdb.dbo.#TB') is not null drop table #TB
create table #TB (Code ……
[/Quote]
如果只是做你这一个.
可以SPLIT按(,-,),/,+这些数学操作符。
然后得到真正的参数。完全相同的再替换
jinemirates 2012-07-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

SQL code
DECLARE @S NVARCHAR(4000)
SET @S='(((,V1,-,V2,)*,C,*0.09)/(,V,*5/100))*100'
--> 测试数据: #TB
if object_id('tempdb.dbo.#TB') is not null drop table #TB
create table #TB (Code varchar(2),PARVALU……
[/Quote]
SET @S='(((,V1,-,V2,)*,C,*0.09)/(,V,*5/100))*100'
这个里面的,,这个是哪里来的,我也知道用,|这类的分隔,但是这个本身就已经是存储在数据库里面的,我要的是知道他如果分隔的具体过程,如果这个知道了,其他的都不难了,就是因为V1,V2,V很难替换,才不知道怎么做
SQL77 2012-07-14
  • 打赏
  • 举报
回复
C#如果有上面的规则可以for循环替换后。再用DataTable.Compute(s);计算
SQL77 2012-07-14
  • 打赏
  • 举报
回复
DECLARE @S NVARCHAR(4000)
SET @S='(((,V1,-,V2,)*,C,*0.09)/(,V,*5/100))*100'
--> 测试数据: #TB
if object_id('tempdb.dbo.#TB') is not null drop table #TB
create table #TB (Code varchar(2),PARVALUE DEC(18,2))
insert into #TB
select 'V',10 union all
select 'C',10 union all
select 'V2',10 union all
select 'V1',15

select @S=REPLACE(@S,','+CODE+',',PARVALUE) from #TB

SELECT @S

EXEC('SELECT '+@S)

/*(((15.00-10.00)*10.00*0.09)/(10.00*5/100))*100

(所影响的行数为 1 行)


------------------------------------
900.00000000000000000


写个SQL的。你的参数没特殊性不好替代。V与V1很难替换啊。呵呵。换种思路
jinemirates 2012-07-14
  • 打赏
  • 举报
回复
没有人知道吗,请帮助呀
jinemirates 2012-07-13
  • 打赏
  • 举报
回复
求人气呀
jinemirates 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

楼主可以研究下C#动态编译,会得到你想要的结果的。
[/Quote]亲,能不能给粘给代码呀
袁阳 2012-07-13
  • 打赏
  • 举报
回复
楼主可以研究下C#动态编译,会得到你想要的结果的。
jinemirates 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

1.查询数据库拼出计算字符串,也就是(((15-10)*10*0.09)/(10*5/100))*100
2.添加COM引用
http://blog.csdn.net/yxbsmx/article/details/5268396
3.调用如下C# code
MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptCont……
[/Quote]


但是第一次是要将V V1 V2 C这些变量给替换到公式里面,才可以进行计算呀,就是这些变量不好替换,(((V1-V2)*C*0.09)/(V*5/100))*100 这个公式中如果我用Replace先代入的是V,那V1 V2 V都会替换,就这个不会
  • 打赏
  • 举报
回复
1.查询数据库拼出计算字符串,也就是(((15-10)*10*0.09)/(10*5/100))*100
2.添加COM引用
http://blog.csdn.net/yxbsmx/article/details/5268396
3.调用如下
MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControl();
sc.Language = "JavaScript";
MessageBox.Show(sc.Eval("(((15-10)*10*0.09)/(10*5/100))*100").ToString());//900

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧