使用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);
}
}
单目运算符的处理也到此完成。
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);
}
}
单目运算符的处理也到此完成。
相关文章推荐
- 使用Swing编写win7简易计算器6——菜单1
- 使用Swing编写win7简易计算器1——页面编程
- 使用Swing编写win7简易计算器2——输入输出处理
- 使用Swing编写win7简易计算器4——双目运算符
- 使用Swing编写win7简易计算器7——菜单2
- 使用Swing编写win7简易计算器5——M运算符
- win7 64位下 使用DOSBOX 进行汇编程序的编写调试
- 在Win7 x64中使用GNUstep和MinGW编写Objective-C的代码
- Win7下使用VS2013编写的ActvieX在XP下注册提示:LoadLibrary("XXX.dll")失败-找不到指定的程序
- 解决方案 VB编写的数据库程序在Win7 SP1编译无法在XP系统上使用的问题
- Win7环境使用VC2008编写DLL实现键盘钩子
- 在Win7 x64中使用GNUstep和MinGW编写Objective-C的代码
- java使用工厂模式编写计算器(swing界面)
- Win7下使用VS2013编写的ActvieX在XP下注册提示:LoadLibrary("XXX.dll")失败-找不到指定的程序
- 64位win7下使用C_API编写mysql程序的错误及解决办法记录
- 使用java语言编写简易计算器
- win7 64位系统使用VS2013编写MySQL代码
- 使用Swing组件编写一个支持中文文本编辑程序ChineseTextEdit.java
- win7下使用PHP Expert Editor编写php程序,传入已经搭配好LAMP环境的Ubuntu内的服务器上
- Win7 64位系统,使用(IME)模式VS2010 编写 和 安装 输入法 教程(1)