A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package com.itheima;
/*
10、  金额转换,阿拉伯数字转换成中国传统形式。

例如:101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整
*/
import java.util.*;
public class Test10{
        public static void main(String[] args){
                Scanner in=new Scanner(System.in);
                int num=in.nextInt();
                System.out.println(hangeToBig(num));
        }
        public static String hangeToBig(int value) {
                char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示
                char[] vunit = { '万', '亿' }; // 段名表示
                char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示
                long midVal = (long) (value * 100); // 转化成整形
                String valStr = String.valueOf(midVal); // 转化成字符串

                String head = valStr.substring(0, valStr.length() - 2); // 取整数部分
                String rail = valStr.substring(valStr.length() - 2); // 取小数部分

                String prefix = ""; // 整数部分转化的结果
                String suffix = ""; // 小数部分转化的结果
                // 处理小数点后面的数
                if (rail.equals("00")) { // 如果小数部分为0
                suffix = "整";
                } else {
                suffix = digit[rail.charAt(0) - '0'] + "角"
                                + digit[rail.charAt(1) - '0'] + "分"; // 否则把角分转化出来
                }
                // 处理小数点前面的数
                char[] chDig = head.toCharArray(); // 把整数部分转化成字符数组
                char zero = '0'; // 标志'0'表示出现过0
                byte zeroSerNum = 0; // 连续出现0的次数
                for (int i = 0; i < chDig.length; i++) { // 循环处理每个数字
                int idx = (chDig.length - i - 1) % 4; // 取段内位置
                int vidx = (chDig.length - i - 1) / 4; // 取段位置
                if (chDig[i] == '0') { // 如果当前字符是0
                        zeroSerNum++; // 连续0次数递增
                        if (zero == '0') { // 标志
                                zero = digit[0];
                        } else if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
                                prefix += vunit[vidx - 1];
                                zero = '0';
                        }
                        continue;
                }
                zeroSerNum = 0; // 连续0次数清零
                if (zero != '0') { // 如果标志不为0,则加上,例如万,亿什么的
                        prefix += zero;
                        zero = '0';
                }
                prefix += digit[chDig[i] - '0']; // 转化该数字表示
                if (idx > 0)
                        prefix += hunit[idx - 1];
                if (idx == 0 && vidx > 0) {
                        prefix += vunit[vidx - 1]; // 段结束位置应该加上段名如万,亿
                }
        }

        if (prefix.length() > 0)
                prefix += '圆'; // 如果整数部分存在,则有圆的字样
        return prefix + suffix; // 返回正确表示
        }
}

11 个回复

倒序浏览
入学考试的一道题;P
回复 使用道具 举报
中文计数比英文计数规律性更强。英文要处理-teen、-ty词尾的数字挺麻烦的
回复 使用道具 举报
我曾经的笔试题,就是这样的。。。。。
回复 使用道具 举报
争取15号前面试
回复 使用道具 举报
不知道你发现了没有,数字如果偏大一点,就会发生数组角标越界异常!!!
回复 使用道具 举报
因为用的是int吧
回复 使用道具 举报
这个我的重点看看,几率很高的一道题
回复 使用道具 举报
程序有问题,你输入1亿看输出多少?
回复 使用道具 举报
bug!这程序有大bug!
回复 使用道具 举报
感觉不正常
回复 使用道具 举报
娃娃哈哈,不错不错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马