多语言展示
当前在线:380今日阅读:113今日分享:31

字符型中文算式转英文标准算式的方法

程序在接受用户输入算式时,或者你有一个字符型算式,它可能不是标准的英文字符型算式,在转化成可计算的算式之前,我们要把它标准化。方法是有很多,如:穷尽式逐项替换法、分离字符串逐一替换法、正则表达式替换方法、自定义字典替换法、自定义“类”之一劳永逸法……还要避开一些暗含陷阱的方法。效果图0:
工具/原料

as3.0

步骤/方法
1

为了方便,我们先定义一个变量,并给它一个值——中文字符型算式:

2

var formula:String='{[[[(20+3)*5]]]-10-2.5}/ 2.5×(1134-500÷4)=';

3

我们需要的效果是:

4

var result:String='(((((20+3)*5)))-10-2.5)/2.5*(1134--500/4)”;

5

实现的方法细述如下:

6

穷尽式逐项替换法。  穷尽可能出现的情况,再用正则表达式匹配一个或多个替换项。因为字符型中文算式可能出现的情况为数不多,可以很容易地枚举。 function replace(str:String ):String {  formula = str.replace(/[\[\{{[(]/g,'(')//统一为英文左括号  str = str.replace(/[\]\}}])]/g,')')//统一为英文右括号  str = str.replace(/×/g,'*');  str= str.replace(/÷/g,'/');   str= str.replace(/[== ]/g,'');//去掉空格和等号   str= str.replace(/./g,'.');   str= str.replace(/0/g,0);  str= str.replace(/1/g,1);   str= str.replace(/2/g,2);   str= str.replace(/3/g,3);   str= str.replace(/4/g,4);   str= str.replace(/5/g,5);   str= str.replace(/6/g,6);   str= str.replace(/7/g,7);   str= formula.replace(/8/g,8);  formula= formula.replace(/9/g,9);   return str }  测试一下:   trace(formula=replace(formula));  结果是符合要求的:   (((((20+3)*5)))-10-2.5)/2.5*(1134-500/4)  如果把替换与被替换的内容估成数组,使用循环赋值,岂不可以大大简化代码?我们试下:varsymbol:Array=['+','-','*','/','(',')','(',')','(',')','(',')','(',')','.','0','1','2','3','4','5','6','7','8','9','','','',''];var char:Array=['+','-','×','÷','(',')','[',']','[',']','{','}','{','}','.','0','1','2','3','4','5','6','7','8','9','=','=',' ','',];//...标准化算式...去中文字符、等号、空格...................function replace(str:String ):String {var k:uint=symbol.length;for (var j:uint =0; j

7

分离字符串逐一替换法。  仍旧利用上面的两个数组做为替换与被替换的内容。构建带有参数、有返回值的函数如下:  //...标准化算式...去中文字符、等号、空格.....replace:替换..............function replace(str:String ):String {varstring:String='';vark:uint=symbol.length;varn:uint=str.length;for(var t:uint =0; t

8

自定义字典替换法。  你有过“暴力破解”共享软件的经历吗?如果有过,那你一定知道“字典工具”。下面我们模拟“字典工具”做一个格式化算式的函数。在思想上,就是把中文算式看作是一个有序的密码,通过我们的编码字典来解释它,还原它的本来面目。有趣吧?var formula:String='{[[[(20+3)*5]]]-10-2.5}/ 2.5×(1134-500÷4)=';varsymbol:Array=['+','-','*','/','(',')','+','-','*','/','(',')','(',')','(',')','(',')','(',')','.','0','1','2','3','4','5','6','7','8','9','.','0','1','2','3','4','5','6','7','8','9','','','',''];//谜底var char:Array=['+','-','×','÷','(',')','+','-','*','/','(',')','[',']','[',']','{','}','{','}','.','0','1','2','3','4','5','6','7','8','9','.','0','1','2','3','4','5','6','7','8','9','=','=',' ',''];//谜面var dic:Array=[];//字典function makeDic() {//制作字典vark:uint=symbol.length;for(var t:uint =0; t

9

自定义“类”之一劳永逸法。  上面三种都是成熟的代码,都可以封装成类。以第三个办法为例:  这个类:在Lir包中,类名:Formula;构造函数为空;静态方法:replace,有一个参数,接受字符型中文算式。函数有返回值:英文字符型标准算式。   有了这个类,实在是太好了,应用起来大大地方便了。在时间轴上输入下面的代码:  import Lir .Formula  var formula:String='{[[[(20+3)*5]]]-10-2.5}/ 2.5×(1134-500÷4)=';  trace(Lir.Formula.replace(formula)); //调用类中的方法  就这上面这一点代码?对,就这一点代码!快运行程序,看下输出的结果:        (((((20+3)*5)))-10-2.5)/2.5*(1134-500/4)  我们又见到了这个早已熟悉的标准算式了!哈哈哈……我们都可以开心地笑了……                来自实践的体会绝对原创的经验                    作者:张志晨                    2012.5.6

推荐信息