`
JavaScape
  • 浏览: 15133 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

Java试题 之 阿拉伯数字转换成中文数字

阅读更多
之前见过一道题觉着挺有意思
今天没什么事就回想着做了一把 拿出来和大家一起看看
希望各位能给点意见 一起讨论下


题目大概:
将一组阿拉伯数字转换成中文大写数字
52306 ==> 伍万贰千叁百零陆

我实现了将文件中的一组数字(每行为一个数)
形如:

25364
466932300
12350006
100000
66699553001

这样的文件中的数字全转换成中文大写数字


只是算法没有架构设计的成分
可以自定义一个输入文件既可运行
代码如下(源文件见附件):

import java.io.BufferedReader;
import java.io.FileReader;

public class Numeric2ChineseStr
{
    
    public static void main(String[] args)
        throws Exception
    {
        String fileName = "c:\\input.txt";
        
        // 单位数组
        String[] units = new String[] {"十", "百", "千", "万", "十", "百", "千", "亿"};
        
        // 中文大写数字数组
        String[] numeric = new String[] {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
        
        // 读文件
        BufferedReader br = new BufferedReader(new FileReader(fileName));
        String temp = null;
        temp = br.readLine();
        String res = "";
        
        while (null != temp)
        {
            // 遍历一行中所有数字
            for (int k = -1; temp.length() > 0; k++)
            {
                // 解析最后一位
                int j = Integer.parseInt(temp.substring(temp.length() - 1, temp.length()));
                String rtemp = numeric[j];
                
                // 数值不是0且不是个位 或者是万位或者是亿位 则去取单位
                if (j != 0 && k != -1 || k % 8 == 3 || k % 8 == 7)
                {
                    rtemp += units[k % 8];
                }
                
                // 拼在之前的前面
                res = rtemp + res;
                
                // 去除最后一位
                temp = temp.substring(0, temp.length() - 1);
            }
            
            // 去除后面连续的零零..
            while (res.endsWith(numeric[0]))
            {
                res = res.substring(0, res.lastIndexOf(numeric[0]));
            }
            
            // 将零零替换成零
            while (res.indexOf(numeric[0] + numeric[0]) != -1)
            {
                res = res.replaceAll(numeric[0] + numeric[0], numeric[0]);
            }
            
            // 将 零+某个单位 这样的窜替换成 该单位 去掉单位前面的零
            for (int m = 1; m < units.length; m++)
            {
                res = res.replaceAll(numeric[0] + units[m], units[m]);
            }
            
            // 这里打印一下 可以改成写文件
            System.out.println(res);
            
            // 读取下一个数
            res = "";
            temp = br.readLine();
        }
    }
}
分享到:
评论
13 楼 leeldy 2009-10-26  

package com.acm;

//Java试题 之 阿拉伯数字转换成中文数字
public class TransNumbers {

	String[] units = new String[] {"", "十", "百", "千", "万", "亿"};

	String[] numeric = new String[] {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
	
	public void transform(String numStr) {
		
		int i;
		int j;
		
		//取出前导空格和0
		for(i=0,j=numStr.length();i<j;i++){
			if(numStr.charAt(i)!='0' && numStr.charAt(i)!=' '){
				break;
			}
		}

		StringBuffer buffer = new StringBuffer();
		StringBuffer unit=new StringBuffer();
		unit.append("");
		//将数字反转
		String str = new StringBuffer(numStr.substring(i)).reverse().toString();
		String temp=null;
		int length = str.length();
		//数字分组转换
		for(i=0,j=length>4?4:length;i<length;i+=4,j+=4){

			int start=i;
			int end=j<length?j:length;
			//每4个为一组
			temp=this.trans4(str.substring(start,end));
			
			if(temp.length()>0){
				buffer.append(unit);
				buffer.append(temp);
			}

			int unitLength = unit.length();
			//单位变换
			if(unitLength>0 && unit.lastIndexOf("万")==(unitLength-1)){
				unit.setLength(unitLength-1);
				unit.append("亿");
			}else{
				unit.append("万");
			}
		}
		buffer=buffer.reverse();
		System.out.println(buffer.toString());
	}

	// 最多转换4位
	public String trans4(String str) {

		StringBuffer buffer = new StringBuffer();
		int num;
		int length = str.length();
		for(int i = 0, j = 0; i < length; i++, j++) {
			num = str.charAt(i) - '0';
			if(num > 0) {
				// 输出单位条件:当前位置数不为0,当前位置不为第一个位置
				buffer.append(this.units[j]);

				buffer.append(this.numeric[num]);
			} else {
				// 当前位置不为第一个位置输出一个零
				if(i > 0) {
					buffer.append(this.numeric[num]);
				}
				// 当前位置数为0
				// 跳过连续的0
				do {
					j++;
					i++;
				} while(i<4 && (str.charAt(i) - '0') == 0);
				i--;
				j--;
			}
		}
		return buffer.toString();
	}

	public static void main(String[] args) {

		TransNumbers tn = new TransNumbers();

		tn.transform("00001234");

	}
}



无聊,我也写个看下。
12 楼 徐风子 2009-09-08  
建议先学习一下会计里面的数字金额表示方法。
以前也写过类似的程序,比较麻烦的是不知道数该怎么读。
程序倒是方便,主要使用replaceAll,一通替换就够了,不过效率比较低,呵呵。
11 楼 sam1982 2009-09-06  
<pre name="code" class="java">public static String toChineseNum(long number) {
long num1 = 0,num2 = 0;
if (number == 0) {
return "零";
} else if (number == 1) {
return "一";
} else if (number == 2) {
return "二";
} else if (number == 3) {
return "三";
} else if (number == 4) {
return "四";
} else if (number == 5) {
return "五";
} else if (number == 6) {
return "六";
} else if (number == 7) {
return "七";
} else if (number == {
return "八";
} else if (number == 9) {
return "九";
} else if (number == 10) {
return "十";
} else if (number &gt; 99999999) {
num1 = number/100000000;
num2 = number%100000000;
return toChineseNum(num1) + "亿" + ( num2==0?"":( (num2 &lt; 10000000 ? "零":"") + toChineseNum(num2) ) );
} else if (number &gt; 9999 &amp;&amp; number &lt; 100000000) {
num1 = number/10000;
num2 = number%10000;
return toChineseNum(num1) + "万" + ( num2 ==0?"":( (num2 &lt; 1000 ? "零":"") + toChineseNum(num2)));
} else if (number &gt; 999 &amp;&amp; number &lt; 10000) {
num1 = number/1000;
num2 = number%1000;
return toChineseNum(num1) + "千" + ( num2 ==0?"":( (num2 &lt; 100 ? "零":"") + toChineseNum(num2)));
} else if (number &gt; 99 &amp;&amp; number &lt; 1000 ) {
num1 = number/100;
num2 = number%100;
return toChineseNum(num1) + "百" + ( num2 ==0?"":( (num2 &lt; 10 ? "零":"") + toChineseNum(num2)));
} else if (number &gt; 9 &amp;&amp; number &lt; 100) {
num1 = number/10;
num2 = number%10;
return toChineseNum(num1) + "十" + ( num2 ==0?"":(toChineseNum(num2)));
}
return "";
}</pre>
<p> 这是我的,使用递归,呵呵~</p>
10 楼 xixix2004 2009-07-30  
曾经写过一个把阿拉伯数字的钱如3,912,999.90元 转换成中文描述

我的解决方案思路和你差不多
9 楼 JavaScape 2009-07-25  
smilerain 写道
多个小数点就错误了

哈哈 不好意思 不是我错了 是你理解错了 我没说支持小数滴~。~
8 楼 smilerain 2009-07-19  
多个小数点就错误了
7 楼 JavaScape 2009-07-17  
顺便提一下子 我的用户名 很不错吧 嘎嘎! 还有头像也不耐! 赞一个 :)
6 楼 JavaScape 2009-07-17  
楼上果然强悍 是个有心人啊 其实上面的代码很多BUG 的 现在看代码的人少了 我想赚点人气的 结果 写的错了 也没人看或者没看出来 结果没人回复我 :(

现需原本的代码的可以给我留言 一起研究一下子 有问题欢迎提啊 !
5 楼 xxpniu 2009-07-14  
有问题!
比如 100000000  就错了!!
应该是壹亿 却说一亿万!!!
4 楼 allenofchina 2009-07-13  
刚刚看到,稍微思考一下,随便说说。

因为中文计数有点比较简单,比如第四位后面加千,第五位加万,第六位后面加十万,有一定规律可循。

可以分两步走,第一步是把阿拉伯数字替换成汉字
第二步是顺序循环,第几位后面加十或者百,零的的时候不加。到万过后,变成前面再加个十

3 楼 JavaScape 2009-07-13  
哈哈 原来有BUG 才有人回复 果然灵验 哈
2 楼 ansjsun 2009-07-12  
int j = Integer.parseInt(temp.substring(temp.length() - 1, temp.length()));  
有这句你就大不了了
1 楼 JavaScape 2009-07-08  
本方法支持无穷大的数字哦 只要内存里JVM放的下的就可以

相关推荐

Global site tag (gtag.js) - Google Analytics