JAVA疯狂讲义 第四版 课后习题 第四章 4.5

出来混总要还的..
最近在把《疯狂JAVA讲义》再看一遍,书真的是要多读几遍 每次读都会有不同的收获和感受
以往我都只是看看课后题 从没做过,所以这次我打算做一遍一些有意义的题目
应该是比较low的,但是毕竟是个学习的过程,记录一下,以后再翻开来看看。
题目是:编写程序,将浮点数转换成人命币读法的字符串。
直接上代码 也比较简单。稍稍改编了一下。

package chapter4;

import java.util.Arrays;
import java.util.Scanner;

public class ChangeRMBFromFloatToString {

        private String[] hanArr = {
                "零","壹","贰","叁","肆",
                "伍","陆","柒","捌","玖"
                };
        private String[] unitArr = {"分","角","元","十","百","千","万",""};
        //private String[] unitDecimalArr = {"分"}

        //这里直接用long保留整数部分了
        private String[] divide(double num)
        {

            long zheng =  (long)num;
            long xiao = Math.round((num - zheng) * 100);
            return new String[]{zheng + "", String.valueOf(xiao)};      
        }

        /*
         * 这里设计使用一个flag来做分割 整数部分和分数部分
         * 本来想把单位分为两个数组 在处理的时候 将unitArr这个数组分成
         * 两个一个是{"元","十","百","千","万"} 一个是{"分","角"}
         * 在处理不同的部分时传入 不同的数组
         * 程序 还是不完整 要在result那边修修补补
         * 等有空了再改改
         * */
        private String toHanStr(String numStr,int flag)
        {
            String result = "";
            int numLen = numStr.length();
            if(flag == 1) {
                for (int i = 0 ; i < numLen ; i++ )
                {
                    int num = numStr.charAt(i) - 48;
                    if ( i != numLen - 1 && num != 0)
                    {
                        result += hanArr[num] + unitArr[numLen - i + 1];
                    }
                    else {
                        result += hanArr[num];
                    }
                }
                result = result + unitArr[2];
            }
            else {
                for (int i = 0 ; i < numLen ; i++ )
                {
                    int num = numStr.charAt(i) - 48;
                    if ( i != numLen - 1 && num != 0)
                    {
                        result += hanArr[num] + unitArr[numLen - i -1];
                    }
                    else {
                        result += hanArr[num];
                    }
                }
                result = result + unitArr[0];
            }
            return result;
        }

        /*
         * 去除多个零
         * 运用方法是遍历每个字符
         * 前一个和后一个 甚至后几个做对比
         * 因为这里我们有千  万 这种单位做隔,因此仅会出现 连续多个零的情况
         * 如果相同 则跳过
         * 如果不同 则将 j的值 赋值给i 即i也跳过那么多个重复的零
         * 最后将newString返回
         * */

        public static String removeZero(String oldString) {
            String newString = "";
            int length = oldString.length();
            int i = 0;
            int j = i + 1;
            newString = newString + oldString.charAt(i);
            for(;j<length;) {
                if(oldString.charAt(i)==oldString.charAt(j)) {
                    j = j+1;
                }else {
                    i = j;
                    j += 1;
                    newString = newString + oldString.charAt(i);
                }
            }
            return newString;
        }

        public static void main(String[] args) 
        {        
            ChangeRMBFromFloatToString nr = new ChangeRMBFromFloatToString();
            Scanner scanner = new Scanner(System.in);
            while(true) {
            System.out.println("请输入要换算的数字,整数部分请不要超过五位数哦哦!");

            double inputNumber = scanner.nextDouble();

            String[] zhengPart = nr.divide(inputNumber);

            String integerPart = zhengPart[0];
            String decimalPart = zhengPart[1];

            //加个判断吧 整数长度不能过长
            if(integerPart.length() > 5) {
                System.out.println("过长了  请重新输入");
            }else {
                System.out.println("整数部分:"+nr.toHanStr(zhengPart[0], 1));
                System.out.println("分数部分:"+nr.toHanStr(zhengPart[1], 0));
                String all = nr.toHanStr(zhengPart[0], 1) + nr.toHanStr(zhengPart[1], 0);
                System.out.println(all);
                System.out.println(removeZero(all));
            }
        }
     }
}

结果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/Wangfulin07/article/details/81333237