我也写了下代码,像转换类的,用一个字符串数组是很省事的做法,超过超过10w的数,想了想,觉得有点麻烦,就没写了
- import java.util.Scanner;
- public class ToChineseForm {
- private static String[] num = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
- private static String[] unit = {"", "拾", "佰", "仟", "万"};
-
- /**
- * 将输入的整数转换成中文大写形式,本方法接收int型入参
- * @param input
- * @return
- */
- public static String toChineseForm(int input){
- //将待转换的数值转换成字符串
- String n = new String(new Integer(input).toString());
- return toChineseForm(n);
- }
-
- /**
- * 将输入的整数转换成中文大写形式,本方法接收String型入参
- * @param n
- * @return
- */
- public static String toChineseForm(String n){
- //如果是0元,这直接返回“零元”
- if(n.equals("0")){
- return "零元";
- }
-
- String ret = new String();
-
- //只能转换100000以内的数
- int nLength = n.length() - 1;
- if(nLength > 4){
- return "Input is too big";
- }
-
- //转换
- for(int i = 0; i <= nLength; i++){
- //获得各个位上的数值
- int spotNum = (int)n.charAt(i)-48;
- //如果存在非数字字符,则返回错误
- if(spotNum < 0 || spotNum > 9){
- return "Input error";
- }
- //数值的大写字符加上位的大写字符(如1023为“壹仟零佰贰拾叁”,为了使之符合规则,还需要对“零进行调整”)
- ret += num[spotNum] + unit[nLength - i];
- }
-
- //对字符串中的0进行调整
- boolean f = true;
- char[] rret = ret.toCharArray();
- int tag = 0;
- for(int i = rret.length - 1; i >= 0; i = i - 2){
- if(rret[i] != '零'){
- //如果是第一次执行这段代码,那么f就是true,那么开始的零全都取消,如100为“壹佰零拾零”转换为“壹佰”
- if(f){
- f = false;
- continue;
- }
- //如果并非是第一次也就是中间有多个零,那么保留一个零
- if(rret[tag] == '0'){
- rret[tag + 1] = '零';
- }
- }else{
- //先把值为“零”的位及它的单位全部标志成0,如“壹佰零拾零”变成了“壹佰000”
- rret[i] = '0';
- if(i < rret.length - 2){//第一个零没有后一位
- rret[i + 1] = '0';
- }
- //记录当前为'零'的位置
- tag = i;
- }
- }
-
- //获得最后的结果,去掉字符数组中的0值
- ret = "";
- for(int i = 0; i < rret.length; i++){
- if(rret[i] != '0'){
- ret += rret[i];
- }
- }
-
- //返回前加上币值单位
- return ret + "元";
- }
- public static void main(String[] args) {
- Scanner sc = new Scanner(System.in);
- System.out.println("Input num:");
- System.out.println(toChineseForm(sc.next()));
- sc.close();
-
- }
- }
复制代码
|