疯狂Java讲义

编程入门 行业动态 更新时间:2024-10-06 14:37:38

疯狂Java<a href=https://www.elefans.com/category/jswz/34/1757931.html style=讲义"/>

疯狂Java讲义

原有文档基础上的改进

这个思路就是在原有if-else里继续细化各种可能出现的情况。但实际操作起来发现情况相当多,而且难以考虑全面。我绞尽脑汁,还是做不到考虑完全。下面是想了许久后的半成品。

import java.util.Arrays;public class Num2Rmb
{private String[] hanArr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};private String[] unitArr = {"十", "百", "千"};/*** 把一个浮点数分解成整数部分和小数部分字符串* @param num 需要被分解的浮点数* @return 分解出来的整数部分和小数部分。第一个数组元素是整数部分,第二个数组元素是小数部分*/private String[] divide(double num){// 将一个浮点数强制类型转换为long型,即得到它的整数部分var zheng = (long) num;// 浮点数减去整数部分,得到小数部分,小数部分乘以100后再取整得到2位小数var xiao = Math.round((num - zheng) * 100);// 下面用了两种方法把整数转换为字符串return new String[] {zheng + "", String.valueOf(xiao)};}/*** 把一个四位的数字字符串变成汉字字符串* @param numStr 需要被转换的四位的数字字符串* @return 四位的数字字符串被转换成汉字字符串*/private String toHanStr(String numStr){var result = "";int numLen = numStr.length();// 依次遍历数字字符串的每一位数字for (var i = 0; i < numLen; i++){// 把char型数字转换成int型数字,因为它们的ASCII码值恰好相差48// 因此把char型数字减去48得到int型数字,例如'4'被转换成4var num = numStr.charAt(i) - 48;// 第一位且第一位是0,忽略if (i == 0 && num == 0){continue;}// 不是0的第一位,正常情况else if (i == 0){result += hanArr[num] + unitArr[numLen - 2 - i];}// 上一位是0,这一位还是0,忽略else if (num == 0 && (numStr.charAt(1) - 48) == 0){continue;}// 如果不是最后一位数字,而且数字不是零,则需要添加单位(千、百、十)else if (i != numLen -1 && num != 0){result += hanArr[num] + unitArr[numLen - 2 -i];}// 最后一位是0,忽略else if (i == numLen - 1 && num == 0){continue;}// 最后一位是0,不需要添加单位else{result += hanArr[num];}}return result;}public static void main(String[] args){var nr = new Num2Rmb();// 测试把一个浮点数分解成整数部分和小数部分System.out.println(Arrays.toString(nr.divide(236677868.123)));// 测试把一个四位的数字字符串变成汉字字符串System.out.println(nr.toHanStr("6109"));System.out.println(nr.toHanStr("0111"));System.out.println(nr.toHanStr("1001"));System.out.println(nr.toHanStr("1110"));System.out.println(nr.toHanStr("1000"));System.out.println(nr.toHanStr("0010"));}
}

输出结果显示还是有些问题,1001转换为了壹千壹,但此时心情已经很崩溃了,各种条件考虑得心力憔悴。

转换思路

于是乎,我想到可以从高位到低位一位位提取数字,这样情况虽然也多,但更容易理顺,逻辑也更清晰。不过这里涉及到字符串转为整数的函数,百度了一下,可以用Integer.valueOf()。于是很顺畅地有了下面的结果:

import java.util.Arrays;public class Num2Rmb2
{private String[] hanArr = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};private String[] unitArr = {"十", "百", "千"};/*** 把一个浮点数分解成整数部分和小数部分字符串* @param num 需要被分解的浮点数* @return 分解出来的整数部分和小数部分。第一个数组元素是整数部分,第二个数组元素是小数部分*/private String[] divide(double num){// 将一个浮点数强制类型转换为long型,即得到它的整数部分var zheng = (long) num;// 浮点数减去整数部分,得到小数部分,小数部分乘以100后再取整得到2位小数var xiao = Math.round((num - zheng) * 100);//不转成字符串了,直接return两个整数return new String[] {zheng + "", String.valueOf(xiao)};}/*** 把一个四位字符串变成汉字字符串* @param numStr 需要被转换的四位的数字字符串* @return 四位的数字字符串被转换成汉字字符串*/private String toHanStr(String numStr){var result = "";// 把输入的数字字符串转换成整数int inputNum =(int) Integer.valueOf(numStr);// 接下来就一位一位转换// 千位,/ 除是去除余数的int thous =(int) inputNum / 1000;// 百位,要用这个数除1000后的余数(%),除以(/)100int hund =(int) (inputNum % 1000) / 100;// 十位,三种情况,是零:千百位都是零,百位不是零;不是零int ten =(int) (inputNum % 100) / 10;// 个位int singl =(int) inputNum % 10;// 千位,分两种情况,0就过,非0就正常处理if (thous == 0){}else{result += hanArr[thous] + unitArr[2];}// 百位,有三种情况,是0:千位是零,千位不是零但十位个位都是零,千位不是零十位个位有一个不是零;不是零;if (thous == 0 && hund == 0 || (thous != 0 && ten == 0 && singl == 0)){}else if (hund == 0){result += hanArr[hund];}else{result += hanArr[hund] + unitArr[1];}// 十位if (hund == 0 && ten == 0){}else if (hund != 0 && ten == 0){result += hanArr[ten];}else{result += hanArr[ten] +unitArr[0];}// 个位,三种情况,是零:千百十位都是零,十位不是零;不是零。但实际可分成两种情况处理if ((thous == 0 && hund == 0 && ten == 0 && singl == 0) || singl != 0){result += hanArr[singl];}else{}return result;}public static void main(String[] args){var nr = new Num2Rmb2();// 测试分解功能System.out.println(Arrays.toString(nr.divide(23857795.123)));// 测试转换功能System.out.println(nr.toHanStr("6109"));System.out.println(nr.toHanStr("0111"));System.out.println(nr.toHanStr("1001"));System.out.println(nr.toHanStr("1110"));System.out.println(nr.toHanStr("1000"));System.out.println(nr.toHanStr("0010"));}
}		

结果正确:

总结

虽然后面一个小程序还有很多功能没有添加,而且肯定还有更好的实现方法,但对我这个初学者来说做到这一步已经让我很高兴了。未来有机会可以再进一步优化一下。

另外,我觉得编程最重要的还是解决问题的思路。编程本身就只是一门语言,多多学习,自然就能用得很流畅。但如何用这门语言解决问题,才是真正考验功力的地方。就像人人都会讲话,而能将文章写得优美,演讲做得慷慨激昂的人就少之又少。

所以说,不仅应该提升自己写代码的水平,更要提升自己的思维能力。

更多推荐

疯狂Java讲义

本文发布于:2024-02-13 20:49:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1760533.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:讲义   疯狂   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!