作业目的
作业代码
已上传到Github中
GitHub
作业要求
- GUI已经由现成代码给出,因此只需要实现整数部分和小数部分的逆序转换。
- 要充分考虑代码健壮性,即要考虑到各种输入情况
作业难点
- 考虑到输入是有很多种不合法情况的,使用正则表达式对输入内容进行筛选。
- 要考虑超出字符串范围,因此不能使用Integer或者是Double,只能使用String或者BigDecimal
- 要考虑正负号
- 要考虑科学表达式
- 要考虑是整数、还是小数
- 要考虑前导0,和后置0
作业思路
有关正则表达式
这里用到了3次正则表达式
首先是对输入的检查,这里引用的是这里博客的正则表达式
引用地址
string regStr = "^[+-]?([0-9]*\.?[0-9]+|[0-9]+\.?[0-9]*)([eE][+-]?[0-9]+)?$";
其次是使用String类内置方法replaceAll时,去除前导0的正则表达式:
partOfInteger = partOfInteger.replaceAll("^(0+)", "");
去除后置0的正则表达式:
partOfDecimal = partOfDecimal.replaceAll("(0)+$", "");
有关BigDecimal
在BigDecimal中有很多使用的方法,帮助我们处理数据,如:
stripTrailingZeros
:能够去除后置0
toPlainString
:能够将科学表达式转变成正常的数字表示形式
并且一个有前置0的字符串,转换成BigDecimal之后会自动去除前置0.
关于翻转
String中没有翻转的内置方法,而StringBuilder里面有。
这里使用StringBuilder里的reverse方法
关于String.split()
由于split里面的参数是正则表达式,因此不能直接用"."
来对字符串进行分割,要用"\\."
作业代码
reverse.addMouseListener(new MouseAdapter() {
private String input;
private boolean sign;
public void mouseDoubleClick(MouseEvent e) {
input = inputNumber.getText();
if(!input.matches("^[+-]?([0-9]*\\.?[0-9]+|[0-9]+\\.?[0-9]*)([eE][+-]?[0-9]+)?$")) {
result.setText("您输入的不是一个十进制数,请重新输入!");}
else{
//去除前导0
BigDecimal inPutNumber = new BigDecimal(input);
//除去后导0
inPutNumber = inPutNumber.stripTrailingZeros();
//科学表达式转变为正常的表达
String sample = inPutNumber.toPlainString();
//正负号判断
if(sample.charAt(0) == '-') {
sign = true;
sample = sample.substring(1,sample.length());
}else {
sign = false;
}
//根据.进行切割
String[] results = sample.split("\\.");
//当数组长度为1时,说明只有整数部分,为2,说明为小数
if(results.length == 1) {
String res = reverse(results[0]);
//去掉前置0
res = res.replaceAll("^(0+)", "");
result.setText(useSign(res));
}else if(results.length == 2) {
//两边都先翻转
String partOfInteger = reverse(results[0]);
String partOfDecimal = reverse(results[1]);
//整数部分同上,去除前导0
partOfInteger = partOfInteger.replaceAll("^(0+)", "");
//小数部分,不能舍弃前导0,但是要去掉后倒0
partOfDecimal = partOfDecimal.replaceAll("(0)+$", "");
//结果拼接
result.setText(useSign(partOfInteger+"."+partOfDecimal));
}
}
}
private String reverse(String str) {
StringBuilder sb = new StringBuilder(str);
sb = sb.reverse();
return sb.toString();
}
private String useSign(String res) {
if(sign) {
return "-"+res;
}
return res;
}
作业总结
- 学会了多个新的正则表达式
- 学会了更多关于大数的处理
- 学会了更多String的操作