将阿拉伯数字转化为汉字,最多能输入12位数字

package com.sinitek.demo02;

import java.util.Scanner;

/**
 * 描述:
 * 1. 算法—数值转化:将阿拉伯数字转化为汉字,最多能输入12位数字
 * 例子:
 * 101000  一十万一千
 * 100001  一十万零一
 * 100000000001  一千亿零一
 * 200000000000  二千亿
 * 102030405060  一千零二十亿三千零四十万五千零六十
 * 123456789010  一千二百三十四亿五千六百七十八万九千零一十
 * 200001001000  二千亿零一百万一千
 * 200010001000  二千亿一千万一千
 * 要求:
 * a.只允许使用8种基本数据类型实现算法主体部分
 * b.根据0所在的位置,选择是否需要读出,如200010001000二千亿一千万一千200001001000二千亿零一百万一千
 * c.能够在控制台输入和输出
 */


public class Demo {

    private static String[] weight = {" ", "十", "百", "千"};
    private static String[] weightB = {"亿", "万"};
    private static String[] numberC = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
    private static Scanner scan = new Scanner(System.in);

    public static void main(String[] args) {
        while (true) {
            System.out.println("输入数字:");
            Long number = scan.nextLong();

            //数字转为字符串
            char[][] chars = numberToChar(number);

            //解析为汉字字符
            String analyze = analyze(chars);

            System.out.println(analyze);
        }

    }


    // 将数字转换成char的二位数组
    public static char[][] numberToChar(Long number) {
        //每四位进行解析
        char[][] chars = new char[3][4];
        // 赋初值
        for (int i = 0; i < chars.length; i++) {
            for (int i1 = 0; i1 < chars[i].length; i1++) {
                chars[i][i1] = '0';     //以0占位
            }
        }

        // 输入值
        String numberStr = number + "";

        // 将数字转换成数组
        char[] chars1 = numberStr.toCharArray();
        // 将值复制到二维数组中,将取出的数字依次进行赋值
        int indexI = 2;
        int indexJ = 3;
        for (int i = chars1.length - 1; i >= 0; i--) {
            chars[indexI][indexJ] = chars1[i];
            indexJ--;
            if (indexJ < 0) {
                indexJ = 3;
                indexI--;
            }
        }
        return chars;
    }

    // 解析
    public static String analyze(char[][] chars) {
        String numberStr = "";
        for (int i = 0; i < chars.length; i++) {
            // 分组解析数组,返回解析后的字符串
            String parse = parse(chars[i]);

            //每四位进行数据拼接
            if (countNumber(chars[i]) != 4) {
                if (i < 2) {
                    numberStr += parse + weightB[i];
                } else {
                    numberStr += parse;
                }
            }
        }
        //去除最前面的零
        if (numberStr.indexOf('零') == 0) {
            numberStr = numberStr.substring(1);
        }
        // 去除全部的空格
        numberStr = numberStr.replaceAll(" ", "");
        return numberStr;
    }


    // 分组解析数组
    public static String parse(char[] chars) {
        String str = "";
        // 取出数组,并转换成数字
        int number = Integer.parseInt(new String(chars));
        // 解析number
        // 将number的值解析成汉字
        int count = 0;
        while (number != 0) {
            int weight_number = number % 10;   //判断最后一位是否为0
            number = number / 10;
            if (weight_number != 0) {
                //拼接数字,单位,并转成字符串
                str = numberC[weight_number] + weight[count++] + str;
            } else {
                //结果为0则就不用拼接单位
                str = numberC[weight_number] + str;
                count++;
            }
        }


        // 清除后面的零
        str = str.substring(0, str.length() - ling(str));

        //消除中间重复的零
        str = str.replaceAll("零零", "零");
        // 是否前面添加零
        if (chars[0] == '0') {
            str = "零" + str;
        }
        return str;
    }

    // 统计零的个数
    public static int countNumber(char[] chars) {
        int count = 0;
        for (char aChar : chars) {
            if (aChar == '0') {
                count++;
            }
        }
        return count;
    }

    // 统计后面的零
    public static int ling(String string) {
        int count = 0;
        for (int length = string.length() - 1; length >= 0; length--) {
            if (string.charAt(length) == '零') {
                count++;
            } else {
                break;
            }
        }
        return count;
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值