您的位置:首页 > 其它

使用Swing编写win7简易计算器3——单目运算符

2013-03-01 12:38 337 查看
       接下来,就轮到单目运算符了。如前所说,单目运算符是只需一个变量进行运算的符号,包括1/x、±和√。先说一下各按钮的功能:

      1/x:对一个数取倒数。

      ±:对一个数进行取反,即将正数变成绝对值相同的负数,反之亦然。如果是0则不变。

      √:对一个数进行平方根运算。

      这些运算在Math类当中均有现成函数,因此实现起来非常简单。但需要记得做围栅栏的措施:1/x运算x不能为0,而平方根运算不能对负数开方。新建一个Operation类,代码如下:

         /**

          * 单目运算符的处理

          *

          *@param text

          *            输入文本

          *@param index

          *            序列号码

          *@return 是简单符号则处理并返回结果,否则返回空字符串

          */

         public static StringunaryOperationAction(String text, int index) {

             double digit;

             switch (index) {

             case Button.NEG_SIGN:

                isResult = true;

                if ("0".equals(text)) {

                    return "0";

                } else if(text.startsWith("-")) {

                    return text.substring(1,text.length());

                } else {

                    return "-" + text;

                }

             case Button.SQRT:

                isResult = true;

                digit = Double.parseDouble(text);

                if (digit < 0) {

                    return "开方数不能为负数";

                }

                return resultFormat(Math.sqrt(digit));

             case Button.RECIPROCAL:

                isResult = true;

                digit = Double.parseDouble(text);

                if (digit == 0) {

                    return "除数不能为0";

                }

                return resultFormat(1 / digit);

             case Button.CE:

                empty();

                return "0";

             default:

                return "";

             }

         }

      ±和开方与前面说的一样,得出来的是结果,当再次点击数字键时会将显示区的内容清除,重新输入数字,除了CE及C以外的按键全部失效。为了完成这个效果,我在Operation类中添加了isResult字段,以记录是否为结果,Num_Index数组记录的则是数字按钮的序号,点击的如果不是数字键、C或CE,则按钮会失效。下面的refresh()则实现了判断是否为结果的功能,并返回相应结果:

         /**

          * 结果出来后输入数字会把结果清掉

          *

          *@return 重新输入的数字

          */

         public static String refresh(String text, intindex) {

             for (int i = 0; i <Number.NUM_INDEX.length; i++) {

                if (index == Number.NUM_INDEX[i]) {

                    isResult = false;

                    return Button.num[index];

                }

                if (index == Button.C || index ==Button.CE) {

                    return "0";

                }

             }

             return text;

         }

 

      最后要讲一讲输出结果的格式问题。仔细注意一下,计算器输出的结果并不是直接将计算出来的结果输出的,而是进行了一定程度的处理。我对输出的结果进行了以下处理:

      1. 输出结果和输入数字的长度不得超过15位(这是为了使显示区的内容不会挡住存储运算的M符号)。

      2. 输出的结果保留15位小数,多的进行四舍五入;如果结果满足在0<|x|<0.001或|x|>1000000000时,结果将会以科学计数法显示。

      第二条处理需要用到类DecimalFormat,规定好结果的格式后,使用format()方法即可获得所需结果的格式。主要代码如下:

      /**

          * 结果格式化,如果绝对值在0.001到1000000000之间且不等于0,保留15位小数,去掉后面多余的0,否则使用科学计数法表示

          *

          *@param res

          *            计算结果

          *@return 格式化后的结果

          */

         public static String resultFormat(double res){

             if ((Math.abs(res) < 0.001 ||Math.abs(res) > 1000000000) && res != 0) {

                DecimalFormat sn = newDecimalFormat("0.############E0");

                String format = sn.format(res);

                // 保证结果长度最多15位

                return format.length() > 15 ?format.substring(0, format

                       .indexOf("E")

                       -format.substring(format.indexOf("E"), format.length())

                              .length())

                       +format.substring(format.indexOf("E"), format.length())

                       : format;

             } else {

                DecimalFormat dec = newDecimalFormat("0.#############");

                 returndec.format(res);

             }

         }

      单目运算符的处理也到此完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息