中文数字转换成阿拉伯数字(一千二百三十四万五千六百七十八-->12345678)

昨天老大问我又没有写过中文数字转换成阿拉伯数字,我说没有,我说那应该简单啊,就是将中文对应的数字换成阿拉伯数字就好了啊,比如一就换成1,二就换成2…十换成10。可是那么问题来了…… 
一十二呢…不能是1102吧…这不就坑爹了吗?一百万呢………所有我苦苦思索,花费了我差不多半天的时间,终于写出了下面的程序。

 1 public static void main(String[] args){
 2
 3         Map<Character, String> numberMap = new HashMap<Character, String>();
 4         numberMap.put(‘零‘, "0");
 5         numberMap.put(‘一‘, "1");
 6         numberMap.put(‘二‘, "2");
 7         numberMap.put(‘三‘, "3");
 8         numberMap.put(‘四‘, "4");
 9         numberMap.put(‘五‘, "5");
10         numberMap.put(‘六‘, "6");
11         numberMap.put(‘七‘, "7");
12         numberMap.put(‘八‘, "8");
13         numberMap.put(‘九‘, "9");
14         Map<Character, String> numberBit = new HashMap<Character, String>();
15         numberBit.put(‘十‘, "10");
16         numberBit.put(‘百‘, "100");
17         numberBit.put(‘千‘, "1000");
18         numberBit.put(‘万‘, "10000");
19         /**
20          * 思路:循环遍历数字字符数组
21          *       举例:
22          *       九                                    把numberMap的key为九取出, 即9
23          *       九十                               把numberMap的key为九取出并乘以numberBit的key为十的值,即9*10=90
24          *       九十一                          把numberMap的key为九取出并乘以numberBit的key为十的值,然后加上numberMap的key为一 的值,即9*10+1=91
25          *       十一                               同上10+1=11
26          *       一百万                          先取出numberMap为一的key的值,然后乘以numberBit的key为百的值,然后乘以numberBit的key为万的值,即1*100*10000=1000000
27          *       一百八十八万           1*100+(8*10+8)*10000=100+88*10000=1880000
28          *
29          */
30         long number = 0;//1008571
31         String chinaNumberStr = "一千二百三十四万五千六百七十八";//12   叁佰贰十 320 三佰二十
32         char[] arrNumber = chinaNumberStr.toCharArray();
33         for (int i = 0; i < arrNumber.length; i++) {
34             char num = arrNumber[i];
35             if (i + 1 < arrNumber.length && numberBit.containsKey(arrNumber[i + 1])) {// 判断后面的汉字是否是位数(十百千万)
36                 if (numberMap.containsKey(num)) {// 如果当前的汉字不是位数
37
38                     if(i + 3 < arrNumber.length&&arrNumber[i + 1]==‘十‘&&numberMap.containsKey(arrNumber[i + 2])){
39                         number = number + Integer.parseInt(numberMap.get(num))* Integer.parseInt(numberBit.get(arrNumber[i + 1]));
40                         number = number + Integer.parseInt(numberMap.get(arrNumber[i + 2]));
41                         number = number * Integer.parseInt(numberBit.get(arrNumber[i + 3]));
42                         i=i+2;
43                     }else{// 取出当前对应的数字*位数对应倍数累加在number上
44                         number = number + Integer.parseInt(numberMap.get(num))* Integer.parseInt(numberBit.get(arrNumber[i + 1]));
45                     }
46                 } else if (numberBit.containsKey(num)) {// 如果当前的汉字是位数,即当前的汉字和后一个汉字都是位数(比如百万)
47                                                           //则用number直接*后一个位数
48                     number = number * Integer.parseInt(numberBit.get(arrNumber[i + 1]));
49                 }
50             } else if (numberMap.containsKey(num)) {
51                 number = number + Integer.parseInt(numberMap.get(num));
52             } else if (num == ‘十‘ && i == 0) {//“十”特殊处理 当出现十八之类的 十在前面的情况
53                 number = Integer.parseInt(numberBit.get(‘十‘));
54             }
55         }
56         System.out.println(number);
57     }

其实这个老大只是问我有没有写过类似的程序,并没有让我写它,但是我就是喜欢挑战。唉,主要是想看看我自己有没有这个能力写出这个程序来,我也是给朋友测了测,发现了一些BUG,改了不少,后面还是写出来了。不过还是有点不尽人意的地方,比如:”一千一”转换之后变成1001,这里应该是1100的,所有要想是1100必须是”一千一百”后面得加个百字。这就是这里的不足了。 
晕 
我刚刚加了一个numberBit.put(‘亿’, “100000000”); 想转下一亿试一试,结果不行,可能我还要继续改进下。这里暂时只能转换千万及千万以下的数字,不过对于一般的转换也足够了,如果转”壹仟壹佰”这种数字的直接改上面的map里面的key就行了。

我的这个算法有点过于复杂,每个程序的思路第一次都会比较复杂,后面多想几次会想出更加简便的算法,所以你们想出了更好的算法欢迎评论。我去改进我的代码了,之后我会把我改进的代码贴上来的。

                                 Alvin_先森
时间: 2024-12-26 19:36:37

中文数字转换成阿拉伯数字(一千二百三十四万五千六百七十八-->12345678)的相关文章

算法题--将英文数字转换成阿拉伯数字

将英文数字转换成阿拉伯数字 随机看了几道算法题,以下答案也是别人写的,非本人所写 思路: 三个进行一个划分 代码: public class POJ_2121 { public static void main(String[] args) { /** * negative, zero, one, two, three, four, five, six, seven, * eight, nine, ten, eleven, twelve, thirteen, fourteen, fifteen,

汇编语言(二、三、四、五、六、七、八)

时间过的真快. 本篇叫 <汇编语言 二.三.四.五.六.七.八> 我大概是想偷懒了,而且即将偷懒.学习汇编语言跟学习其他语言一样,都要多练,然后弄个称手的开发环境,以前发现windows 自带的debug 可以用来学习汇编,而且可以用debug工具写简单的汇编程序,并且可以生成扩展名为com的程序.debug从dos时代就有了,一直到vista.另外一个学习汇编语言的工具emu8086.这其实是一个集8086模拟器.设备模拟器.调试器.ide于一身的工具.emu8086本身自带一个汇编教程,虽

将中文数字转换成英文表示

public class NumberToWords { private final String[] tensNames = { "", " ten", " twenty", " thirty", " forty", " fifty", " sixty", " seventy", " eighty", " ninet

第三百九十一、二、三、四、五、六、七天 how can I 坚持

一周了,时间过得真快.昨天以为断网了,其实是电脑抽筋了. 4月28号,忙完一天就准备去青岛了,第一次坐z7开头的火车,坐着倒是挺舒服,至少睡觉挺舒服.晚上半睡半聊和lcj,想象中的爱情真的很美好,可是,现实,还是搞不懂自己. 4月29号早上到了青岛,还是当年的感觉,迷迷糊糊的去了从车站就走到了大海,好亲切,这次去了栈桥看了看看,mfp见了个面,为了陪我请了天假很是感动,中午在他家做的饭,买的皮皮虾还有gala,吃的好开心,就我们两.下午去了老季那,第一次坐海底隧道,见了些同学,晚上吃了好多海鲜,

在C#中将数字转换成中文

上篇我们讲了在MSSQL中将数字转换成中文,这篇我们讲讲在C#中将数字转换成中文 下篇将讲一下如何将金额转换成中文金额,废话不多说,具体代码如下: /// <summary> /// 数字转中文 /// </summary> /// <param name="number">eg: 22</param> /// <returns></returns> public string NumberToChinese(in

数字转换成中文大小写、金额大小写

将数字转换成中文大小写.金额大小写  /// <summary> /// 将数字转换成中文大写 /// </summary> /// <param name="Value">数字</param> /// <param name="bToUpper">是否转换成汉字大写 true表示大写 false表示小写</param> /// <param name="bMoney"

NFA转换成DFA——汉字形式数字转换成整数数字

偶然间遇到了一个需求:汉字形式数字转换成整数数字.如果不处理意外情况,可以写的很简单(比如不会出现三三等),详情可以看这里.但是,想着可以写成一个FA的形式,于是乎,发现并不是想象中的那么简单..因为写成FA就发现,要处理非法形式的问题,还是有点麻烦的. 好不容易写成了FA,发现是个NFA,于是乎写了个NFA转换成DFA的代码,也支持了一套简单的FA的定义规则.代码如下: package ie; import java.util.ArrayList; import java.util.HashM

oracle数据库使用游标实现大写数字转换成小写数字

项目遇到需求,需要将大写数字转换成小写.代码如下: declare t_zl varchar2(100); t_ts varchar2(100); t_l number; hh varchar2(100); xx varchar2(100); type TIArray is table of varchar2(100);  type TCArray is table of varchar2(100); A TIArray;  B TCArray; cursor c is select zl,ts

C#字母转换成数字/数字转换成字母 - ASCII码转换

字母转换成数字 byte[] array = new byte[1];   //定义一组数组arrayarray = System.Text.Encoding.ASCII.GetBytes(string); //string转换的字母int asciicode = (short)(array[0]); ASCII码 = Convert.ToString(asciicode); //将转换一的ASCII码转换成string型 数字转换成字母byte[] array = new byte[1];ar