求解:关于算术公式的分解与计算

maximus_zhang 2007-05-18 10:19:15
关于算术公式的分解与计算:
有费用列表如:
=========================
TYPE iNo AMT
-------------------------
A 1 118.00
A 2 82.00
B 1 39.00
B 2 90.00
C 1 ????
=========================
C1的金额AMT将按照
公式1:
C1=(A1+A2)*0.2+B1+B2*0.1
或者
公式2:
C1=A*0.2+B1+B2*0.1 计算.

要实现的就是输入公式1或者公式2都可以得到 类别C,第1项的金额AMT(88.00)
公式2与公式1的不同就是用A代表类别为A的所有项目(A1,A2,...An...).
公式是客户根据需要给出的。
公式中包含的运算符肯能有 +-*/() 即英文半角的四则运算符号及圆括号。
...全文
666 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Maximus_beta 2007-06-03
  • 打赏
  • 举报
回复
偶是来接分的。
maximus_zhang 2007-05-25
  • 打赏
  • 举报
回复
貌似只能马甲解决问题了~~
wanghui0380 2007-05-21
  • 打赏
  • 举报
回复
恩,还是eval

具体你可以看看shopex的后台的运费折扣管理这块

演示地址http://www.shopex.cn/products/ShopExSingle_test.html


maximus_zhang 2007-05-20
  • 打赏
  • 举报
回复
不好意思,我只能这么"早"来csdn.
我是不会觉得介个问题那么简单啦.
呃~~~~我不会写存储过程.(这一点很要命).我只是自己感觉是这个解决方法最好:给服务器一个命令,其他事情让服务器来解决.
第二我不知道用户在输入的过程中会不会输入错误公式?(上面说的正则限制应该是 所有英文字母加数字再加小数点和四则运算符号及小括号)
没有输入错误(貌似正确)的公式可不可以在已有的费用列表中得到该输入项的费用?
公式引用了自身怎么办?
输入正确的公式怎么得到公式里的各个项(公式的分解),从数据表里得到该项的值,如何进行计算得到最终结果值,最后写到数据库,并相应的更新与当前费用项目有关的项目的费用值?
maximus_zhang 2007-05-20
  • 打赏
  • 举报
回复
那就用asp脚本:
<input name="formula" value="" />
==============post===============
formula=Trim(Request.Form("formula"))
1.怎么判断formula是合法的四则算术的式子?
hookee 2007-05-20
  • 打赏
  • 举报
回复
那就要写个语法分析程序了,生成一棵语法树,那么各个操作项自然就可以得到,而且还可以检查语法的正确性。不过用存储过程做就很累了。
Dogfish 2007-05-19
  • 打赏
  • 举报
回复
直接使用eval就行
hookee 2007-05-19
  • 打赏
  • 举报
回复
存储过程也差不多.
公式的运算符号在进入存储过程之前就用脚本处理掉,这个简单,replace就行了。
构建一张临时表 temp
Name Value
A 111
A1 222
....

其中A总数可以事先用sum()算出来

接下来遍历temp构造字符串
str = "declare A" +
"Set A = 111"
也就是循环 "declare " + Name + "; Set " + Name + "=" + Value + ";"
最后 "print " + 公式
execute str

再复杂点就要做语法分析了,还是要写一大段代码。
maximus_zhang 2007-05-19
  • 打赏
  • 举报
回复
多谢楼上捧场
可能我还是没有说清楚。:-(
我的费用列表是一个数据库的表。type:字符型,1~2位字符;iNo:int型数据(max()+1);AMT:money货币。其他的字段如费用名称费用详细说明,备注等,还有一个字段来保存公式。
[quot]公式中包含的运算符肯能有 +-*/() 即英文半角的四则运算符号及圆括号。[/quot](可能有的可字打错了,抱歉)
运算符号有上面的规定,并且限制。哪位给写个正则限制input输入框只能输入: 数字 +-*/() 这些符号?
费用输入界面我是在弹出一个窗口输入一项费用,提交保存,关闭自身窗口,同时弹出另一个窗口(同样的费用输入页面)再输入另一项费用。

我自己倾向于用存储过程解决,因为:
如上面的费用列表,如果C1项费用
======================(下面用下划线代表空格)
TYPE___iNo____AMT
C______1______88.00
======================
接下来的一项费用,用户输入的是A类费用,比如
----------------------
A______3______50.00
----------------------
提交保存后,C1项费用如果是用公式1,那么C1费用不会改变;但如果是用公式2,那么C1项将相应地自动更新为
----------------------
C______1______98.00
----------------------
还有,可能客户输入的时候使用公式的不止一项呢.
那么这个存储过程怎么写呢?
或者其他的解决方法?
hookee 2007-05-18
  • 打赏
  • 举报
回复
A1=118.00
A2=82.00
B1=39.00
B2= 90.00

'先预算分类总和
A = A1 + A2
B = B1 + B2
'输入公式为字符串
s = "(A1+A2)*0.2+B1+B2*0.1"
s = Replace(s, "+", "+")
s = Replace(s, "-", "-")
s = Replace(s, "×", "*")
s = Replace(s, "/", "/")
s = Replace(s, "(", "(")
s = Replace(s, ")", ")")
C1= Eval(s)
response.write C1

28,391

社区成员

发帖
与我相关
我的任务
社区描述
ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
社区管理员
  • ASP
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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