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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 袁志娜 高级黑马   /  2016-8-26 21:49  /  1439 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

问题:金额转换,阿拉伯数字转换成中国传统形式。
101000001010   转换为   壹仟零壹拾亿零壹仟零壹拾圆整    ,求解

9 个回复

倒序浏览
先不说程序怎么写,为什么我觉得亿和千之间加零很别扭?
回复 使用道具 举报
这是遇到题,只有解决的办法,谢谢,我查了一下资料做出来了
回复 使用道具 举报
百度一下...
回复 使用道具 举报
谢谢噢噢噢噢哦哦哦
回复 使用道具 举报
[AppleScript] 纯文本查看 复制代码
package com.itheima;

import java.util.Scanner;

/**
 * 目的:金额转换,阿拉伯数字转换成中国传统形式。
 * 
 * @author liuwei
 * @version V1.0
 * 
 */
/*
 * 分析:把数字转换成金额,首先应该考虑这个数字的大小(进行分段判断), 1,首先判断数字的范围 2,每一个数字进行转换 3,字符串进行拼接
 * 壹贰叁肆伍陆柒捌玖拾
 */
public class Test9 {
	public static void main(String[] args) {
		// 键盘录入一个数字
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个数字:");
		long num = sc.nextLong();

		// 创建一个StringBuilder 用于接收对象
		StringBuilder sb = new StringBuilder();

		// 分段进行判断 小于1万
		if (num < 10000) {
			sb = convert1(num);
			sb.append("整");
			System.out.println(sb);
		} else if (num < 100000000) {
			sb = convert2(num);
			sb.append("整");
			System.out.println(sb);
		} else if (num < Long.MAX_VALUE) {
			sb = convert3(num);
			sb.append("整");
			System.out.println(sb);
		} else {
			System.out.println("您输入的数字超出了范围");
		}

	}

	/**
	 * 把小于1万以下的数字转换成字符串
	 * 
	 * @param num
	 */
	private static StringBuilder convert1(long num) {
		StringBuilder sb = new StringBuilder();
		String str = new String();

		// 定义成字符数组,是因为可以直接通过索引值,获取指定字符串,比switch语句更好
		String[] weiStr = { "", "拾", "佰", "仟", "万", "亿" };
		String[] numStr = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };

		
		// count 用于记录索引位置,方便查找对应的 数字 转化成汉字
		int count = 0;
		char[] chs = String.valueOf(num).toCharArray();
		for (int x = 0; x < (chs.length); x++) {
			
			// 由于 0 的读法不同需要特别对待,读0 时候不需要加千 百等字样。
			if (num % 10 == 0) {
				// String s1 = weiStr[count++];
				count++;
				String s2 = numStr[(int) (num % 10)];
				num = num / 10;
				str.contains(s2);

				sb.append(s2);
			} else {
				String s1 = weiStr[count++];
				String s2 = numStr[(int) (num % 10)];
				num = num / 10;

				str.concat(s1).concat(s2);
				sb.append(s1).append(s2);
			}

		}

		// 为了使用 sb 不具备的替换方法,进行转化成 字符串,替换完成,在转化成 sb
		str = sb.toString();

		// 如果有多个零,只读一个零
		while (str.contains("零零")) {
			str = str.replace("零零", "零");
		}

		// 不能以零结尾,使用startsWith,是因为,读取的时候是倒着添加到字符串的。
		if (str.startsWith("零")) {
			str = str.substring(1, str.length()).trim();
		}

		sb = new StringBuilder(str);

		// 把字符串的顺序改过来。
		return sb.reverse();

	}

	/**
	 * 把1万以上1亿以下的数字转换成字符串
	 * 
	 * 分成两个部分,一万以下,使用上一个方法读,加一个万字
	 * 
	 * @param num
	 * @return
	 */
	private static StringBuilder convert2(long num) {
		StringBuilder sb = new StringBuilder();

		sb.append(convert1(num / 10000)).append("万")
				.append(convert1(num % 10000));

		return sb;

	}

	/**
	 * 把1亿以上的数字转换成字符串
	 * 
	 * 分成两个部分,一亿以下,使用上一个方法读,加一个亿字
	 * 
	 * @param num
	 * @return
	 */
	private static StringBuilder convert3(long num) {
		StringBuilder sb = new StringBuilder();

		sb.append(convert2(num / 100000000)).append("亿")
				.append(convert2(num % 100000000));

		// 如果万位置上 没有数值,就把 万位去掉
		String str = sb.toString();

		while (str.contains("零万")) {
			str = str.replace("零万", "");
		}

		sb = new StringBuilder(str);

		return sb;

	}
}

这是我自己做的,我自己也知道有些地方有问题,仅供参考
回复 使用道具 举报
说说我的思路吧,首先了解规则
一、读多位数的方法是先把这个多位数分级。从高位到低位一级一级地往下读。读亿级、万级时,按个级的读法去读,只要在后面再加上级的单位“亿”或“万”。每级开头或中间有一个0,或者连续有几个0的,都只读一个零。
二。先分级,可分成三级:亿级       万级        个级
三。从高位到低位一级一级地往下读,后面加上级的单位
四。合起来
回复 使用道具 举报
学安卓的路过。。
回复 使用道具 举报
可以~~~~
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马