有没有汉字数字转换成阿拉伯数字的代码?谢谢

kenli 2003-07-03 05:15:20
有没有汉字数字转换成阿拉伯数字的代码?
比如九-〉9
九十一-〉91
...全文
670 22 打赏 收藏 举报
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
kenli 2003-07-08
谢谢各位,我自己写了一个简单的。谢谢了。
  • 打赏
  • 举报
回复
kenli 2003-07-04
没人知道?顶一下。
  • 打赏
  • 举报
回复
hlding 2003-07-04
顺便说一下,在运行时,要保证你的参数包含的中文字符是正确的,因为我没有对非法字符进行异常捕捉,但你自己可以加上
  • 打赏
  • 举报
回复
hlding 2003-07-04
public class Convert {
public static void main(String[] args) throws Exception {
String b[]={"万","亿"};
String s=args[0];
String yi="";
String wan="";
String other="";
int yinum=0;
int wannum=0;
long totalNum=0;
for(int i=b.length-1;i>=0;i--)
if(s.indexOf(b[i])!=-1){
if(b[i].equals("亿")){
yinum=s.indexOf(b[i]);
yi=s.substring(0,yinum);
totalNum=totalNum+NumValue(yi)*100000000;
}
else if(b[i].equals("万")){
if(yinum!=0){
wannum=s.indexOf(b[i]);
wan=s.substring(yinum+1,wannum);
}
else{
wannum=s.indexOf(b[i]);
wan=s.substring(0,wannum);
}
totalNum=totalNum+NumValue(wan)*10000;
}
}
if(yinum!=0 || wannum!=0){
if(wannum!=0){
other=s.substring(wannum+1,s.length());
}
else if(yinum!=0 && wannum==0){
other=s.substring(yinum+1,s.length());
}
}
else{
other=s;
}
totalNum=totalNum+NumValue(other);
System.out.println("转换前的值为:"+s);
System.out.println("转换后的值为:"+totalNum);
}
public static long NumValue(String s){
String c[]={"拾","佰","仟"};
int num=0;
String qian="";
String bai="";
String shi="";
String other="";
int qianNum=0;
int baiNum=0;
int shiNum=0;
for(int i=c.length-1;i>=0;i--)
if(s.indexOf(c[i])!=-1){
if(c[i].equals("仟")){
qianNum=s.indexOf(c[i]);
qian=s.substring(0,qianNum);
num=num+ConvertToNum(qian)*1000;
}
else if(c[i].equals("佰")){
if(qianNum!=0){
baiNum=s.indexOf(c[i]);
bai=s.substring(qianNum+1,baiNum);
}
else{
baiNum=s.indexOf(c[i]);
bai=s.substring(baiNum-1,baiNum);
}
num=num+ConvertToNum(bai)*100;
}
else if(c[i].equals("拾")){
if(baiNum!=0){
shiNum=s.indexOf(c[i]);
shi=s.substring(baiNum+1,shiNum);
}
else if(qianNum!=0 && baiNum==0){
shiNum=s.indexOf(c[i]);
shi=s.substring(qianNum+1,shiNum);
}
else if(qianNum==0 && baiNum==0){
shiNum=s.indexOf(c[i]);
shi=s.substring(shiNum-1,shiNum);
}
num=num+ConvertToNum(shi)*10;
}
}
if(qianNum!=0 || baiNum!=0 || shiNum!=0){
if(shiNum!=0){
other=s.substring(shiNum+1,s.length());
}
else if(baiNum!=0){
other=s.substring(baiNum+1,s.length());
}
else if(qianNum!=0){
other=s.substring(qianNum+1,s.length());
}
}
else{
other=s;
}
num=num+ConvertToNum(other);
return num;
}
public static int ConvertToNum(String s){
int Num=0;
if(s.equals("零"))
Num=0;
else if(s.equals("壹"))
Num=1;
else if(s.equals("贰"))
Num=2;
else if(s.equals("叁"))
Num=3;
else if(s.equals("肆"))
Num=4;
else if(s.equals("伍"))
Num=5;
else if(s.equals("陆"))
Num=6;
else if(s.equals("柒"))
Num=7;
else if(s.equals("捌"))
Num=8;
else if(s.equals("玖"))
Num=9;
return Num;
}
}
  • 打赏
  • 举报
回复
hlding 2003-07-04
今天下午随便写了一个,还没有对异常做处理,但在一般的情况下还是可行的
  • 打赏
  • 举报
回复
xiaohaiz 2003-07-04
顺便抽了一些测试,还没有发现实现的问题,但是程序对于异常输入的处理还是欠缺的.
再接再厉.
public void testHZToNum() {
String hz = "十九亿";
long l = new HZToNum(hz).turnAll();
assertEquals(1900000000L, l);
hz = "七亿";
l = new HZToNum(hz).turnAll();
assertEquals(700000000L, l);
hz = "七亿五千万";
l = new HZToNum(hz).turnAll();
assertEquals(750000000L, l);
hz = "七亿五千三百万";
l = new HZToNum(hz).turnAll();
assertEquals(753000000L, l);
hz = "七亿五千三百二十万";
l = new HZToNum(hz).turnAll();
assertEquals(753200000L, l);
hz = "七亿五千三百二十二万";
l = new HZToNum(hz).turnAll();
assertEquals(753220000L, l);
hz = "七亿五千三百二十二万六千";
l = new HZToNum(hz).turnAll();
assertEquals(753226000L, l);
hz = "七亿五千三百二十二万六千八百";
l = new HZToNum(hz).turnAll();
assertEquals(753226800L, l);
hz = "七亿五千三百二十二万六千八百九十";
l = new HZToNum(hz).turnAll();
assertEquals(753226890L, l);
hz = "七亿五千三百二十二万六千八百九十九";
l = new HZToNum(hz).turnAll();
assertEquals(753226899L, l);
hz = "五千万";
l = new HZToNum(hz).turnAll();
assertEquals(50000000L, l);
hz = "五百万";
l = new HZToNum(hz).turnAll();
assertEquals(5000000L, l);
hz = "五十万";
l = new HZToNum(hz).turnAll();
assertEquals(500000L, l);
hz = "七亿一千零一";
l = new HZToNum(hz).turnAll();
assertEquals(700001001L, l);
}
  • 打赏
  • 举报
回复
limingxi007 2003-07-04
在for循环里加一条 if(str.substring(i,i+1).equals(util[0])&&i==0){
temp=temp+toUtil(1,str.substring(i,i+1));
}
好像就可以了,写的仓初,估计还有不少 bug,大家慢慢改吧!
  • 打赏
  • 举报
回复
limingxi007 2003-07-04
谢谢相告,写的代码效率太低了,见笑了,呵呵
  • 打赏
  • 举报
回复
xiaohaiz 2003-07-04
用junit做的单元测试,opensource,作者之一是鼎鼎大名的Erich Gamma.
在敏捷方法支持者中这是重要的工具之一.
http://www.junit.org
  • 打赏
  • 举报
回复
xiaohaiz 2003-07-04
to limingxi007(喜子):
写这么多确实挺辛苦的,强烈建议楼主把大部分 分都给他.(如果没有别人写得更好)

再建议你先把各种情况测试代码写好再去实现.对了,这种转换功能又不需要保存状态,写个静态方法可能就好了.
  • 打赏
  • 举报
回复
limingxi007 2003-07-04
楼上的,问一下用得什么测试工具阿
  • 打赏
  • 举报
回复
limingxi007 2003-07-04
sorry!没有考虑单位在前面的情况,可以修改修改!呵呵
  • 打赏
  • 举报
回复
limingxi007 2003-07-04
给点分阿,我写了两个小时呢!
  • 打赏
  • 举报
回复
xiaohaiz 2003-07-04
楼上的,先不说实现得好不好,但是至少实现得不对,一个测试就出错了.
public class TestHZToNum extends TestCase {
public TestHZToNum(String name) {super(name);}

public void testHZToNum() {
String hz = "十九亿";
long l = new HZToNum(hz).turnAll();
assertEquals(1900000000L, l);
}
}

运行测试的结果:
=======================================================
.F
Time: 0.017
There was 1 failure:
1) testHZToNum(TestHZToNum)junit.framework.AssertionFailedError: expected:<1900000000> but was:<900000000>
at TestHZToNum.testHZToNum(TestHZToNum.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at com.intellij.rt.execution.junit.TextTestRunner.main(TextTestRunner.java:12)

FAILURES!!!
Tests run: 1, Failures: 1, Errors: 0

不能帮别人写程序,测试也很开心.
  • 打赏
  • 举报
回复
limingxi007 2003-07-04
我做了一个,不过只能到20亿,若要再大,可以换数据类型,你自己弄吧!
import java.util.*;
import java.math.BigInteger;

public class HZToNum{

private String s="";
private String[] num={"零","一","二","三","四","五","六","七","八","九"};
private String[] util={"十","百","千"};

public HZToNum(String str){
this.s=str;
}

private int selectObj(String object,String s){
int i;
i=object.indexOf(s);
return i>0?i:0;
}

public long turnAll(){
String temp;
String remainStr;
//BigInteger tempLong=new BigInteger("FFFFFFFFFFFFFFF", 16);
long tempLong=0;
int index=selectObj(s,"亿");
if(index>0){
temp=s.substring(0,index);
remainStr=s.substring(index+1,s.length());
//tempLong=tempLong.add(new BigInteger(String.valueOf(toNum(temp)*100000000)));
tempLong=tempLong+toNum(temp)*100000000;

index=selectObj(remainStr,"万");
if(index>0){
temp=remainStr.substring(0,index);
int len=remainStr.length();
remainStr=remainStr.substring(index+1,len);
tempLong=tempLong+toNum(temp)*10000;
//tempLong=tempLong.add(new BigInteger(String.valueOf(toNum(temp)*10000)));
}
tempLong=tempLong+toNum(remainStr);
//tempLong=tempLong.add(new BigInteger(String.valueOf(toNum(remainStr))));
}
else{
index=selectObj(s,"万");
if(index>0){
temp=s.substring(0,index);
remainStr=s.substring(index+1,s.length());
tempLong=tempLong+toNum(temp)*10000;
tempLong=tempLong+toNum(remainStr);
//tempLong=tempLong.add(new BigInteger(String.valueOf(toNum(temp)*10000)));
//tempLong=tempLong.add(new BigInteger(String.valueOf(toNum(remainStr))));
}
else{
tempLong=tempLong+toNum(s);
//tempLong=tempLong.add(new BigInteger(String.valueOf(toNum(s))));
}
}
return tempLong;
}

private int toNum(String str){
int temp=0;
for(int i=0,len=str.length();i<len;i++){
if(i==len-1){
if(i>0){
if(str.substring(i,i+1).equals(num[1])){
temp=temp+toOtherUtil(1,str.substring(i-1,i));
}
if(str.substring(i,i+1).equals(num[2])){
temp=temp+toOtherUtil(2,str.substring(i-1,i));
}
if(str.substring(i,i+1).equals(num[3])){
temp=temp+toOtherUtil(3,str.substring(i-1,i));
}
if(str.substring(i,i+1).equals(num[4])){
temp=temp+toOtherUtil(4,str.substring(i-1,i));
}
if(str.substring(i,i+1).equals(num[5])){
temp=temp+toOtherUtil(5,str.substring(i-1,i));
}
if(str.substring(i,i+1).equals(num[6])){
temp=temp+toOtherUtil(6,str.substring(i-1,i));
}
if(str.substring(i,i+1).equals(num[7])){
temp=temp+toOtherUtil(7,str.substring(i-1,i));
}
if(str.substring(i,i+1).equals(num[8])){
temp=temp+toOtherUtil(8,str.substring(i-1,i));
}
if(str.substring(i,i+1).equals(num[9])){
temp=temp+toOtherUtil(9,str.substring(i-1,i));
}
if(str.substring(i,i+1).equals(num[0])){
continue;
}
continue;
}
else if(i==0){
if(str.substring(i,i+1).equals(num[1])){
temp=temp+1;
}
if(str.substring(i,i+1).equals(num[2])){
temp=temp+2;
}
if(str.substring(i,i+1).equals(num[3])){
temp=temp+3;
}
if(str.substring(i,i+1).equals(num[4])){
temp=temp+4;
}
if(str.substring(i,i+1).equals(num[5])){
temp=temp+5;
}
if(str.substring(i,i+1).equals(num[6])){
temp=temp+6;
}
if(str.substring(i,i+1).equals(num[7])){
temp=temp+7;
}
if(str.substring(i,i+1).equals(num[8])){
temp=temp+8;
}
if(str.substring(i,i+1).equals(num[9])){
temp=temp+9;
}
if(str.substring(i,i+1).equals(num[0])){
continue;
}
continue;
}
}
if(str.substring(i,i+1).equals(num[1])){
temp=temp+toUtil(1,str.substring(i+1,i+2));
}
if(str.substring(i,i+1).equals(num[2])){
temp=temp+toUtil(2,str.substring(i+1,i+2));
}
if(str.substring(i,i+1).equals(num[3])){
temp=temp+toUtil(3,str.substring(i+1,i+2));
}
if(str.substring(i,i+1).equals(num[4])){
temp=temp+toUtil(4,str.substring(i+1,i+2));
}
if(str.substring(i,i+1).equals(num[5])){
temp=temp+toUtil(5,str.substring(i+1,i+2));
}
if(str.substring(i,i+1).equals(num[6])){
temp=temp+toUtil(6,str.substring(i+1,i+2));
}
if(str.substring(i,i+1).equals(num[7])){
temp=temp+toUtil(7,str.substring(i+1,i+2));
}
if(str.substring(i,i+1).equals(num[8])){
temp=temp+toUtil(8,str.substring(i+1,i+2));
}
if(str.substring(i,i+1).equals(num[9])){
temp=temp+toUtil(9,str.substring(i+1,i+2));
}
if(str.substring(i,i+1).equals(num[0])){
continue;
}
}
return temp;
}

private int toUtil(int i,String str){
if(str.equals(util[0]))
return i*10;
else if(str.equals(util[1]))
return i*100;
else if(str.equals(util[2]))
return i*1000;
else return 0;
}

private int toOtherUtil(int i,String str){
if(str.equals(util[1]))
return i*10;
else if(str.equals(util[2]))
return i*100;
else return i;
}

public static void main(String[] args){
String str="二十亿七千五百万六千三百";
HZToNum h=new HZToNum(str);
System.out.println(h.turnAll());
}
}
  • 打赏
  • 举报
回复
kenli 2003-07-04
我现在只要转到百就可以了。自己做了一个简单的。
  • 打赏
  • 举报
回复
hlding 2003-07-04
我可以提供一个思路:1)先将单位放入一个字符串数组:{"拾","佰","仟","万","拾万","佰万","仟万","亿","拾亿","佰亿","仟亿"};2)把数字汉字存入另一个数组{"零","壹","贰","叁","肆",......,"玖"};3)在将你输入的汉字字符串和这两个数组进行匹配,成功进行转换
  • 打赏
  • 举报
回复
limingxi007 2003-07-04
我没有写代码,不过可以提供一个思路:把中文数字作为一个字符串看待,查找有没有“万”,“亿”的单位了,肯定先找“亿”了,找到‘

亿“后,将他左边的字符串单独作为一个子串分析,看子串里有没有“万”的单位了,如果有的话,再将“万”左边的字符串作为一个子串来

分析了,分析子串得到所要的数字,如一千二百万亿七千五百万六千三百,首先得到”一千二百万“,然后得到”一千二百“,得到数字(1×

10000+2×100),然后再乘以10000了,即(1×10000+2×100)×10000,再乘以1000000000了,就可以得到“亿”部分的数据了,同时要去

除“亿”部分的分析字符串了,然后通过同样的办法可以得到万部分的数值了,最后相加就可以了,
我认为将查找“万”,“亿”作为一个函数,函数的参数有两个,第一个为所要分析的字符串了,另外一个为“万”或“亿”了,函数返回一

个需要的子串,
将“万”一下的数据转换为数值的过程也可以写一个函数出来,函数的参数为字符串,函数返回一个数值,为长整形了,
  • 打赏
  • 举报
回复
kenli 2003-07-03
javafan0 没有汉字转成阿拉伯数字啊。
  • 打赏
  • 举报
回复
Javafan0 2003-07-03
http://java-fan.vicp.net:10000/cgi-bin/topic.cgi?forum=23&topic=239
  • 打赏
  • 举报
回复
加载更多回复
发帖
Java SE
加入

6.2w+

社区成员

Java 2 Standard Edition
社区管理员
  • Java SE
申请成为版主
帖子事件
创建了帖子
2003-07-03 05:15
社区公告
暂无公告