广州大学《网络编程》第一讲作业 —— 使用Java编写一个转换十进制小数的GUI程序

作业目的

在这里插入图片描述

作业代码

已上传到Github中
GitHub

作业要求

  1. GUI已经由现成代码给出,因此只需要实现整数部分和小数部分的逆序转换。
  2. 要充分考虑代码健壮性,即要考虑到各种输入情况

作业难点

  1. 考虑到输入是有很多种不合法情况的,使用正则表达式对输入内容进行筛选。
  2. 要考虑超出字符串范围,因此不能使用Integer或者是Double,只能使用String或者BigDecimal
  3. 要考虑正负号
  4. 要考虑科学表达式
  5. 要考虑是整数、还是小数
  6. 要考虑前导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;
	}

作业总结

  1. 学会了多个新的正则表达式
  2. 学会了更多关于大数的处理
  3. 学会了更多String的操作
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值