给一个阿拉伯数字
例如输入:123456789
输出:壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖我以为这个功能很简单,但是发现如果数字中间出现多个0的情况,就要有问题贴一下我的代码,比较差劲
public static String daxie(int sum)
{
String [] n=new String[10];
n[0]="零";
n[1]="壹";
n[2]="贰";
n[3]="叁";
n[4]="肆";
n[5]="伍";
n[6]="陆";
n[7]="柒";
n[8]="捌";
n[9]="玖";
String [] d=new String[10];
d[0]="";
d[1]="";
d[2]="拾";
d[3]="佰";
d[4]="仟";
d[5]="萬";
d[6]="拾";
d[7]="佰";
d[8]="仟";
d[9]="亿";
//计算数字的位数
int wei=(int)Math.floor
(
Math.log10((double)sum)
)+1;
System.out.println(wei);
String str="";
int digit=0;
for (int i=wei;i>0;i--)
{
digit=sum/
(int)Math.pow(10.0, (double)(i-1));
str+=n[digit].toString()+d[i].toString();
sum=sum%
(int)Math.pow(10.0, (double)(i-1));
} str= str.replace("拾零", "拾");
str= str.replace("零拾", "零");
str= str.replace("零佰", "零");
str= str.replace("零仟", "零");
str= str.replace("零萬", "萬");
for (int i=1;i<=6;i++)
str= str.replace("零零", "零");
str=str.replace("零萬", "零");
str=str.replace("零亿", "亿");
str= str.replace("零零", "零");
if (str.endsWith("零"))
{
str=str.substring(0, str.length()-1);
}
System.out.println(str);
return str;
}
例如输入:123456789
输出:壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖我以为这个功能很简单,但是发现如果数字中间出现多个0的情况,就要有问题贴一下我的代码,比较差劲
public static String daxie(int sum)
{
String [] n=new String[10];
n[0]="零";
n[1]="壹";
n[2]="贰";
n[3]="叁";
n[4]="肆";
n[5]="伍";
n[6]="陆";
n[7]="柒";
n[8]="捌";
n[9]="玖";
String [] d=new String[10];
d[0]="";
d[1]="";
d[2]="拾";
d[3]="佰";
d[4]="仟";
d[5]="萬";
d[6]="拾";
d[7]="佰";
d[8]="仟";
d[9]="亿";
//计算数字的位数
int wei=(int)Math.floor
(
Math.log10((double)sum)
)+1;
System.out.println(wei);
String str="";
int digit=0;
for (int i=wei;i>0;i--)
{
digit=sum/
(int)Math.pow(10.0, (double)(i-1));
str+=n[digit].toString()+d[i].toString();
sum=sum%
(int)Math.pow(10.0, (double)(i-1));
} str= str.replace("拾零", "拾");
str= str.replace("零拾", "零");
str= str.replace("零佰", "零");
str= str.replace("零仟", "零");
str= str.replace("零萬", "萬");
for (int i=1;i<=6;i++)
str= str.replace("零零", "零");
str=str.replace("零萬", "零");
str=str.replace("零亿", "亿");
str= str.replace("零零", "零");
if (str.endsWith("零"))
{
str=str.substring(0, str.length()-1);
}
System.out.println(str);
return str;
}
d[0]="";
d[1]="";
d[2]="拾";
d[3]="佰";
d[4]="仟";
d[5]="萬";
d[6]="拾";
d[7]="佰";
d[8]="仟";
d[9]="亿";
你这个定义到第九位,那么如果数字有10位或者以上的话,取的时候就会越界了。
另外在万位的判断上,我觉得需要加个判断
if(wei < 5){
str=str.replace("零萬", "零");
}else{
str=str.replace("零萬", "萬");
}
{
public static void main(String[] args)
{
String num = "零壹贰叁肆伍陆柒捌玖";
String dw = "圆拾佰仟万亿";
String m = "35602001.23";
String mm[] = null;
mm = m.split("\\.");
String money = mm[0]; String result = num.charAt(Integer.parseInt("" + mm[1].charAt(0))) +
"角" +
num.charAt(Integer.parseInt("" + mm[1].charAt(1))) + "分"; for (int i = 0; i < money.length(); i++)
{
String str = "";
int n = Integer.parseInt(money.substring(money.length() - i - 1,
money.length() - i));
str = str + num.charAt(n);
if (i == 0)
{
str = str + dw.charAt(i);
}
else if ( (i + 4) % 8 == 0)
{
str = str + dw.charAt(4);
}
else if (i % 8 == 0)
{
str = str + dw.charAt(5);
}
else
{
str = str + dw.charAt(i % 4);
}
result = str + result;
}
result = result.replaceAll("零万", "万");
result = result.replaceAll("零([^圆]{1})", "零");
result = result.replaceAll("零+", "零");
result = result.replaceAll("零圆", "圆");
result = result.replaceAll("零万", "万");
System.out.println(result); }
}粗略测试过,lz验证下,看是否有问题
{
public static String daxie(int sum)
{
String [] n=new String[10];
n[0]="";
n[1]="壹";
n[2]="贰";
n[3]="叁";
n[4]="肆";
n[5]="伍";
n[6]="陆";
n[7]="柒";
n[8]="捌";
n[9]="玖";
String [] d=new String[10];
d[0]="";
d[1]="拾";
d[2]="佰";
d[3]="仟";
String [] e=new String[10];
e[0]="萬";
e[1]="亿"; //计算数字的位数
// int wei=(int)Math.floor
// (
// Math.log10((double)sum)
// )+1;
String old = ""+sum;
int wei= (old).length();
System.out.println("计算数字的位数=="+wei);
ArrayList str = new ArrayList();
int digit = 0;
int digit1 = 0;
for (int i=wei-1;i>=0;i--){
if(!"0".equals("" + old.charAt(i))){
str.add(0,d[digit]);
str.add(0,n[Integer.parseInt("" + old.charAt(i))]);
}
digit++;
if(digit==4){
digit =0;
str.add(0,e[digit1]);
digit1++;
}
}
System.out.println(str);
return str.toString();
} public static void main(String[] args)
{
System.out.println(daxie(100212334));
}
}
计算数字的位数==9
[壹, , 亿, 贰, 拾, 壹, , 萬, 贰, 仟, 叁, 佰, 叁, 拾, 肆, ]
[壹, , 亿, 贰, 拾, 壹, , 萬, 贰, 仟, 叁, 佰, 叁, 拾, 肆, ]自己看看可以不
你输入
10000004
试试计算数字的位数==8
[亿, 壹, 仟, 萬, 肆, ]
不对啊
public class Test3 { /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//例如输入:123456789
//输出:壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖
String str = "1234567890123456789";//要转换的数字
String outString = "";
int strLeanth = 0;
int grade = 0;
if(str != null ){
strLeanth = str.trim().length();
}
if(strLeanth > 0 ){
grade = strLeanth/4;
}
Test3 t = new Test3();
for(int i = 0 ; i<grade; i++ ){
String temp = str.substring(strLeanth - 4 - i * 4, strLeanth - i * 4);
System.out.println("temp : " + temp );
String unit = t.getUnit(i ,"");
outString = t.analysable(temp, unit) + outString;
}
if(strLeanth % 4 > 0){
String temp = str.substring(0, strLeanth % 4);
System.out.println("temp : " + temp );
String unit = t.getUnit(grade ,"");
outString = t.analysable(temp, unit) + outString;
}
System.out.println("outString : " + outString );
}
/**
* 得到单位
* @param thisUnit
* @param unit
* @return
*/
public String getUnit(int thisUnit ,String unit){
if((thisUnit - 2) <= 0){
if(thisUnit == 1){
unit = "萬" + unit;
}else if(thisUnit == 2){
unit = "亿" + unit;
}
}else{
unit = getUnit(thisUnit - 2 ,"亿"+unit);
}
return unit;
}
/*
* umStr 4位以内的数字字符串
* unit 只有3中:"","萬" 或 "亿"
*/
public String analysable(String umStr, String unit){
String [] n=new String[10];
n[0]="零";
n[1]="壹";
n[2]="贰";
n[3]="叁";
n[4]="肆";
n[5]="伍";
n[6]="陆";
n[7]="柒";
n[8]="捌";
n[9]="玖";
String [] d=new String[10];
d[0] = "";
d[1]="拾";
d[2]="佰";
d[3]="仟";
d[4]="萬";
d[5]="亿";
String reading = "";
for(int i = 0; i < umStr.length() ; i++){
String temp = umStr.substring(umStr.length() - 1 - i, umStr.length() - i);
reading = n[new Integer(temp).intValue()]+d[i] + reading;
}
return reading + unit;
}}
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "01000040";//要转换的数字
String outString = "";
int strLeanth = 0;
int grade = 0;
if(str != null ){
strLeanth = str.trim().length();
}
if(strLeanth > 0 ){
grade = strLeanth/4;
}
Test3 t = new Test3();
for(int i = 0 ; i<grade; ){
String temp = str.substring(strLeanth - 4 - i * 4, strLeanth - i * 4);
System.out.println("temp : " + temp );
String unit = t.getUnit(i ,"");
i++;
if(strLeanth % 4 == 0 && i == grade)
{
outString = t.analysable(temp, unit,false) + outString;
}else{
outString = t.analysable(temp, unit,true) + outString;
}
// System.out.println("outString : " + outString );
}
if(strLeanth % 4 > 0){
String temp = str.substring(0, strLeanth % 4);
//System.out.println("temp : " + temp );
String unit = t.getUnit(grade ,"");
outString = t.analysable(temp, unit , false) + outString;
}
System.out.println("outString : " + outString );
}
/**
* 得到单位
* @param thisUnit
* @param unit
* @return
*/
public String getUnit(int thisUnit ,String unit){
if((thisUnit - 2) <= 0){
if(thisUnit == 1){
unit = "萬" + unit;
}else if(thisUnit == 2){
unit = "亿" + unit;
}
}else{
unit = getUnit(thisUnit - 2 ,"亿"+unit);
}
return unit;
}
/*
* umStr 4位以内的数字字符串
* unit 只有3中:"","萬" 或 "亿"
* lool 用来判断之前是否还有其他位 有:true
*/
public String analysable(String umStr, String unit ,boolean lool){
String [] n=new String[10];
n[0]="零";
n[1]="壹";
n[2]="贰";
n[3]="叁";
n[4]="肆";
n[5]="伍";
n[6]="陆";
n[7]="柒";
n[8]="捌";
n[9]="玖";
String [] d=new String[10];
d[0] = "";
d[1]="拾";
d[2]="佰";
d[3]="仟";
d[4]="萬";
d[5]="亿";
String reading = "";
String tempReading = "";
for(int i = umStr.length()-1 ; i > 0 ; i--){
String temp = umStr.substring(umStr.length() - i, umStr.length() - i + 1 );
//System.out.println("reading : " + temp );
System.out.println(" === " + ((unit.length() > 0 || i > 0 ) && new Integer(temp).intValue() == 0));
if((unit.length() > 0 || i > 0 ) && new Integer(temp).intValue() == 0){
tempReading = n[new Integer(temp).intValue()] ;
//System.out.println("tempReading : " + tempReading );
}else{
if(lool){
reading = reading + tempReading + n[new Integer(temp).intValue()]+d[i-1];
}else
{
lool = true;
reading = n[new Integer(temp).intValue()]+d[i-1];
}
System.out.println("reading : " + reading );
}
}
return reading + unit;
}}
上面
for(int i = umStr.length()-1 ; i > 0 ; i--)
那一行改成:
for(int i = umStr.length() ; i > 0 ; i--)
相应的方法换成:
/*
* umStr 4位以内的数字字符串
* unit 只有3中:"","萬" 或 "亿"
* lool 用来判断之前是否还有其他位 有:true
*/
public String analysable(String umStr, String unit ,boolean lool){
String [] n=new String[10];
n[0]="零";
n[1]="壹";
n[2]="贰";
n[3]="叁";
n[4]="肆";
n[5]="伍";
n[6]="陆";
n[7]="柒";
n[8]="捌";
n[9]="玖";
String [] d=new String[10];
d[0] = "";
d[1]="拾";
d[2]="佰";
d[3]="仟";
d[4]="萬";
d[5]="亿";
String reading = "";
String tempReading = "";
for(int i = umStr.length() ; i > 0 ; i--){
String temp = umStr.substring(umStr.length() - i, umStr.length() - i + 1 );
System.out.println("reading : " + temp );
if((unit.length() > 0 || i > 0 ) && new Integer(temp).intValue() == 0){
tempReading = "零" ;
//System.out.println("tempReading : " + tempReading );
}else{
if(lool){
reading = reading + tempReading + n[new Integer(temp).intValue()]+d[i-1];
tempReading = "";
}else
{
lool = true;
reading = n[new Integer(temp).intValue()]+d[i-1];
}
System.out.println("reading : " + reading );
}
}
return reading + unit;
}
有问题提出来大家一起讨论:)import java.io.*;
public class NumberConversion {
public static void main(String[] args) {
String s=null;
try {
s = getString();
} catch (IOException e) {
e.printStackTrace();
}
int a=Integer.parseInt(s);
System.out.println(saparateNumber(a)); }
//分离数据
public static String saparateNumber(int a){
String str="";
int i=0;
boolean yi=false;
boolean wan=false;
if(a>=100000000){
str+=conversionCapitalization2(a/100000000)+"亿";
if(a/100000000<1000)
str=str.substring(1);
a=a%100000000;
yi=true;
}
if(a>=10000){
str+=conversionCapitalization2(a/10000)+"萬";
if(a/10000<1000&&yi==false)
str=str.substring(1);
a=a%10000;
wan=true;
}
if(a>0){
str+=conversionCapitalization2(a/1);
if(a<1000&&wan==false)
str=str.substring(1);
}
return str;
}
//转大写
public static String conversionCapitalization(int a){
String cpzat ="";
switch (a){
case 0:
cpzat="零";
break;
case 1:
cpzat="壹";
break;
case 2:
cpzat="贰";
break;
case 3:
cpzat="叁";
break;
case 4:
cpzat="肆";
break;
case 5:
cpzat="伍";
break;
case 6:
cpzat="陆";
break;
case 7:
cpzat="柒";
break;
case 8:
cpzat="捌";
break;
case 9:
cpzat="玖";
break;
}
return cpzat;
}
public static String conversionCapitalization2(int a){
String tr="";
boolean q=false;
boolean b=false;
boolean s=false;
if(a>=1000){
tr+=conversionCapitalization(a/1000)+"仟";
a=a%1000;
q=true;
}
if(a>=100){
if(q==true)
tr+=conversionCapitalization(a/100)+"佰";
else
tr+="零"+conversionCapitalization(a/100)+"佰";
a=a%100;
b=true;
}
if(a>=10){
if(b==true)
tr+=conversionCapitalization(a/10)+"拾";
else
tr+="零"+conversionCapitalization(a/10)+"拾";
a=a%10;
s=true;
}
if(a>0){
if(s==true)
tr+=conversionCapitalization(a/1);
else
tr+="零"+conversionCapitalization(a/1);
}
return tr;
}
public static String getString() throws IOException{
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
return br.readLine();
}}
import java.io.*;
public class a
{
public static void main(String[] args)
{
String s=new String();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true)
{
try{s=br.readLine();}catch(Exception e){}
Convert c = new Convert(s.toCharArray());
System.out.println(c);
}
}
}
class Convert
{
final String[] str1={"","十","百","千"};
final String[] str2 = {"亿","萬"};
final String[] number = {"","壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
char[] num_char;
StringBuffer sb=new StringBuffer(); public Convert(char[] num)
{
num_char=num;
}
public String toString()
{
int last=num_char.length%4;
int pos=0;
add(sb,new String(num_char,0,last));
pos+=last;
for(int i=(int) (num_char.length/4);i>0;i--)
{
if(i%2==0) sb.append(str2[0]);
else sb.append(str2[1]);
add(sb,new String(num_char,pos,4));
pos+=4;
}
if(last==0) sb.deleteCharAt(0);
return sb.toString();
}
private void add(StringBuffer sb,String temp)
{
char[] temp2=temp.toCharArray();
int length=temp.length();
for(int i=0;i<length;i++)
{
if(temp2[i]=='0')
if(sb.lastIndexOf("零")!=sb.length()-1 && i!=0) sb.append("零");else;
else
{
sb.append(number[temp2[i]-'0']);
sb.append(str1[length-i-1]);
}
}
try{
if (sb.lastIndexOf("零") == sb.length() - 1) sb.deleteCharAt(sb.lastIndexOf("零"));
}catch(Exception e){}
}
}
120100101
壹亿贰千零壹十萬壹百零壹
1
壹
223
贰百贰十叁
102
壹百零贰
1000
壹千
1263
壹千贰百陆十叁
123021
壹十贰萬叁千零贰十壹
100001
壹十萬零壹
import java.io.*;
public class a
{
public static void main(String[] args)
{
String s=new String();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true)
{
try{s=br.readLine();}catch(Exception e){}
Convert c = new Convert(s.toCharArray());
System.out.println(c);
}
}
}
class Convert
{
final String[] str1={"","十","百","千"};
final String[] str2 = {"亿","萬"};
final String[] number = {"","壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
char[] num_char;
StringBuffer sb=new StringBuffer();
int last; public Convert(char[] num)
{
num_char=num;
}
public String toString()
{
last=num_char.length%4;
int pos=0;
add(sb,new String(num_char,0,last));
pos+=last;
for(int i=(int) (num_char.length/4);i>0;i--)
{
if(i%2==0) sb.append(str2[0]);
else sb.append(str2[1]);
add(sb,new String(num_char,pos,4));
pos+=4;
}
if(last==0) sb.deleteCharAt(0);
return sb.toString();
}
private void add(StringBuffer sb,String temp)
{
char[] temp2=temp.toCharArray();
int length=temp.length();
for(int i=0;i<length;i++)
{
if(temp2[i]=='0')
if(sb.lastIndexOf("零")!=sb.length()-1 && last!=0) sb.append("零");else;
else
{
sb.append(number[temp2[i]-'0']);
sb.append(str1[length-i-1]);
}
}
try{
if (sb.lastIndexOf("零") == sb.length() - 1) sb.deleteCharAt(sb.lastIndexOf("零"));
}catch(Exception e){}
}
}结果是这样的:
120100101
壹亿贰千零壹十萬零壹百零壹
20100101
贰千壹十萬壹百壹
1234567894564513213
壹百贰十叁亿肆千伍百陆十柒萬捌千玖百肆十伍亿陆千肆百伍十壹萬叁千贰百壹十叁
121202013210301005401650540321013
壹亿贰千壹百贰十萬贰千零壹十叁亿贰千壹百零叁萬零壹百亿伍千肆百零壹萬陆千伍百零伍
亿肆千零叁十贰萬壹千零壹十叁
2121254548545
贰萬壹千贰百壹十贰亿伍千肆百伍十肆萬捌千伍百肆十伍
1
壹
123
壹百贰十叁
100
壹百
受到dracularking的启发,谨表示谢意,愿与大家共享思路。public class RMBConvert {
private static String[] faceVal = new String[] { "零", "壹", "贰", "叁", "肆",
"伍", "陆", "柒", "捌", "玖" }; private static String[] level = new String[] { "圆", "拾", "佰", "仟", "萬", "亿" }; public static void main(String[] arg) {
StringBuffer sb = new StringBuffer();
try {
BufferedReader in = new BufferedReader(new InputStreamReader(
System.in));
String s1 = in.readLine();
for (int i = 0; i < s1.length(); i++) {
int digit = Integer.valueOf(s1.substring(i, i + 1)).intValue();
sb.append(faceVal[digit]);
}
String face = sb.reverse().toString();
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < face.length(); i++) {
//加权
if (i == 0) {
resultSb.append(level[0]);
}
else{
//万位处理
if ((i + 4) % 8 == 0) {
resultSb.append(level[4]);
}
//亿位处理
else if (i % 8 == 0) {
resultSb.append(level[5]);
}
else {
resultSb.append(level[i % 4]);
}
}
//加面值
String temp = face.substring(i, i + 1);
resultSb.append(temp);
} String result = resultSb.reverse().toString();
result = result.replaceAll("零拾", "零");
result = result.replaceAll("零佰", "零");
result = result.replaceAll("零仟", "零");
result = result.replaceAll("[零]+", "零");
result = result.replaceAll("零圆", "圆");
result = result.replaceAll("零萬", "萬");
result = result.replaceAll("零亿", "亿");
System.out.println(result + "整");
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* description 根据人民币的数字转化成中文的大写形式
*
* @param String
* type 人民币数字
* @return String 大写形式的字符串
* @author date: 2002-10-20
*/
public String getChineseMoney(String moneyNum) {
// 存放汉字的数组
String[] chinese = new String[17];
String[] money = new String[2];
chinese[0] = "零";
chinese[1] = "壹";
chinese[2] = "贰";
chinese[3] = "叁";
chinese[4] = "肆";
chinese[5] = "伍";
chinese[6] = "陆";
chinese[7] = "柒";
chinese[8] = "捌";
chinese[9] = "玖";
chinese[10] = "拾";
chinese[11] = "佰";
chinese[12] = "仟";
chinese[13] = "万";
chinese[14] = "亿";
chinese[15] = "元";
chinese[16] = "整";
money[0] = "角";
money[1] = "分";
// 输出的大写形式字符串
String str_out = "";
// 整数部分字符串
String str_left = "";
// 小数部分字符串
String str_right = "";
// 小数点
String str_point = ".";
// 小数点位置
int ponitLocation = moneyNum.indexOf("."); // 小数点后位数
int pointLater = 0;
if (ponitLocation != -1) {
pointLater = moneyNum.length() - ponitLocation - 1;
} else {
pointLater = moneyNum.length();
} // 分离字符串为两部分
if (pointLater > 1) {
if (ponitLocation != -1) {
str_left = moneyNum.substring(0, ponitLocation);
str_right = moneyNum.substring(ponitLocation + 1,
ponitLocation + 3);
} else {
str_left = moneyNum;
} }
// 整数部分字符串的长度
int str_left_length;
str_left_length = str_left.length();
// 小数部分字符串的长度
int str_right_length;
str_right_length = str_right.length();
// 整数部分的零字符标识位
int flag = 0;
// 小数部分的零字符标识位
int flag_zreo = 0;
// 开始转换整数部分
for (int i = 0; i <= str_left.length() - 1; i++) { String str_l;
str_l = str_left.substring(i, i + 1);
int temp = Integer.parseInt(str_l);
switch (temp) {
case 1:
str_out = str_out + chinese[1];
break;
case 2:
str_out = str_out + chinese[2];
break;
case 3:
str_out = str_out + chinese[3];
break;
case 4:
str_out = str_out + chinese[4];
break;
case 5:
str_out = str_out + chinese[5];
break;
case 6:
str_out = str_out + chinese[6];
break;
case 7:
str_out = str_out + chinese[7];
break;
case 8:
str_out = str_out + chinese[8];
break;
case 9:
str_out = str_out + chinese[9];
break;
}
// 对整数部分的零的处理
if (temp == 0) {
flag++;
if (str_left_length == 1) {
str_out = str_out + chinese[15];
}
if (str_left_length == 9) {
flag = 0;
str_out = str_out + chinese[14];
}
if (str_left_length == 5) {
flag = 0;
str_out = str_out + chinese[13];
}
// 判断是否输出零,根据它的下一位来决定:是零则不输出,否则输出
if (str_left_length >= 2) {
String str_le = str_left.substring(i + 1, i + 2);
int tem = Integer.parseInt(str_le);
if ((flag == 1) && (tem != 0)) {
str_out = str_out + chinese[0];
} else {
flag = 0;
}
}
str_left_length--;
// System.out.println(str_left_length--);
} else {
flag = 0;
// 添加整数部分的单位:拾, 佰,仟 ,万,亿
switch (str_left_length) { case 1:
str_out = str_out + chinese[15];
str_left_length--;
break;
case 2:
str_out = str_out + chinese[10];
str_left_length--;
break;
case 3:
str_out = str_out + chinese[11];
str_left_length--;
break;
case 4:
str_out = str_out + chinese[12];
str_left_length--;
break;
case 5:
str_out = str_out + chinese[13];
str_left_length--;
break;
case 6:
str_out = str_out + chinese[10];
str_left_length--;
break;
case 7:
str_out = str_out + chinese[11];
str_left_length--;
break;
case 8:
str_out = str_out + chinese[12];
str_left_length--;
break;
case 9:
str_out = str_out + chinese[14];
str_left_length--;
break;
case 10:
str_out = str_out + chinese[10];
str_left_length--;
break;
case 11:
str_out = str_out + chinese[11];
str_left_length--;
break;
case 12:
str_out = str_out + chinese[12];
str_left_length--;
break;
case 13:
str_out = str_out + chinese[13];
str_left_length--;
break;
} }
}
// 处理小数部分的字符串
for (int i = 0; i <= str_right.length() - 1; i++) {
String str_r;
str_r = str_right.substring(i, i + 1);
int temp1 = Integer.parseInt(str_r);
switch (temp1) {
case 1:
str_out = str_out + chinese[1];
break;
case 2:
str_out = str_out + chinese[2];
break;
case 3:
str_out = str_out + chinese[3];
break;
case 4:
str_out = str_out + chinese[4];
break;
case 5:
str_out = str_out + chinese[5];
break;
case 6:
str_out = str_out + chinese[6];
break;
case 7:
str_out = str_out + chinese[7];
break;
case 8:
str_out = str_out + chinese[8];
break;
case 9:
str_out = str_out + chinese[9];
break; }
// 对小数部分的零的处理
if (temp1 == 0) {
flag_zreo++;
if (str_right_length == 2) {
// 判断是否输出零,根据它的下一位来决定:是零则不输出,否则输出
String str_ri = str_right.substring(i + 1, i + 2);
int temp = Integer.parseInt(str_ri);
if ((flag_zreo == 1) && (temp != 0)) {
str_out = str_out + chinese[0];
}
} else {
str_out = str_out + chinese[16];
}
str_right_length--;
} else {
// 添加小数部分的角、分
switch (str_right_length) {
case 1:
str_out = str_out + money[1];
str_right_length--;
break;
case 2:
str_out = str_out + money[0];
str_right_length--;
break;
}
}
}
return str_out;
} public static void main(String[] a) {
Test test = new Test();
System.out.println(test.getChineseMoney("1050")); }}
http://blog.csdn.net/leomaya/archive/2006/12/24/1458747.aspx用C#写的
public class a
{
public static void main(String[] args)
{
String s=new String();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while(true)
{
try{s=br.readLine();}catch(Exception e){}
Convert c = new Convert(s.toCharArray());
System.out.println(c);
}
}
}
class Convert
{
final String[] str1={"","十","百","千"};
final String[] str2 = {"亿","萬"};
final String[] number = {"","壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
char[] num_char;
StringBuffer sb=new StringBuffer();
int last; public Convert(char[] num)
{
num_char=num;
}
public String toString()
{
last=num_char.length%4;
int pos=0;
add(sb,new String(num_char,0,last));
pos+=last;
for(int i=(int) (num_char.length/4);i>0;i--)
{
if(i%2==0) sb.append(str2[0]);
else sb.append(str2[1]);
add(sb,new String(num_char,pos,4));
pos+=4;
}
if(last==0) sb.deleteCharAt(0);
return sb.toString();
}
private void add(StringBuffer sb,String temp)
{
char[] temp2=temp.toCharArray();
int length=temp.length();
for(int i=0;i<length;i++)
{
if(temp2[i]=='0')
if(sb.lastIndexOf("零")!=sb.length()-1 && sb.length()!=0) sb.append("零");else;
else
{
sb.append(number[temp2[i]-'0']);
sb.append(str1[length-i-1]);
}
}
try{
if (sb.lastIndexOf("零") == sb.length() - 1) sb.deleteCharAt(sb.lastIndexOf("零"));
}catch(Exception e){}
}
}运行结果为:
1
壹
10
壹十
100
壹百
1000
壹千
10000
壹萬
10000000
壹千萬
102351225
壹亿零贰百叁十伍萬壹千贰百贰十伍
10250250210210
壹十萬贰千伍百零贰亿伍千零贰十壹萬零贰百壹十
32135400213501232450123256903284230040
叁十贰萬壹千叁百伍十肆亿零贰十壹萬叁千伍百零壹亿贰千叁百贰十肆萬伍千零壹十贰亿叁
千贰百伍十陆萬玖千零叁十贰亿捌千肆百贰十叁萬零肆十
static String t1 = "零壹贰叁肆伍陆柒捌玖"; static char[] n = { '仟', ' ', '拾', '佰' }; static char[] n1 = {'萬','亿'}; static char end = '圆';
public static void print(String value, int pos, boolean b) {
if (pos == 0) {
System.out.print(end);
return;
}
String value2 = value.substring(1, value.length());
int printPos = value.charAt(0) - '0';
if (printPos != 0) {
if (b == true)
System.out.print(t1.charAt(0));
System.out.print(t1.charAt(printPos));
System.out.print(printPos == 0 ? "" : (n[pos % 4] == ' ' ? "": n[pos % 4]));
}
if (pos % 4 == 1 && pos > 1) {
System.out.print(n1[(pos / 4) - 1]);
print(value2, pos - 1, false);
return;
}
print(value2, pos - 1, printPos == 0 ? true : false);
}使用方法
print("10010202070", 11, false);
#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
#define MAX 0xffff
void main()
{
char *temp1[] = {"","十","百","千"};
char *temp2[] = {"零","一","二","三","四","五","六","七","八","九"};
enum {N,SHI,BAI,QIAN,WAN,YI};
char input[MAX];
char cache[MAX];
char cache1[MAX];
bool zero=false;
int leng,i,prevMax;
cin>>input;
leng = strlen(input)-1;
for(i=0;i<MAX && i<=leng;i++)
{
cache[i]=input[i];
if((leng-i)%4)
cache1[i]=(leng-i)%4;
else if(leng-i>4 && !((leng-i)%8))
cache1[i]=YI;
else if(leng-i!=0)
cache1[i]=WAN;
else
cache1[i]=N;
}
cache[i]=cache1[i]=0; for(i=0;cache[i]=='0';i++);
while(1)
{
if(cache[i]!='0')
{
prevMax=cache1[i];
if(cache[i]==0)
break;
if(zero==true)
cout<<temp2[0];
cout<<temp2[cache[i]-0x30];
if(cache1[i]<4)
cout<<temp1[cache1[i]];
else if(cache1[i]==WAN)
cout<<"万";
else if(cache1[i]==YI)
cout<<"亿";
zero=false;
}
else
{
zero=true;
if(cache1[i]>prevMax || cache1[i]==YI)
{
prevMax=cache1[i];
if(cache1[i]<4)
cout<<temp1[cache1[i]];
else if(cache1[i]==4)
cout<<"万";
else
cout<<"亿";
}
}
i++;
}
cout<<endl;
}
String n[] = {"零","壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
String unit[] = { "", "拾" , "佰","仟"};
String unit1[] = { "亿", "万" };
StringBuilder chi = new StringBuilder(); for (int i = 0; i < num.toString().length(); i++) {
chi.append(n[Integer.parseInt(String.valueOf(num.toString().charAt(i)))]);
chi.append(unit[(num.toString().length()-i-1) % 4]);
if ((num.toString().length()-i) % 4 == 1)
{
chi.append(unit1[(int) Math.floor((double) (num.toString().length()-i) / 4) % 2]);
}
}
String ch = chi.toString();
ch = ch.replaceAll("零仟", "零");
ch = ch.replaceAll("零佰", "零");
ch = ch.replaceAll("零拾", "零");
while(ch.indexOf("零零")>0)
{
ch = ch.replaceAll("零零", "零");
}
ch = ch.replaceAll("零万", "万");
ch = ch.replaceAll("零亿", "亿");
ch = ch.replaceAll("亿万", "亿");
System.out.println(ch.substring(0, ch.length()-1));
} public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(true)
{
long num = in.nextLong();
if(num==0)
{
System.exit(0);
}
ToChinese(new Long(num));
}
}}
public static void main(String[] args) {
//从命令行取得数字
int num = Integer.parseInt(args[0]);
int num1=num;
int n = 0;
while(num1 >=10) {
num1 = num1 / 10;
n++;
}
int[] nums = new int[n+1];
num1 = num;
for (int i = 0; i < n+1;i++) {
nums[i]= num1 % 10;
num1 = num1 / 10;
}
String[] chNum={"壹","贰","叁","肆","伍","陆","柒","捌","玖","拾"};
String[] unit={"","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万"};
for (int i = n; i >=0;i--) {
System.out.print(chNum[nums[i]-1]);
System.out.print(unit[i]);
}
}
}
if (str.indexOf("萬零") > 0)
str = str.replace("零萬", "萬");
else
str = str.replace("零萬", "零");
str = str.replace("拾零", "拾");
str = str.replace("零拾", "零");
str = str.replace("零佰", "零");
str = str.replace("零仟", "零");
for (int i = 1; i <= 6; i++)
str = str.replace("零零", "零");
str = str.replace("零萬", "萬");
str = str.replace("零亿", "亿");
str = str.replace("零零", "零");
str = str.replace("亿萬", "亿");
if (str.endsWith("零")) {
str = str.substring(0, str.length() - 1);
}
str = str.replace("零萬", "萬");
else
str = str.replace("零萬", "零");
改成如下,再试试。
if (str.indexOf("萬零") > 0)
str = str.replace("零萬", "萬");
else{
if(str.substring(0,str.indexOf("萬")).indexOf("零仟") == -1 || str.substring(0,str.indexOf("萬")).indexOf("零佰") == -1 || str.substring(0,str.indexOf("萬")).indexOf("零拾") == -1)
str = str.replace("零萬", "萬");
else
str = str.replace("零萬", "零");
}
public class test{
int number[];
String bignum[] = {"零","一","二","三","四","五","六","七","八","久"};
String sign1[] = {"","十","百","千"};
String sign2[] = {"圆","万","亿","兆"};
test(String s){
if(s.length()>sign2.length*4)
System.exit(0);
number = new int[s.length()];
for(int i=0;i<s.length();i++)
number[s.length()-1-i] = Integer.parseInt(i==s.length()-1?s.substring(i):s.substring(i,i+1));
run();
}
void run(){
String s="";
for(int i=number.length-1;i>=0;i--){
s+=bignum[number[i]];
s+=i%4==0?sign2[i/4]:number[i]>0?sign1[i%4]:"";
}
while(s.indexOf("零零")!=-1)
s=s.replaceFirst("零零","零");
for(int i=0;i<sign1.length;i++)
while(s.indexOf("零"+sign2[i])!=-1)
s=s.replaceFirst("零"+sign2[i],sign2[i]);
for(int i=sign2.length-1;i>0;i--)
while(s.indexOf(sign2[i]+sign2[i-1])!=-1)
s=s.replaceFirst(sign2[i]+sign2[i-1],sign2[i]);
System.out.println(s);
}
public static void main(String args[]){
new test(args[0]);
}
}
s = s.replaceFirst("^0+","");
去掉前面的0即可
20 DIM NUM$(10)
30 FOR I=0 TO 9
40 READ A$
50 NUM$(I)=A$
60 NEXT
70 DIM UNIT$(4)
80 UNIT$(1)="仟":UNIT$(2)="佰":UNIT$(3)="拾"
90 DIM SC$(3)
100 SC$(1)="亿":SC$(2)="万"
105 LOCATE 5,1:PRINT "不超过10亿";
110 LOCATE 1,1:INPUT "请输入一个阿拉伯数字(整)";N
120 IF INT(N)<>N THEN PRINT "请输入整数":GOTO 110
125 IF N=0 THEN PRINT "零":END
130 N$=STR$(N):L=LEN(N$)
140 IF (L/4)=INT(L/4) THEN H=(L/4):GOTO 160
150 IF (L/4)>1 THEN H=INT(L/4)+1 ELSE H=1
160 DIM T$(3,4)
170 X=3:Y=4
180 FOR I=L TO 1 STEP -1
190 T$(X,Y)=MID$(N$,I,1)
200 Y=Y-1
210 IF Y=0 THEN Y=4:X=X-1
220 NEXT
300 SH=4-H
310 FOR A=SH TO 3
320 T=VAL(T$(A,1))
330 I=1
340 WHILE T=0
350 I=I+1
355 IF I=5 GOTO 470
360 T=VAL(T$(A,I))
370 LW=1
380 WEND
390 IF A<>SH AND H>1 AND LW=1 THEN S$="零"
410 FOR J=I TO 4
420 T=VAL(T$(A,J))
425 IF T=0 AND VAL(T$(A,J-1))=0 THEN GOTO 440
430 S$=S$+NUM$(T)+UNIT$(J*(T<>0))
440 NEXT
445 IF ?S$,3)<>"零" GOTO 460
450 S$=LEFT$(S$,(LEN(S$)-3)):WL=1
460 FN$=FN$+S$+SC$(A)
465 LW=0:S$=""
470 NEXT
480 PRINT FN$
另:我GOOGLE了一下,有说一兆=一万亿的,也有说一兆=一千一千亿的,我这里暂以为一兆=一万亿。代码如下:有不妥之处还请各位指正! package numberToCn;import java.util.ArrayList;
import java.util.List;
import java.io.*;public class NumberToCnModify {
List cnList = null,danweiList = null;
StringBuffer cnStr = null;
char[] tempStr = null;
int charLength = 0;
public NumberToCnModify(){
cnList = new ArrayList();
danweiList = new ArrayList();
cnStr = new StringBuffer();
}
public void init(){
cnList.add("零");
cnList.add("壹");
cnList.add("贰");
cnList.add("叁");
cnList.add("肆");
cnList.add("伍");
cnList.add("陆");
cnList.add("柒");
cnList.add("捌");
cnList.add("玖");
danweiList.add("");
danweiList.add("拾");
danweiList.add("佰");
danweiList.add("仟");
danweiList.add("万");
danweiList.add("亿");
danweiList.add("兆");
}
public boolean isNumber(char tempChar){
boolean isNum = true;
if((tempChar<'0')||(tempChar>'9')){
System.out.println();
System.out.println("Not Number"+tempChar);
isNum=false;
}
return isNum;
}
public void getInputString(String inputStr){
tempStr = inputStr.toCharArray();
charLength = tempStr.length;
if(charLength>15){
System.out.println("The Number You Input Is Too Long!");
System.exit(0);
}
}
public String convertToBaseCn(int startNum,int endNum,String danwei){
int allZero = 0;
int tempNum = 0;
String tempString = "";
for(int i=startNum;i<endNum;i++){
tempNum = Integer.parseInt(String.valueOf(tempStr[i]));
if(i==startNum&&tempNum==0||i==startNum+1&&tempNum==0&&Integer.parseInt(String.valueOf(tempStr[i-1]))==0||i==startNum+2&&tempNum==0&&Integer.parseInt(String.valueOf(tempStr[i-1]))==0&&Integer.parseInt(String.valueOf(tempStr[i-2]))==0||i==startNum+3&&tempNum==0&&Integer.parseInt(String.valueOf(tempStr[i-1]))==0&&Integer.parseInt(String.valueOf(tempStr[i-2]))==0&&Integer.parseInt(String.valueOf(tempStr[i-3]))==0){
if(i==startNum+3&&tempNum==0&&Integer.parseInt(String.valueOf(tempStr[i-1]))==0&&Integer.parseInt(String.valueOf(tempStr[i-2]))==0&&Integer.parseInt(String.valueOf(tempStr[i-3]))==0){
allZero = 1;
}
//如果第一个是零或者1、2两个都是0或者1、2、3,1、2、3、4都是0的话,就不用打印零和相应的单位了。
}else{
if(i==endNum-1&&tempNum==0||i==endNum-2&&tempNum==0&&Integer.parseInt(String.valueOf(tempStr[i+1]))==0||i==endNum-3&&tempNum==0&&Integer.parseInt(String.valueOf(tempStr[i+1]))==0){
//如果最后一个是0,某一个及其后面一个都是0的话,就不必打印0
}else{
tempString+=cnList.get(tempNum).toString();
}
if(tempNum!=0){//如果是0的话,就不用打印单位
tempString+=danweiList.get(endNum-(i+1)).toString();
}
}
}
if(allZero == 0){
tempString+=danwei;
}
return tempString;
}
public String convertToCn(){ int notNumber = 0;
int zeroRecord = 0;//当同时两个或多个位段都是0时,只要显示一个0
String tempString = "";
try{
for(int i=0;i<charLength;i++){
if(!isNumber(tempStr[i])){
notNumber = 1;
break;
}
}
if(notNumber == 1){
System.out.println("Please Input Number!");
return "";
}else{
if(charLength>12){
tempString = convertToBaseCn(0,charLength-12,"兆");
if(tempString.equals("")){
zeroRecord ++;
}else{
zeroRecord = 0;
}
cnStr.append(tempString);
if(zeroRecord ==1 ){
cnStr.append("零");
}
tempString = convertToBaseCn(charLength-12,charLength-8,"亿");
if(tempString.equals("")){
zeroRecord ++;
}else{
zeroRecord = 0;
}
cnStr.append(tempString);
if(zeroRecord ==1 ){
cnStr.append("零");
}
tempString = convertToBaseCn(charLength-8,charLength-4,"万");
if(tempString.equals("")){
zeroRecord ++;
}else{
zeroRecord = 0;
}
cnStr.append(tempString);
if(zeroRecord ==1 ){
cnStr.append("零");
}
tempString=convertToBaseCn(charLength-4,charLength,"");
if(tempString.equals("")){
zeroRecord ++;
}else{
zeroRecord = 0;
}
cnStr.append(tempString);
if(zeroRecord ==1 ){
cnStr.append("零");
}
}else if(charLength>8){
tempString=convertToBaseCn(0,charLength-8,"亿");
if(tempString.equals("")){
zeroRecord ++;
}else{
zeroRecord = 0;
}
cnStr.append(tempString);
if(zeroRecord ==1 ){
cnStr.append("零");
}
tempString=convertToBaseCn(charLength-8,charLength-4,"万");
if(tempString.equals("")){
zeroRecord ++;
}else{
zeroRecord = 0;
}
cnStr.append(tempString);
if(zeroRecord ==1 ){
cnStr.append("零");
}
tempString=convertToBaseCn(charLength-4,charLength,"");
if(tempString.equals("")){
zeroRecord ++;
}else{
zeroRecord = 0;
}
cnStr.append(tempString);
if(zeroRecord ==1 ){
cnStr.append("零");
}
}else if(charLength>4){
tempString=convertToBaseCn(0,charLength-4,"万");
if(tempString.equals("")){
zeroRecord ++;
}else{
zeroRecord = 0;
}
cnStr.append(tempString);
if(zeroRecord ==1 ){
cnStr.append("零");
}
tempString=convertToBaseCn(charLength-4,charLength,"");
if(tempString.equals("")){
zeroRecord ++;
}else{
zeroRecord = 0;
}
cnStr.append(tempString);
if(zeroRecord ==1 ){
cnStr.append("零");
}
}else{
tempString=convertToBaseCn(0,charLength,"");
if(tempString.equals("")){
zeroRecord ++;
}else{
zeroRecord = 0;
}
cnStr.append(tempString);
if(zeroRecord ==1 ){
cnStr.append("零");
}
}
}
}catch(NullPointerException ne){
System.out.println("NullPointerException:"+ne.getMessage());
}catch(IndexOutOfBoundsException iobe){
System.out.println("IndexOutOfBoundsException:"+iobe.getMessage());
}finally{
}
return cnStr.toString();
}
public static void main(String[] args){
NumberToCnModify ntc = new NumberToCnModify();
ntc.init();
ntc.getInputString("300340000000130");
System.out.println(ntc.convertToCn());
}
}
import java.math.BigInteger;
import java.util.Scanner;public class NumToChinese { public static void ToChinese(BigInteger num) {
String n[] = {"零","壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
String unit[] = { "", "拾" , "佰","仟"};
String unit1[] = { "亿", "万" };
StringBuilder chi = new StringBuilder(); for (int i = 0; i < num.toString().length(); i++) {
chi.append(n[Integer.parseInt(String.valueOf(num.toString().charAt(i)))]);
chi.append(unit[(num.toString().length()-i-1) % 4]); // 添加单位
if ((num.toString().length()-i) % 4 == 1) // 添加单位1
{
chi.append(unit1[(int) Math.floor((double) (num.toString().length()-i) / 4) % 2]);
}
}
String ch = chi.toString();
ch = ch.replaceAll("零仟", "零");
ch = ch.replaceAll("零佰", "零");
ch = ch.replaceAll("零拾", "零");
while(ch.indexOf("零零")>0)
{
ch = ch.replaceAll("零零", "零");
}
ch = ch.replaceAll("零万", "万");
ch = ch.replaceAll("零亿", "亿");
ch = ch.replaceAll("亿万", "亿");
System.out.println(ch.substring(0, ch.length()-1));
} public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while(true)
{
BigInteger num = in.nextBigInteger();
if(num.equals(0))
{
System.exit(0);
}
ToChinese(num);
}
}
}
#include<string>
#include<cassert>
#include "ValueTraits.h"using namespace std;class EnglishNumber
{
public:
EnglishNumber(){}
~EnglishNumber(){}
template<typename ValueType>
const string NumberName(const ValueType &) const;
private:
template<typename ValueType>
const string BaseDigit(const ValueType &) const;
template<typename ValueType>
const string TensDigit(const ValueType &) const;
template<typename ValueType>
const string HundredsDigit(const ValueType &) const;
template<typename ValueType>
const string MoreDigit(const ValueType &) const;
};template<typename ValueType>
const string EnglishNumber::BaseDigit(const ValueType & iNumber) const{
const static string BaseNumName[] = {"zero",
"one","two","three","four","five","six",
"seven","eight","nine","ten","eleven",
"twelve","thirteen","fourteen","fifteen",
"sixteen","seventeen","eighteen","nineteen"};
assert(iNumber >= 0 && iNumber < 20 && "Function BaseNumber");
return BaseNumName[ValueTraits<ValueType>::Long(iNumber)];
}template<typename ValueType>
const string EnglishNumber::TensDigit(const ValueType & iNumber) const{
const static string TensDigitName[] = {
"twenty","thirty","forty","fifty",
"sixty","seventy","eighty","ninety"};
assert(iNumber >= 0 && iNumber < 100 && "Function TensDigit");
if(iNumber < 20)
return BaseDigit(iNumber);
ValueType h(iNumber),l(iNumber);
h = iNumber / 10;
l = iNumber % 10;
if(0 == l)
return TensDigitName[ValueTraits<ValueType>::Long(h) - 2];
return TensDigitName[ValueTraits<ValueType>::Long(h) - 2] + "-" + BaseDigit(l);
}template<typename ValueType>
const string EnglishNumber::HundredsDigit(const ValueType & iNumber) const{
assert(iNumber >= 0 && iNumber < 1000 && "Function HundredsDigit");
if(iNumber < 100)
return TensDigit(iNumber);
ValueType h,l;
h = iNumber / 100;
l = iNumber % 100;
if(0 == l)
return BaseDigit(h) + " hundred";
return BaseDigit(h) + " hundred and " + TensDigit(l);
}template<typename ValueType>
const string EnglishNumber::MoreDigit(const ValueType & iNumber) const{
const static string MoreName[] = {"thousand","million","billion"};
assert(iNumber >= 0 && "Function MoreNumber");
if(iNumber < 1000)
return HundredsDigit(iNumber);
ValueType n;
n = iNumber % 1000;
string result;
if(0 != n)
result = HundredsDigit(n);
n = iNumber / 1000;
int i = 0;
do{
ValueType l = n % 1000;
n /= 1000;
if(0 != l)
if(0 == result.size())
result = HundredsDigit(l) + " " + MoreName[i];
else
result = HundredsDigit(l) + " " + MoreName[i] + ", " + result;
}while(n > 0 && ++i < 3);
if(n > 0)
if(0 == result.size())
result = MoreDigit(n) + " trillion";
else
result = MoreDigit(n) + " trillion, " + result;
return result;
}template<typename ValueType>
const string EnglishNumber::NumberName(const ValueType & iNumber) const{
if(iNumber < 0)
return "minus " + MoreDigit(-iNumber);
return MoreDigit(iNumber);
}//ValueTraits.h#pragma oncetemplate<typename T>struct ValueTraits
{
static long Long(const T & v)
{
return v;
}
};
http://www.cnblogs.com/Microshaoft/archive/2005/04/02/131008.html
public class Class1
{
public static String ConvertNumberToChinese(String x, String[] Nums, String[] Digits, String[] Units)
{
String S = ""; //返回值
int p = 0; //字符位置指针
int m = x.length() % 4; //取模
// 四位一组得到组数
int k = (m > 0 ? x.length() / 4 + 1 : x.length() / 4);
// 外层循环在所有组中循环
// 从左到右 高位到低位 四位一组 逐组处理
// 每组最后加上一个单位: "[万亿]","[亿]","[万]"
for (int i = k; i > 0; i--)
{
int L = 4;
if (i == k && m != 0)
{
L = m;
}
// 得到一组四位数 最高位组有可能不足四位
String s = x.substring(p, p + L);
int l = s.length();
// 内层循环在该组中的每一位数上循环 从左到右 高位到低位
for (int j = 0; j < l; j++)
{
//处理改组中的每一位数加上所在位: "仟","佰","拾",""(个)
int n = java.lang.Integer.parseInt(s.substring(j, j+1));
if (n == 0)
{
if ((j < l - 1)
&& (java.lang.Integer.parseInt(s.substring(j + 1, j + 1+ 1)) > 0) //后一位(右低)
&& !S.endsWith(Nums[n]))
{
S += Nums[n];
}
}
else
{
//处理 1013 一千零"十三", 1113 一千一百"一十三"
if (!(n == 1 && (S.endsWith(Nums[0]) | S.length() == 0) && j == l - 2))
{
S += Nums[n];
}
S += Digits[l - j - 1];
}
}
p += L;
// 每组最后加上一个单位: [万],[亿] 等
if (i < k) //不是最高位的一组
{
if (java.lang.Integer.parseInt(s) != 0)
{
//如果所有 4 位不全是 0 则加上单位 [万],[亿] 等
S += Units[i - 1];
}
}
else
{
//处理最高位的一组,最后必须加上单位
S += Units[i - 1];
}
}
return S;
}
// 测试程序
public static void main(String[] args) throws Exception
{
//数字 数组
String[] Nums = new String[] {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
//位 数组
String[] Digits = new String[] {"", "拾", "佰", "仟"};
//单位 数组
String[] Units = new String[] {"", "[万]", "[亿]", "[万亿]"};
System.out.println(ConvertNumberToChinese("111112100113", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("1100000000", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("1000000000", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("40000000013", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("40000000001", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("400000010000", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("40101031013", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("40101031113", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("101140101031013", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("100000001000013", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("100000001000113", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("100011003", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("10010103", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("10110013", Nums, Digits, Units));
System.out.println(ConvertNumberToChinese("130000", Nums, Digits, Units));
//System.in.read();
}
}
public static void main(String[] arg) throws IOException {
String d="拾佰仟万拾佰仟亿拾佰仟万";
String s="零壹贰叁肆伍陆柒捌玖";
boolean zero=false;
int value=1101111001, count=0;
String Cvalue="";
while(value>0) {
int b=value-value/10*10;
if(!zero || b!=0) {
String t="";
if(b!=0) {
t=s.substring(b,b+1);
if(count>0) t+=d.substring(count-1,count);
zero=false;
}
else {
t="零";
zero=true;
}
Cvalue=t+Cvalue;
}
count++;
value/=10;
}
System.out.println(Cvalue);
}
}
public class test {
public static void main(String[] arg) throws IOException {
String d="拾佰仟万拾佰仟亿拾佰仟万";
String s="零壹贰叁肆伍陆柒捌玖";
boolean zero=false;
int value=2021000789, count=0;
String Cvalue="";
while(value>0) {
int b=value-value/10*10;
if(!zero || b!=0) {
String t="";
if(b!=0) {
t=s.substring(b,b+1);
if(count>0) t+=d.substring(count-1,count);
zero=false;
}
else if(count!=4 && count!=8){
t="零";
zero=true;
}
Cvalue=t+Cvalue;
}
if(count==4 && !Cvalue.contains("万")) Cvalue="万"+Cvalue;
if(count==8 && !Cvalue.contains("亿")) Cvalue="亿"+Cvalue;
count++;
value/=10;
}
System.out.println(Cvalue);
}
}
试验下,效果不错的.
----------------------------------------------
package com;import java.io.*;/**
* @author cct
*/
public class a
{
public static void main(String[] args)
{
String s = new String();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (true)
{
try
{
System.out.println("请输入数字:并回车");
s = br.readLine(); Convert c = new Convert(s.toCharArray());
System.out.println(c);
}
catch (Exception e)
{
}
}
}
}/**
* @author cct
*/
class Convert
{
final String[] str1 = { "", "拾", "百", "千" }; final String[] str2 = { "亿", "萬" }; final String[] number = { "", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; char[] num_char; StringBuffer sb = new StringBuffer(); int last; public Convert(char[] num)
{
num_char = num;
} public String toString()
{
last = num_char.length % 4;
int pos = 0;
add(sb, new String(num_char, 0, last));
pos += last;
for (int i = (int) (num_char.length / 4); i > 0; i--)
{
if (i % 2 == 0)
sb.append(str2[0]);
else
sb.append(str2[1]);
add(sb, new String(num_char, pos, 4));
pos += 4;
}
if (last == 0)
sb.deleteCharAt(0);
return sb.toString();
} /**
* @param sb
* @param temp
*/
private void add(StringBuffer sb, String temp)
{
char[] temp2 = temp.toCharArray();
int length = temp.length();
for (int i = 0; i < length; i++)
{
if (temp2[i] == '0')
if (sb.lastIndexOf("零") != sb.length() - 1 && last != 0)
sb.append("零");
else
;
else
{
sb.append(number[temp2[i] - '0']);
sb.append(str1[length - i - 1]);
}
}
try
{
if (sb.lastIndexOf("零") == sb.length() - 1)
sb.deleteCharAt(sb.lastIndexOf("零"));
}
catch (Exception e)
{
}
}
}
import java.io.*;
import java.util.*;
/**
将输入的数字用中文表示出来
*/public class NumberTest
{
private char ch;
private String[] charOfNum = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private String[] shibq = {"","拾","佰","仟"};
private String[] wany = {"个","萬","亿","萬","亿","萬","亿"}; String inputStringNum()
//从键盘输入有效数字
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String string = null;
try
{
string = reader.readLine();
}catch(IOException ex)
{
System.err.println(ex.getMessage());
}
return stringReverse(disinfectZero(string));
}
private String disinfectZero(String string)
//将输入数字有效位前面的零清除
{
int length = string.length();
int i = 0;
String stringReturn = string;
if(Long.parseLong(string) == 0L)
{
stringReturn = "0";
}
else
{
while(string.charAt(i++) == '0')
{
stringReturn = string.substring(i,length);
}
}
return stringReturn;
}
private String stringReverse(String string)
//将输入的数字倒序排列
{
int length = string.length();
String stringReturn = "";
for(int i = 0;i<length;i++)
{
ch = string.charAt(i);
stringReturn = ch+stringReturn;
}
return stringReturn;
}
public String change()
{
String string = inputStringNum();//获取输入数据
String resultStr;
String resultString = "";//保存结果
if(Long.parseLong(string) == 0L)
{
resultString = "零";
}
else
{
//将数据分为四个一组
int length = string.length();
int intoffour = length/4;
if((length%4) != 0)
{
intoffour+=1;
}
//将数据分组存放到字符串数组中,再分别转化
String stringnum[] = new String[intoffour];
for(int i = 0;i<intoffour-1;i++)
{
stringnum[i] = string.substring(i*4,(i+1)*4);
}
stringnum[intoffour-1] = string.substring((intoffour-1)*4,length);
//获得完整的表达
for(int i = 0;i<intoffour;i++)
{
resultStr = "";
for(int j = 0;j<stringnum[i].length();j++)
{
ch = stringnum[i].charAt(j);
String str = ""+ch;
int charAt = Integer.parseInt(str);
//if(charAt != 0)
//{
resultStr = charOfNum[charAt]+shibq[j]+resultStr;
//}
}
if(Integer.parseInt(stringnum[i]) != 0)
{
resultString = resultStr+wany[i]+resultString;
}
else
{
resultString = "零"+resultString;
}
}
}
resultString = resultString.replaceAll("零拾", "零");
resultString = resultString.replaceAll("零佰", "零");
resultString = resultString.replaceAll("零仟", "零");
resultString = resultString.replaceAll("[零]+", "零");
resultString = resultString.replaceAll("零个","");
resultString = resultString.replaceAll("零萬", "萬");
resultString = resultString.replaceAll("零亿", "亿");
return resultString;
}
public static void main(String[] args) throws Exception
{
NumberTest test = new NumberTest();
System.out.println(test.change());
}
}
你输入0000002 看一下结果是什么?
import java.io.*;
import java.util.*;
/**
将输入的数字用中文表示出来
*/public class NumberTest
{
private char ch;
private String[] charOfNum = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
private String[] shibq = {"","拾","佰","仟"};
private String[] wany = {"个","萬","亿","萬","亿","萬","亿"};
public String exit = null; String inputStringNum()
//从键盘输入有效数字
{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String string = null;
try
{
string = reader.readLine();
}catch(IOException ex)
{
System.err.println(ex.getMessage());
}
if(string.equals("exit"))
{
System.exit(0);
}
return stringReverse(disinfectZero(string));
}
private String disinfectZero(String string)
//将输入数字有效位前面的零清除
{
int length = string.length();
int i = 0;
String stringReturn = string;
if(Long.parseLong(string) == 0L)
{
stringReturn = "0";
}
else
{
while(string.charAt(i++) == '0')
{
stringReturn = string.substring(i,length);
}
}
return stringReturn;
}
private String stringReverse(String string)
//将输入的数字倒序排列
{
int length = string.length();
String stringReturn = "";
for(int i = 0;i<length;i++)
{
ch = string.charAt(i);
stringReturn = ch+stringReturn;
}
return stringReturn;
}
public String change()
//将数字转化为文字表达
{
String string = inputStringNum();//获取输入数据
String resultStr;
String resultString = "";//保存结果
if(Long.parseLong(string) == 0L)
{
resultString = "零";
}
else
{
//将数据分为四个一组
int length = string.length();
int intoffour = length/4;
if((length%4) != 0)
{
intoffour+=1;
}
//将数据分组存放到字符串数组中,再分别转化
String stringnum[] = new String[intoffour];
for(int i = 0;i<intoffour-1;i++)
{
stringnum[i] = string.substring(i*4,(i+1)*4);
}
stringnum[intoffour-1] = string.substring((intoffour-1)*4,length);
//获得完整的表达
for(int i = 0;i<intoffour;i++)
{
resultStr = "";
for(int j = 0;j<stringnum[i].length();j++)
{
ch = stringnum[i].charAt(j);
String str = ""+ch;
int charAt = Integer.parseInt(str);
resultStr = charOfNum[charAt]+shibq[j]+resultStr;
}
if(Integer.parseInt(stringnum[i]) != 0)
{
resultString = resultStr+wany[i]+resultString;
}
else
{
resultString = "零"+resultString;
}
}
}
resultString = resultString.replaceAll("零拾", "零");
resultString = resultString.replaceAll("零佰", "零");
resultString = resultString.replaceAll("零仟", "零");
resultString = resultString.replaceAll("[零]+", "零");
resultString = resultString.replaceAll("零个","");
resultString = resultString.replaceAll("个","");
resultString = resultString.replaceAll("零萬", "萬");
resultString = resultString.replaceAll("零亿", "亿");
return resultString;
}
public static void main(String[] args) throws Exception
{
NumberTest test = new NumberTest();
System.out.println("请输入数字并回车,若要退出请输入exit");
while(true)
{
System.out.println(test.change());
}
}
}
public class RMBConvert
{
public RMBConvert()
{
} private static string[] faceVal = new String[] { "零", "壹", "贰", "叁", "肆",
"伍", "陆", "柒", "捌", "玖" }; private static string []unit = new string[]{"仟","佰","拾",""}; private static string[] level = new String[] { "圆", "拾", "佰", "仟", "萬", "亿" }; public string Convert(string rmb)
{
int len = 0;
string ret = "";
string tmpY = "";
string tmpW = "";
string tmpG = "";
bool bFlag = false;
if(rmb.Length > 8)
rmb = rmb.PadLeft(12, '0');
else if(rmb.Length > 4)
rmb = rmb.PadLeft(8, '0');
else rmb = rmb.PadLeft(4, '0'); if(rmb.Length > 8)
{
tmpY = ConvertSection(rmb, 0, 4, false);
if(tmpY != "零")
{
ret += tmpY + "亿";
bFlag = true;
}
tmpW = ConvertSection(rmb, 4, 4, bFlag);
if(tmpW != "零")
{
ret += tmpW + "万";
bFlag = true;
}
tmpG = ConvertSection(rmb, 8, 4, bFlag);
if(tmpG != "零")
ret += tmpG;
else{
if(tmpY == "零" && tmpW == "零" && tmpG == "零")
ret = "零";
}
}
else if(rmb.Length > 4)
{
tmpW = ConvertSection(rmb, 0, 4, false);
if(tmpW != "零")
{
ret += tmpW + "万";
bFlag = true;
}
tmpG = ConvertSection(rmb, 4, 4, bFlag);
if(tmpG != "零")
{
ret += tmpG;
}
else
{
if(tmpW == "零")
ret = "零";
}
}
else{
ret = ConvertSection(rmb, 0, 4, false);
}
return ret;
} public string ConvertSection(string value, int start, int len, bool headerZero)
{
return ConvertSection(value.Substring(start, len), headerZero);
} public string ConvertSection(string value)
{
return ConvertSection(value, false);
}
/// <summary>
/// 主要看这个了
/// </summary>
/// <param name="value"></param>
/// <param name="headerZero"></param>
/// <returns></returns>
public string ConvertSection(string value, bool headerZero)
{
string regVal = value.PadLeft(4, '0');
string strOutput = ""; int state = 0;
for(int i=0; i<4;i++)
{
int crr = regVal[i] - 0x30;
switch(state)
{
case 0:
if( crr == 0 )
{
state = 1;
}
else{
state = 2;
strOutput += faceVal[crr] + unit[i];
}
break;
case 1:
if( crr == 0 )
{
state = 3;
}
else
{
state = 5;
if( headerZero )
strOutput += "零";
strOutput += faceVal[crr] + unit[i];
}
break;
case 2:
if( crr == 0 )
{
state = 4;
}
else
{
state = 5;
strOutput += faceVal[crr] + unit[i];
}
break;
case 3:
if( crr == 0 )
{
state = 11;
}
else
{
state = 6;
if( headerZero )
strOutput += "零";
strOutput += faceVal[crr] + unit[i];
}
break;
case 4:
if( crr == 0 )
{
state = 7;
}
else
{
state = 6;
strOutput += "零" + faceVal[crr] + unit[i];
}
break;
case 5:
if( crr == 0 )
{
state = 7;
}
else
{
state = 6;
strOutput += faceVal[crr] + unit[i];
}
break;
case 6:
if( crr == 0 )
{
state = 8;
}
else
{
state = 9;
strOutput += faceVal[crr] + unit[i];
}
break;
case 7:
if( crr == 0 )
{
state = 10;
}
else
{
state = 9;
strOutput += "零" + faceVal[crr] + unit[i];
}
break;
case 11:
if( crr == 0 )
{
state = 12;
strOutput = "零";
}
else
{
state = 13;
if( headerZero )
strOutput += "零";
strOutput += faceVal[crr] + unit[i];
}
break;
case 8:break;
case 9:break;
case 10:break;
case 12:break;
case 13:break;
} // end of switch
} // end of for
return strOutput;
}
}
private static String[] UNIT = { "圆", "拾", "佰", "仟", "万", "拾", "佰", "仟",
"亿", "拾", "佰", "仟" }; private static String[] CHINESE_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍",
"陆", "柒", "捌", "玖" }; private static String NUMBER = "0123456789"; public static void main(String[] args) {
long amount = 100000006543L;
String result = formatMoney(amount);
System.out.print(result);
} public static String formatMoney(long amount) {
String money = Long.toString(amount);
String result = "";
char letter;
boolean hasZero = false;
final int count = money.length();
for (int i = 0; i < count; i++) {
letter = money.charAt(i);
if (letter == '0') {
hasZero = true;
if (count - 1 - i == 0) {
result += "圆";
}
if (count - 1 - i == 4 && !result.endsWith("亿")) {
result += "万";
hasZero = false;
}
if (count - 1 - i == 8) {
result += "亿";
hasZero = false;
}
} else {
if (hasZero) {
result += "零" + CHINESE_NUMBER[NUMBER.indexOf(letter)]
+ UNIT[count - 1 - i];
} else {
result += CHINESE_NUMBER[NUMBER.indexOf(letter)]
+ UNIT[count - 1 - i];
}
hasZero = false;
}
}
return result;
}
}
就是以八位为区分,超过八位后只不过增加了个亿罢了,在八位以前都是一样的,所以程序实现就是以八位为节点,先算出每个八位的数值,再不是第一个八位(从右边数),每增加一个八位就增加一个亿字就可以了!
具体实现如下:(以下是DELPHI实现)
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls;type
TForm1 = class(TForm)
LedtNum: TLabeledEdit;
BitBtn1: TBitBtn;
ComboBox1: TComboBox;
memo: TMemo;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
procedure ConvertNumber(value: string);
public
{ Public declarations }
end;const
ROWMAX = 2; //最大的编号
COLMAX = 3; U_NUM: array[0..9] of string = ('零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖');
U_LEV: array[0..ROWMAX, 0..COLMAX] of string = (('', '拾', '佰', '仟'),
('', '', '', '萬'),
('', '', '', '亿')
);
{
其实实现的原理很简单,开始也想错了!
就是以八位为区分,超过八位后只不过增加了个亿罢了,在八位以前都是一样的,
所以程序实现就是以八位为节点,先算出每个八位的数值,再不是第一个八位(从右边数),
每增加一个八位就增加一个亿字就可以了!
具体实现如下:
}
var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ConvertNumber(LedtNum.Text);
end;procedure TForm1.ConvertNumber(value: string);
var
i, i2, i3: integer;
tmpD, tmpM: integer;//整数部分及小数部分
tmpStrs: array of string;
tmpLst: TStringList;
tmpStr, tmpStr1: string; function getStr(aValue: string): string;
var
tmpS2: string;
begin
result := '';
i := length(aValue);
while i>0 do
begin
i2 := length(aValue)-i+1;
if aValue[i] <>'0' then
begin
tmpD := (i2-1) div 4;
tmpM := (i2-1) mod 4; tmpS2 := '';
if tmpD > 0 then
begin
if (tmpD>0) and (tmpD<=2) then
begin
if AnsiPos(U_LEV[tmpD, COLMAX], result)>0 then
tmpS2 := U_LEV[0, tmpM]
else
tmpS2 := U_LEV[0, tmpM]+U_LEV[tmpD, COLMAX];
end;
result := aValue[i]+tmpS2+result;
end else begin
result := aValue[i]+U_LEV[tmpD, tmpM]+result;
end; end else result := aValue[i]+result; dec(i);
end;
end;begin
tmpLst := TStringList.Create;
try
while (length(value) > 0) do
begin
if length(value)< 8 then
begin
tmpLst.Add(value);
break;
end else begin
tmplst.Add(copy(value, length(value)-8+1, 8));
value := copy(value, 1, length(value)-8);
end;
end; setLength(tmpStrs, tmpLst.Count); for i3 := 0 to tmpLst.Count-1 do
begin
tmpStrs[i3] := getStr(tmpLst.Strings[i3]);
for i := 1 to i3 do
tmpStrs[i3] := tmpStrs[i3]+'亿';
end; for i3 := high(tmpStrs) downto low(tmpStrs) do
tmpStr := tmpStr+tmpStrs[i3]; while (AnsiPos('00', tmpStr)>0) do
begin
tmpStr := StringReplace(tmpStr, '00', '0', [rfReplaceAll]);
end; tmpStr := StringReplace(tmpStr, '0亿', '亿', [rfReplaceAll]); tmpStr1 := tmpStr;
for i3 := 1 to length(tmpStr) do
begin
if tmpStr[i3] in ['0'..'9'] then
begin
tmpStr1 := StringReplace(tmpStr1, tmpStr[i3], U_NUM[strToInt(tmpStr[i3])], [rfReplaceAll]);
end;
end; memo.Text := tmpStr1;
combobox1.Items := tmpLst; finally
tmpLst.Free;
end;end;end.
你所说的不是主要问题,只要在处理时对输入的数字预处理一下就可以了!
public class DigitToChinese
{
public static final String CHINESE_NUMBER="零壹贰叁肆伍陆柒捌玖";
private static final String CARRY_UNITS[]={"","拾","佰","仟"};
private static final String CARRY_UNITS_BIG[]={"","万","亿","兆","硕","京"};
public String convert(String digit){
return convert(toIntArray(digit));
} private int [] toIntArray(String digit){
char [] chars = digit.toCharArray();
int [] toReturn = new int[digit.length()];
for(int i=0;i<toReturn.length;i++){
toReturn[i] = (chars[i]-'0');
if(toReturn[i]<0||(chars[i]-'0')>9)
throw new NumberFormatException("数字字符串格式不正确");
}
return toReturn;
} private String convert(int [] digit){
StringBuffer out = new StringBuffer();
int maxLen=CARRY_UNITS.length*(CARRY_UNITS_BIG.length-1);
int offset = 0;
boolean outZero = false;
for(int i=0;i<maxLen&&(i+offset)<digit.length;i++){
int curDigit = digit.length-(i+offset+1);
if(i%CARRY_UNITS.length==0&&shouldOutBigUnit(digit,curDigit)) {
out.append(CARRY_UNITS_BIG[i/CARRY_UNITS.length]);
outZero=false;
}
if(digit[digit.length-(i+offset+1)]!=0){
out.append(CARRY_UNITS[i%CARRY_UNITS.length]);
out.append(CHINESE_NUMBER.charAt(digit[curDigit]));
outZero = true;
}else{
if(outZero){
out.append(CHINESE_NUMBER.charAt(0));
outZero=false;
}
}
if(i==maxLen-1&&digit.length>maxLen){
i=-1;
offset+=maxLen;
if(shouldOutBigUnit(digit,digit.length-(offset+1)))
out.append(CARRY_UNITS_BIG[CARRY_UNITS_BIG.length-1]);
}
}
return reverse(out).toString();
}
public boolean shouldOutBigUnit(int [] digit,int p){
for(int i=0;i<CARRY_UNITS.length&&(p-i)>=0;i++){
if(digit[p-i]!=0)
return true;
}
return false;
}
private StringBuffer reverse(StringBuffer sb){
int len = sb.length();
for(int i=0;i<len/2;i++){
char a = sb.charAt(i);
sb.setCharAt(i, sb.charAt(len-i-1));
sb.setCharAt(len-i-1, a);
}
return sb;
} public static void main(String[] args) {
DigitToChinese dtc = new DigitToChinese();
dtc.convert("100564100515140122");
}
}
import java.util.Vector;
class Converter {
// 中国的计数是四位一个单位的处理方式 例如 1 5487 4584 对应的单位是 亿 万 默认
// 每四位的一个单元中,处理方式是一样的,当前能够处理的最大绝对值位数是UNIT_NAME.length * 4
private final static String[] UNIT_NAME = {"亿", "萬", ""};
private final static String[] SUB_UNIT_NAME = {"仟", "佰", "拾"};
private final static String[] NUMBER_NAME = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
private static Hashtable<Integer, String> nums = new Hashtable<Integer, String>();
static {
for (int i = 0; i < NUMBER_NAME.length; i++) {
nums.put(i, NUMBER_NAME[i]);
}
}
public static String convert(long value) throws TooBigNumberException {
boolean isMinus = value < 0;
if (isMinus) {
value = Math.abs(value);
}
String result = "";
String valueString = String.valueOf(value);
char[] chars = valueString.toCharArray();
if (chars.length > UNIT_NAME.length * 4) {
throw new TooBigNumberException();
} else {
// 当前可以处理,进行四段分割,每部分进行相同的处理,再添加各自段的单位
String[] segments = splitValue2Segments(chars, 4);
for (int i = 0; i < segments.length; i++) {
System.out.println("Segment " + i + " :" + segments[i]);
}
for (int i = 0, j = UNIT_NAME.length - segments.length; i < segments.length; i++) {
result += translate(segments[i]) + UNIT_NAME[j++];
}
}
if (isMinus) {
result = "负" + result;
}
return result;
}
/**
* 将一个最多四个数的片段转换为自然语言表示方式 每一段由最多四为组成,最大数为9999
*
* @param value
* @return
*/
private static String translate(String value) {
String result = "";
int intValue = Integer.parseInt(value);
int thousandBit = intValue / 1000;
int hundredBit = (intValue - thousandBit * 1000) / 100;
int tenthBit = (intValue - thousandBit * 1000 - hundredBit * 100) / 10;
int oneBit = intValue - thousandBit * 1000 - hundredBit * 100 - tenthBit * 10;
if (thousandBit > 0) {
result += nums.get(thousandBit) + "仟";
if (hundredBit > 0) {
result += nums.get(hundredBit) + "佰";
result += nums.get(tenthBit) + "拾";
result += nums.get(oneBit);
} else {
result += "零";
result += nums.get(tenthBit) + "拾";
result += nums.get(oneBit);
}
} else {
if (hundredBit > 0) {
result += nums.get(hundredBit) + "佰";
result += nums.get(tenthBit) + "拾";
result += nums.get(oneBit);
} else {
if (tenthBit > 0) {
result += nums.get(tenthBit) + "拾";
result += nums.get(oneBit);
} else {
result += nums.get(oneBit);
}
}
}
// System.out.println("Translate " + value + " To :" + result);
return result;
}
public static void main(String[] args) {
try {
System.out.println(convert(-3423555));
} catch (TooBigNumberException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 把字符数组分割为指定段数
*
* @param chars
* @return
*/
public static String[] splitValue2Segments(char[] chars, int segments) {
int count = 0;
Vector<String> v = new Vector<String>();
StringBuffer sb = new StringBuffer();
for (int i = chars.length - 1; i >= 0; i--) {
if (count >= segments) {
v.add(sb.toString());
sb = new StringBuffer();
count = 0;
}
sb.insert(0, chars[i]);
count++;
}
if (sb.length() > 0) {
v.add(sb.toString());
}
String[] result = new String[v.size()];
for (int i = v.size() - 1, j = 0; i >= 0; i--) {
result[j++] = v.elementAt(i);
}
return result;
}
}
class TooBigNumberException extends Exception {
public String toString() {
return "数值过大,当前系统无法处理。";
}
}
1)一般情况下,正确地对应中文和数字的叫法,这主要是根据“拾佰仟万”以后应该再叫“拾佰仟”万,“亿”以后应该重复“拾佰仟万”亿来确定,所以,我们给出完整的单位序列应该是“拾佰仟万拾佰仟亿拾佰仟万”(由于整形的位数限制,到这里就够了);
2)出现0的情况,习惯上就应该有一个,而且只有一个零就够了,比如:1003应该叫做一千零三
3)当在万和亿以上的数字,如果出现0,应该加上万和亿的单位,如:10030叫一万零三叁拾,1003000040叫做一拾亿零叁佰万零四拾
4)特殊的,如果有1000000001应叫一拾亿零一,中间不要有万的情况出现
所以,个人觉得前面我给出的程序是对的,基本解决了这几个问题,而且程序也不太复杂,大家讨论。这了再贴一次:
public static void main(String[] arg) throws IOException {
String d="拾佰仟万拾佰仟亿拾佰仟万";
String s="零壹贰叁肆伍陆柒捌玖";
boolean zero=false;
long value=1000000009;
int count=0;
String Cvalue="";
while(value>0) {
int b=(int)(value % 10);
if(!zero || b!=0) {
String t="";
if(b!=0) {
t=s.substring(b,b+1);
if(count>0) t+=d.substring(count-1,count);
zero=false;
}
else if(count!=4 && count!=8){
t="零";
zero=true;
}
Cvalue=t+Cvalue;
}
if(count==4 && !Cvalue.contains("万")) Cvalue="万"+Cvalue;
if(count==8 && !Cvalue.contains("亿")) Cvalue="亿"+Cvalue;
count++;
value/=10;
}
Cvalue=Cvalue.replaceFirst("亿万","亿");
System.out.println(Cvalue);
}
以下是几个结果:
1000000009:壹拾亿零玖
1023000009:壹拾亿贰仟叁佰万零玖
123000809:壹亿贰仟叁佰万零捌佰零玖
1230809:壹佰贰拾叁万零捌佰零玖
18009:壹万捌仟零玖
8092:捌仟零玖拾贰
import java.util.Vector;
class Converter {
// 中国的计数是四位一个单位的处理方式 例如 1 5487 4584 对应的单位是 亿 万 默认
// 每四位的一个单元中,处理方式是一样的,当前能够处理的最大绝对值位数是UNIT_NAME.length * 4
private final static String[] UNIT_NAME = {"亿", "萬", ""};
private final static String[] SUB_UNIT_NAME = {"仟", "佰", "拾"};
private final static String[] NUMBER_NAME = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
private static Hashtable<Integer, String> nums = new Hashtable<Integer, String>();
static {
for (int i = 0; i < NUMBER_NAME.length; i++) {
nums.put(i, NUMBER_NAME[i]);
}
}
public static String convert(long value) throws TooBigNumberException {
boolean isMinus = value < 0;
if (isMinus) {
value = Math.abs(value);
}
String result = "";
String valueString = String.valueOf(value);
char[] chars = valueString.toCharArray();
if (chars.length > UNIT_NAME.length * 4) {
throw new TooBigNumberException();
} else {
// 当前可以处理,进行四段分割,每部分进行相同的处理,再添加各自段的单位
String[] segments = splitValue2Segments(chars, 4);
for (int i = 0, j = UNIT_NAME.length - segments.length; i < segments.length; i++) {
if (segments.length > 1 && i == segments.length - 1) {
result += "零";
}
result += translate(segments[i]) + UNIT_NAME[j++];
}
}
if (isMinus) {
result = "负" + result;
}
return result;
}
/**
* 将一个最多四个数的片段转换为自然语言表示方式 每一段由最多四为组成,最大数为9999
*
* @param value
* @return
*/
private static String translate(String value) {
String result = "";
int intValue = Integer.parseInt(value);
int thousandBit = intValue / 1000;
int hundredBit = (intValue - thousandBit * 1000) / 100;
int tenthBit = (intValue - thousandBit * 1000 - hundredBit * 100) / 10;
int oneBit = intValue - thousandBit * 1000 - hundredBit * 100 - tenthBit * 10;
if (thousandBit > 0) {
result += nums.get(thousandBit) + "仟";
if (hundredBit > 0) {
result += nums.get(hundredBit) + "佰";
if (tenthBit > 0) {
result += nums.get(tenthBit) + "拾";
if (oneBit > 0) {
result += nums.get(oneBit);
}
} else {
if (oneBit > 0) {
result += "零";
result += nums.get(oneBit);
}
}
} else {
if (tenthBit > 0) {
result += "零";
result += nums.get(tenthBit) + "拾";
if (oneBit > 0) {
result += nums.get(oneBit);
}
} else {
if (oneBit > 0) {
result += nums.get(oneBit);
} } }
} else {
if (hundredBit > 0) {
result += nums.get(hundredBit) + "佰";
if (tenthBit > 0) {
result += nums.get(tenthBit) + "拾";
if (oneBit > 0) {
result += nums.get(oneBit);
}
} else {
if (oneBit > 0) {
result += "零";
result += nums.get(oneBit);
}
}
} else {
if (tenthBit > 0) {
result += nums.get(tenthBit) + "拾";
if (oneBit > 0) {
result += nums.get(oneBit);
}
} else {
if (oneBit > 0) {
result += nums.get(oneBit);
}
}
}
}
// System.out.println("Translating from " + value + " To :" + result);
return result;
}
public static void main(String[] args) {
try {
System.out.println(convert(10000004));
} catch (TooBigNumberException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 把字符数组分割为指定段数
*
* @param chars
* @return
*/
public static String[] splitValue2Segments(char[] chars, int segments) {
int count = 0;
Vector<String> v = new Vector<String>();
StringBuffer sb = new StringBuffer();
for (int i = chars.length - 1; i >= 0; i--) {
if (count >= segments) {
v.add(sb.toString());
sb = new StringBuffer();
count = 0;
}
sb.insert(0, chars[i]);
count++;
}
if (sb.length() > 0) {
v.add(sb.toString());
}
String[] result = new String[v.size()];
for (int i = v.size() - 1, j = 0; i >= 0; i--) {
result[j++] = v.elementAt(i);
}
return result;
}
}
class TooBigNumberException extends Exception {
public String toString() {
return "数值过大,当前系统无法处理。";
}
}
import java.util.Vector;
class Converter {
// 中国的计数是四位一个单位的处理方式 例如 1 5487 4584 对应的单位是 亿 万 默认
// 每四位的一个单元中,处理方式是一样的,当前能够处理的最大绝对值位数是UNIT_NAME.length * 4
private final static String[] UNIT_NAME = {"亿", "萬", ""};
private final static String[] SUB_UNIT_NAME = {"仟", "佰", "拾"};
private final static String[] NUMBER_NAME = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
private static Hashtable<Integer, String> nums = new Hashtable<Integer, String>();
static {
for (int i = 0; i < NUMBER_NAME.length; i++) {
nums.put(i, NUMBER_NAME[i]);
}
}
public static String convert(long value) throws TooBigNumberException {
boolean isMinus = value < 0;
if (isMinus) {
value = Math.abs(value);
}
String result = "";
String valueString = String.valueOf(value);
char[] chars = valueString.toCharArray();
if (chars.length > UNIT_NAME.length * 4) {
throw new TooBigNumberException();
} else {
// 当前可以处理,进行四段分割,每部分进行相同的处理,再添加各自段的单位
String[] segments = splitValue2Segments(chars, 4);
for (int i = 0, j = UNIT_NAME.length - segments.length; i < segments.length; i++) {
if (segments.length > 1 && i == segments.length - 1) {
if (Integer.parseInt(segments[i]) < 100) {
result += "零";
}
}
result += translate(segments[i]) + UNIT_NAME[j++];
}
}
if (isMinus) {
result = "负" + result;
}
return result;
}
/**
* 将一个最多四个数的片段转换为自然语言表示方式 每一段由最多四为组成,最大数为9999
*
* @param value
* @return
*/
private static String translate(String value) {
String result = "";
int intValue = Integer.parseInt(value);
int thousandBit = intValue / 1000;
int hundredBit = (intValue - thousandBit * 1000) / 100;
int tenthBit = (intValue - thousandBit * 1000 - hundredBit * 100) / 10;
int oneBit = intValue - thousandBit * 1000 - hundredBit * 100 - tenthBit * 10;
if (thousandBit > 0) {
result += nums.get(thousandBit) + "仟";
if (hundredBit > 0) {
result += nums.get(hundredBit) + "佰";
if (tenthBit > 0) {
result += nums.get(tenthBit) + "拾";
if (oneBit > 0) {
result += nums.get(oneBit);
}
} else {
if (oneBit > 0) {
result += "零";
result += nums.get(oneBit);
}
}
} else {
if (tenthBit > 0) {
result += "零";
result += nums.get(tenthBit) + "拾";
if (oneBit > 0) {
result += nums.get(oneBit);
}
} else {
if (oneBit > 0) {
result += nums.get(oneBit);
} } }
} else {
if (hundredBit > 0) {
result += nums.get(hundredBit) + "佰";
if (tenthBit > 0) {
result += nums.get(tenthBit) + "拾";
if (oneBit > 0) {
result += nums.get(oneBit);
}
} else {
if (oneBit > 0) {
result += "零";
result += nums.get(oneBit);
}
}
} else {
if (tenthBit > 0) {
result += nums.get(tenthBit) + "拾";
if (oneBit > 0) {
result += nums.get(oneBit);
}
} else {
if (oneBit > 0) {
result += nums.get(oneBit);
}
}
}
}
// System.out.println("Translating from " + value + " To :" + result);
return result;
}
public static void main(String[] args) {
try {
System.out.println(convert(8888683));
} catch (TooBigNumberException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 把字符数组分割为指定段数
*
* @param chars
* @return
*/
public static String[] splitValue2Segments(char[] chars, int segments) {
int count = 0;
Vector<String> v = new Vector<String>();
StringBuffer sb = new StringBuffer();
for (int i = chars.length - 1; i >= 0; i--) {
if (count >= segments) {
v.add(sb.toString());
sb = new StringBuffer();
count = 0;
}
sb.insert(0, chars[i]);
count++;
}
if (sb.length() > 0) {
v.add(sb.toString());
}
String[] result = new String[v.size()];
for (int i = v.size() - 1, j = 0; i >= 0; i--) {
result[j++] = v.elementAt(i);
System.out.println(v.elementAt(i));
}
return result;
}
}
class TooBigNumberException extends Exception {
public String toString() {
return "数值过大,当前系统无法处理。";
}
}
……
Cvalue=Cvalue.replaceFirst("亿万","亿");//去除亿万连接的非法情况
if(Cvalue.endsWith("零")) Cvalue=Cvalue.substring(0,Cvalue.length()-1);//去除尾零
System.out.println(Cvalue);
……
一个例子为:
1002003090:壹拾亿零贰佰零万叁仟零玖拾
import java.util.Vector;
class Converter {
// 中国的计数是四位一个单位的处理方式 例如 1 5487 4584 对应的单位是 亿 万 默认
// 每四位的一个单元中,处理方式是一样的,当前能够处理的最大绝对值位数是UNIT_NAME.length * 4
private final static String[] UNIT_NAME = {"亿", "萬", ""};
private final static String[] SUB_UNIT_NAME = {"仟", "佰", "拾"};
private final static String[] NUMBER_NAME = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
private static Hashtable<Integer, String> nums = new Hashtable<Integer, String>();
static {
for (int i = 0; i < NUMBER_NAME.length; i++) {
nums.put(i, NUMBER_NAME[i]);
}
}
public static String convert(long value) throws TooBigNumberException {
boolean isMinus = value < 0;
if (isMinus) {
value = Math.abs(value);
}
String result = "";
String valueString = String.valueOf(value);
char[] chars = valueString.toCharArray();
if (chars.length > UNIT_NAME.length * 4) {
throw new TooBigNumberException();
} else {
// 当前可以处理,进行四段分割,每部分进行相同的处理,再添加各自段的单位
String[] segments = splitValue2Segments(chars, 4);
for (int i = 0, j = UNIT_NAME.length - segments.length; i < segments.length; i++, j++) {
if (segments.length > 1 && i == segments.length - 1) {
if (Integer.parseInt(segments[i]) < 100) {
result += "零";
}
}
if (Integer.parseInt(segments[i]) > 0) {
result += translate(segments[i]) + UNIT_NAME[j];
} }
}
if (isMinus) {
result = "负" + result;
}
return result;
}
/**
* 将一个最多四个数的片段转换为自然语言表示方式 每一段由最多四为组成,最大数为9999
*
* @param value
* @return
*/
private static String translate(String value) {
String result = "";
int intValue = Integer.parseInt(value);
int thousandBit = intValue / 1000;
int hundredBit = (intValue - thousandBit * 1000) / 100;
int tenthBit = (intValue - thousandBit * 1000 - hundredBit * 100) / 10;
int oneBit = intValue - thousandBit * 1000 - hundredBit * 100 - tenthBit * 10;
if (thousandBit > 0) {
result += nums.get(thousandBit) + "仟";
if (hundredBit > 0) {
result += nums.get(hundredBit) + "佰";
if (tenthBit > 0) {
if (tenthBit > 1) {
result += nums.get(tenthBit) + "拾";
} else {
result += "拾";
} if (oneBit > 0) {
result += nums.get(oneBit);
}
} else {
if (oneBit > 0) {
result += "零";
result += nums.get(oneBit);
}
}
} else {
if (tenthBit > 0) {
result += "零";
if (tenthBit > 1) {
result += nums.get(tenthBit) + "拾";
} else {
result += "拾";
} if (oneBit > 0) {
result += nums.get(oneBit);
}
} else {
if (oneBit > 0) {
result += nums.get(oneBit);
} } }
} else {
if (hundredBit > 0) {
result += nums.get(hundredBit) + "佰";
if (tenthBit > 0) {
if (tenthBit > 1) {
result += nums.get(tenthBit) + "拾";
} else {
result += "拾";
} if (oneBit > 0) {
result += nums.get(oneBit);
}
} else {
if (oneBit > 0) {
result += "零";
result += nums.get(oneBit);
}
}
} else {
if (tenthBit > 0) {
if (tenthBit > 1) {
result += nums.get(tenthBit) + "拾";
} else {
result += "拾";
}
if (oneBit > 0) {
result += nums.get(oneBit);
}
} else {
if (oneBit > 0) {
result += nums.get(oneBit);
}
}
}
}
// System.out.println("Translating from " + value + " To :" + result);
return result;
}
public static void main(String[] args) {
try {
System.out.println(convert(1000000009));
} catch (TooBigNumberException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 把字符数组分割为指定段数
*
* @param chars
* @return
*/
public static String[] splitValue2Segments(char[] chars, int segments) {
int count = 0;
Vector<String> v = new Vector<String>();
StringBuffer sb = new StringBuffer();
for (int i = chars.length - 1; i >= 0; i--) {
if (count >= segments) {
v.add(sb.toString());
sb = new StringBuffer();
count = 0;
}
sb.insert(0, chars[i]);
count++;
}
if (sb.length() > 0) {
v.add(sb.toString());
}
String[] result = new String[v.size()];
for (int i = v.size() - 1, j = 0; i >= 0; i--) {
result[j++] = v.elementAt(i);
System.out.println(v.elementAt(i));
}
return result;
}
}
class TooBigNumberException extends Exception {
public String toString() {
return "数值过大,当前系统无法处理。";
}
}
import java.util.regex.*;
public class MoneyTranslater {
public static final String [] unitStrs={"","万","亿","兆"};
public static final String [] numUnitStrs={"","拾","佰","仟"};
public static final String [] numStrs={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
public static String translate(String num){
StringBuffer returnStr=new StringBuffer();
//String num=String.valueOf(number);
String [] strs1=splitByDigit(num, 4);
boolean f=true;//类似于flag
boolean f2=true;//类似于flag2
boolean flag2=true;//可以补零 则为true
for (int i = 0; i < strs1.length; i++) {
int m=Integer.valueOf(strs1[i]);
if(f){
if(m==0) continue;
else{
f=false;
}
}
if(m==0){
if(f2&&flag2){//如果在其后面的可以补零标志已经为true 并且区域可以补零 则补零
returnStr.insert(0, numStrs[0]);
f2=false;
}
continue;
}else{
f2=true;//若出现不为零的区域 则置区域补零标志为true
}
returnStr.insert(0, unitStrs[i]);
boolean flag=true;//如果从首位开始往前 出现第一个不为零的数 则为false;
String [] strs2=splitByDigit(strs1[i],1);
for (int j = 0; j < strs2.length; j++) {
int n=Integer.valueOf(strs2[j]);
if(flag){
if(n==0) continue;//在还没有出现第一个不为零的位时出现零 则跳过
else{
flag=false; //从个位开始已经出现不为零的数 可以开始计数
}
}
if(n==0){
if(flag2){
returnStr.insert(0,numStrs[0]);
flag2=false;//已经补了一个零 若再次出现0 则跳过 除非出现非零位之后
}
continue;
}else{
flag2=true;//出现非零位 标志置为true 表示可以补零
}
returnStr.insert(0, numUnitStrs[j]);
returnStr.insert(0, numStrs[n]);
}
}
return returnStr.toString();
}
/**
* 这个方法实现将源操作字符串src,按给定的分割位数分割 比如
* <code>String[] ss=splitByDigit("123456889abcdefg",4)</code>的结果是一个数组
* @param src
* @param digit
* @return
*/
public static String[] splitByDigit(String src,int digit){
String destStr=src;
ArrayList<String> list=new ArrayList<String>();
while(destStr.length()>0){
if(destStr.length()>digit){
list.add(destStr.substring(destStr.length()-digit));
destStr=destStr.substring(0,destStr.length()-digit);
}else{
list.add(destStr);
destStr="";
}
}
String [] returnS=new String [list.size()];
return list.toArray(returnS);
}
/**
* @param args
*/
public static void main(String[] args) { System.out.println(translate("12000001000001"));
}
}
以上的unitStrs可以自己修改单位
import java.util.regex.*;
public class MoneyTranslater {
public static final String [] unitStrs={"","万","亿","兆"};
public static final String [] numUnitStrs={"","拾","佰","仟"};
public static final String [] numStrs={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
public static String translate(String num){
StringBuffer returnStr=new StringBuffer();
//String num=String.valueOf(number);
String [] strs1=splitByDigit(num, 4);
boolean f=true;//类似于flag
boolean f2=true;//类似于flag2
boolean flag2=true;//可以补零 则为true
boolean f3=true;//在每个大单位出现之后 是否能加零
for (int i = 0; i < strs1.length; i++) {
int m=Integer.valueOf(strs1[i]);
if(f){
if(m==0) continue;
else{
f=false;
}
}
if(m==0){
if(f2&&flag2){//如果在其后面的可以补零标志已经为true 并且区域可以补零 则补零
returnStr.insert(0, numStrs[0]);
f2=false;
}
continue;
}else{
f2=true;//若出现不为零的区域 则置区域补零标志为true
}
returnStr.insert(0, unitStrs[i]);
boolean flag=true;//如果从首位开始往前 出现第一个不为零的数 则为false;
String [] strs2=splitByDigit(strs1[i],1);
for (int j = 0; j < strs2.length; j++) {
int n=Integer.valueOf(strs2[j]);
if(flag){
if(n==0){
if(f3&&i!=0){
returnStr.insert(1, numStrs[0]);
f3=false;
}
continue;//在还没有出现第一个不为零的位时出现零 则跳过
}
else{
flag=false; //从个位开始已经出现不为零的数 可以开始计数
}
}
if(n==0){
if(flag2){
returnStr.insert(0,numStrs[0]);
flag2=false;//已经补了一个零 若再次出现0 则跳过 除非出现非零位之后
}
continue;
}else{
flag2=true;//出现非零位 标志置为true 表示可以补零
}
returnStr.insert(0, numUnitStrs[j]);
returnStr.insert(0, numStrs[n]);
}
f3=true;
}
return returnStr.toString();
}
/**
* 这个方法实现将源操作字符串src,按给定的分割位数分割 比如
* <code>String[] ss=splitByDigit("123456889abcdefg",4)</code>的结果是一个数组
* @param src
* @param digit
* @return
*/
public static String[] splitByDigit(String src,int digit){
String destStr=src;
ArrayList<String> list=new ArrayList<String>();
while(destStr.length()>0){
if(destStr.length()>digit){
list.add(destStr.substring(destStr.length()-digit));
destStr=destStr.substring(0,destStr.length()-digit);
}else{
list.add(destStr);
destStr="";
}
}
String [] returnS=new String [list.size()];
return list.toArray(returnS);
}
/**
* @param args
*/
public static void main(String[] args) { System.out.println(translate("10200101001001"));
}
}
做了一下修正 单位之间的零可以出现了
修正自己的程序
package jm.util;import java.util.ArrayList;/**
* <p>Title: JM 整合Swing控件,使用配置信息</p>
*
* <p>Copyright: Copyright (c) 2004-2006</p>
*
* <p>Company: 1SHome</p>
*
* <p>@author Spook</p>
*
* @since 1.3
* @see JDK 1.5.0.6
*/
public class JMRectangle
{
@SuppressWarnings("unchecked")
public static String daxie(String sum)
{
String [] n=new String[10];
n[0]="";
n[1]="壹";
n[2]="贰";
n[3]="叁";
n[4]="肆";
n[5]="伍";
n[6]="陆";
n[7]="柒";
n[8]="捌";
n[9]="玖";
String [] d=new String[10];
d[0]="";
d[1]="拾";
d[2]="佰";
d[3]="仟";
String [] e=new String[10];
e[0]="萬";
e[1]="亿"; //计算数字的位数
int wei= sum.length();
System.out.println("计算数字的位数=="+wei); ArrayList str = new ArrayList();
int digit = 0;
int digit1 = 0;
for (int i = wei - 1; i >= 0; i--) {
if (digit == 4) {
digit = 0;
str.add(0, e[digit1]);
digit1++;
if(digit1==2)digit1=0;
}
if (!"0".equals("" + sum.charAt(i))) {
str.add(0, d[digit]);
str.add(0, n[Integer.parseInt("" + sum.charAt(i))]);
}
digit++;
}
System.out.println(str);
return str.toString();
} public static void main(String[] args)
{
System.out.println(daxie("1234567890001"));
}
}简单好用
(!"0".equals("" + sum.charAt(i))) 为什么不写成(!'0'==sum.charAt(i))
ArrayList str = new ArrayList();为什么不写成List str=new ArrayList();命名也不太规范
数组为什么不写成 private static String[] CHINESE_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍",
"陆", "柒", "捌", "玖" };
根据你的意思ArrayList
换成StringBuffer好一些
-----------------------------------------
public final class RMB{
private RMB(){
} /**
* 将给定的阿拉伯数字转化为中文大写钱款
*
* @param input 给定的阿拉伯数字
* @return 中文大写钱款
*/
public static String toRMB(String input) { if (input == null || input.equals("")) {
return "零";
} // 判断输入是否为数字(方法不贴了,先注释了)
//if (!isNumber(input)) {
// throw new IllegalArgumentException(
// "The money input must be a number!");
//} // 判断是否含有小数点(将给定字符串四舍五入。方法不贴了,先注释了)
//input = format(round(toDouble(input).doubleValue()));
int dotIndex = input.indexOf(".");
if (dotIndex > 0) {
if (dotIndex == input.length() - 2) {
input = input + "0";
}
else if (dotIndex == input.length() - 1) {
input = input + "00";
}
}
else {
input = input + ".00";
} // 最多位数:15位数字
if (dotIndex > 14) {
throw new IllegalArgumentException(
"The money input is too large to convert!");
} final String[] numbers = new String[] {"零", "壹", "贰", "叁", "肆", "伍",
"陆", "柒", "捌", "玖"};
final String[] units = new String[] {"分", "角", "元", "拾", "佰", "仟", "万",
"拾", "佰", "仟", "亿", "拾", "佰", "仟", "万"};
final String[] invalids = new String[] {"拾零元", "零[仟佰拾元角分]", "零+", "零亿",
"零万", "零元", "亿零*+万"};
final String[] valids = new String[] {"拾元", "零", "零", "亿", "万", "元",
"亿"}; // 反转给定数字
StringBuffer inputReversed = new StringBuffer(input).reverse();
inputReversed.deleteCharAt(inputReversed.indexOf(".")); // 按位转化并添加单位
StringBuffer resultBuffer = new StringBuffer();
int numberLength = inputReversed.length();
for (int index = 0; index < numberLength; index++) {
resultBuffer.append(units[index]);
resultBuffer.append(numbers[Integer.parseInt(inputReversed.charAt(index)
+ "")]);
} // 替换非法表达方式
String result = resultBuffer.reverse().toString();
for (int i = 0; i < invalids.length; i++) {
result = result.replaceAll(invalids[i], valids[i]);
} // 如果以零开头,则去掉零
if (result.startsWith("零")) {
result = result.substring(1, result.length());
}
// 如果以零结尾,则去掉零
if (result.endsWith("零")) {
result = result.substring(0, result.length() - 1);
}
// 如果没有角分,则添加整字
if (result.indexOf("角") < 0 && result.indexOf("分") < 0) {
result = result + "整";
} return result;
}
public static void main(String[] args) {
String money = "100000000010.12645";
System.out.println(RMB.toRMB(money)); String moneyString = "10.01";
System.out.println(RMB.toRMB(moneyString));
}
}
String money = "100000000010.12645";
改成
String money = "100000000010.12";
注释了
没法保留二位小数然后四舍五入了:)、
无为搜索引擎开始测试了啊
(第三次开放测试啊) 网站运行后的效果请参见:
http://219.233.38.213/Search/WuWei.aspx
代码下载地址 :http://www.ofile.cn/se.rar
前两次用 CGI+html做了一个版本还做了一个 Java版本 (这次比较忙,所以没来的及更新,有需要的跟我说一声啊)
这次用 C# ASP.NET做一个 玩玩
做的不好,请大家做指教啊!
这次还实现了计算器功能啊
可以搜索一下 sin(1+2) 看看
另外 sh=1&sf=1&ua=1&sa=1&st=1&wh=1&ph=1 把这里面的 1改成 0看看 每个部分都是可以控制的:)
至于为什么要把客户端网站部分开源,请参考我第二次开放测试时即兴写的文章 : 最近我研究搜索引擎 七 (长长中国人的志气篇)
http://www.baidu.com/s?wd=%D7%EE%BD%FC%CE%D2%D1%D0%BE%BF%CB%D1%CB%F7%D2%FD%C7%E6%C6%DF&cl=3
承盟广大网友看的起 该文目前已经被全国 2000多网站转载
先说一下技术指标: 本次我收录了全国30多万个一、二级域名, 网页采集用了三周时间,目前已经采集了 12万网站,平均每个网站收录 30篇网页,索引进行了 10天,
目前已经索引了 100多万网页 。 搜索核心部分采用这次采用 C 语言开发。 客户端提供三个版本一个CGI+HTML版本,一个 Java版本,一个 ASP.NET版本。代码下载地址 :http://www.ofile.cn/se.rar
搜索网站客户端(.NET版本)整体解决方案(源代码)
(第三次开放测试啊) 网站运行后的效果请参见:
http://219.233.38.213/Search/WuWei.aspx
void CNumDlg::AddStr(CString sStr, CString *sNum, TCHAR tcUnit)
{
int t = sStr.GetLength();
CString sTemp = _T("");
for (int i=0; i<t; i++)
{
TCHAR tcTemp = sStr.GetAt(t-1-i);
switch (tcTemp)
{
case _T('0'):
if (sTemp == _T("") || sTemp.GetAt(0) == _T('零'))
{
break;
}
else
{
sTemp.Insert(0, _T("零"));
}
break;
case _T('1'):
sTemp.Insert(0, _T("壹"));
break;
case _T('2'):
sTemp.Insert(0, _T("贰"));
break;
case _T('3'):
sTemp.Insert(0, _T("叁"));
break;
case _T('4'):
sTemp.Insert(0, _T("肆"));
break;
case _T('5'):
sTemp.Insert(0, _T("伍"));
break;
case _T('6'):
sTemp.Insert(0, _T("陆"));
break;
case _T('7'):
sTemp.Insert(0, _T("柒"));
break;
case _T('8'):
sTemp.Insert(0, _T("捌"));
break;
case _T('9'):
sTemp.Insert(0, _T("玖"));
break;
default:
break;
}
switch(i)
{
case 0:
break;
case 1:
if (sTemp != _T("") && sTemp.GetAt(0) != _T('零'))
{
sTemp.Insert(1, _T("拾"));
}
break;
case 2:
if (sTemp != _T("") && sTemp.GetAt(0) != _T('零'))
{
sTemp.Insert(1, _T("佰"));
}
break;
case 3:
if (sTemp != _T("") && sTemp.GetAt(0) != _T('零'))
{
sTemp.Insert(1, _T("仟"));
}
break;
default:
break;
}
}
if (tcUnit != (TCHAR)0 && sTemp!= _T(""))
{
sNum->Insert(0,tcUnit);
}
else
{
if (tcUnit == _T('亿'))
{
sNum->Insert(0,tcUnit);
}
}
sNum->Insert(0,sTemp);
}void CNumDlg::OnRead()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
CString sNum = _T("");
int t = m_sNum.GetLength();
while (true)
{
if (t>0 && m_sNum.GetAt(0) == _T('0'))
{
m_sNum.Delete(0);
t--;
continue;
}
break;
}
if (t<=0)
{
MessageBox(_T("您的输入错误!"));
return;
}
for (int i = 0; i<t; i++)
{
TCHAR tc = m_sNum.GetAt(i); if (!_istdigit(tc))
{
MessageBox(_T("请输入数字!"));
return;
}
}
if (t<=4)
{
AddStr (m_sNum, &sNum, (TCHAR)0);
}
if (t>4 && t<=8)
{
CString sTh;
sTh = m_sNum.Right(4);
AddStr (sTh, &sNum, (TCHAR)0);
CString sM;
sM = m_sNum.Left(m_sNum.GetLength() - 4);
AddStr (sM, &sNum, _T('万'));
}
if (t>8 && t<=12)
{
CString sTh;
sTh = m_sNum.Right(4);
AddStr (sTh, &sNum, (TCHAR)0);
CString sM;
sM = m_sNum.Mid(m_sNum.GetLength()-8, 4);
AddStr (sM, &sNum, _T('万'));
CString hM;
hM = m_sNum.Left(m_sNum.GetLength() - 8);
AddStr (hM, &sNum, _T('亿'));
}
if (t>12 && t<=16)
{
CString sTh;
sTh = m_sNum.Right(4);
AddStr (sTh, &sNum, (TCHAR)0);
CString sM;
sM = m_sNum.Mid(m_sNum.GetLength()-8, 4);
AddStr (sM, &sNum, _T('万'));
CString hM;
hM = m_sNum.Mid(m_sNum.GetLength()-12, 4);
AddStr (hM, &sNum, _T('亿'));
CString mHM;
mHM = m_sNum.Left(m_sNum.GetLength() - 12);
AddStr (mHM, &sNum, _T('万'));
}
if (sNum.GetAt(0)==_T('零'))
{
sNum.Delete(0);
}
m_sRead = sNum;
UpdateData(FALSE);
}
public static String[] d = new String[6];
static {
n[0] = "零";
n[1] = "壹";
n[2] = "贰";
n[3] = "叁";
n[4] = "肆";
n[5] = "伍";
n[6] = "陆";
n[7] = "柒";
n[8] = "捌";
n[9] = "玖";
d[0] = "";
d[1] = "拾";
d[2] = "佰";
d[3] = "仟";
d[4] = "萬";
d[5] = "亿";
} public static String readNum(String num) {
if(!checkParam(num)){
System.out.println(num + " is not a valid number");
}
StringBuffer sb = new StringBuffer();
int len = num.length();
String[] numbers = new String[len];
String[] units = new String[len];
boolean[] numFlags = new boolean[len];
boolean[] unitFlags = new boolean[len];
//caculate every pos
for(int i=0;i<len;i++){
Result rs = read(num,i);
numbers[i] = rs.number;
units[i] = rs.unit;
numFlags[i] = rs.numFlag;
unitFlags[i] = rs.unitFlag;
// join string
if(numFlags[i]){
sb.append(numbers[i]);
}
if(unitFlags[i]){
sb.append(units[i]);
}
}
return sb.toString();
} public static boolean checkParam(String num) {
try {
Double.parseDouble(num);
} catch (NumberFormatException e) {
return false;
}
return true;
} public static Result read(String num, int pos) {
Result rs = new Result();
rs.number = readNum(num,pos);
rs.unit = readUnit(num,pos);
rs.numFlag = readNumFlag(num,pos);
rs.unitFlag = readUnitFlag(num,pos);
return rs;
}
public static String readNum(String num, int pos) {
int value = Integer.parseInt(num.substring(pos,pos+1));
return n[value];
}
public static String readUnit(String num, int pos) {
int len = num.length();
int count = len - pos - 1;
int unit = count % 4;
String unitStr = d[unit];
int rate = count / 4;
if( count >= 4 && count % 4 == 0){
if(rate % 2 == 0){
unitStr += d[5];
} else {
unitStr += d[4];
}
}
return unitStr;
} public static boolean readNumFlag(String num, int pos) {
int len = num.length();
int value = Integer.parseInt(num.substring(pos,pos+1));
int count = len - pos - 1;
if( len %4 == 2 && value == 1 && pos == 0){
return false;
}
if(value != 0){
return true;
}
if ( count % 4 == 0 ){
return false;
}
int nextValue = Integer.parseInt(num.substring(pos + 1,pos+2));
if(nextValue != 0){
return true;
}
return false;
} public static boolean readUnitFlag(String num, int pos) {
int value = Integer.parseInt(num.substring(pos,pos+1));
if(value != 0){
return true;
}
int len = num.length();
int count = len - pos - 1;
if ( count % 4 == 0 ){
return true;
}
return false;
}
public static class Result{
String number = null;
String unit = null;
boolean numFlag = false;
boolean unitFlag = false;
}
public static void main(String[] args) {
String testNum = "123456789012345678";
String str = readNum(testNum);
System.out.println(testNum);
System.out.println(str);
}
}