输入一个数字将其转化为大写,比如输入整型1034,得到“壹仟零叁拾肆”,
10034就是“壹万零叁拾肆”,怎么写?
10034就是“壹万零叁拾肆”,怎么写?
解决方案 »
- 求JButton上的文字打出X的Y次方的方法,X小,Y作为上标,不能用X^Y表示
- 不允许的操作: operation cannot be mixed with Oracle-style batching
- 怎么模拟发送ListSelectionEvent事件?
- 如何用GridBagLayout实现这样的布局,在线等急 !!!
- 请大家帮我看看这个 为什么没有图出来啊。关于IFS的。主要是paint()里面的
- 请问谁有Thinking in Java 最新电子版书
- 在java中怎样把元转成分。
- 去除字符串
- 程序中有一按钮,点击执行一存储过程,但此存储过程执行时间较长(10分钟左右),如何利用线程,使得在执行过程中可进行另外的操作?谢谢
- 新手求救
- 环境(eclipse ,tomcat5.0)中出现错误:HTTP Status 500,帮助!!
- JAVA 如何缓冲更新到数据库?
public static String numberToChinese(double d) {
DecimalFormat decimalformat = new DecimalFormat("############0.00");
String s = decimalformat.format(d);
int i = s.indexOf(".");
if(s.substring(i).compareTo(".00") == 0)
s = s.substring(0, i);
String s1 = "";
String as[] = new String[4];
String as1[] = new String[4];
String as2[] = new String[2];
String s2 = "";
String s4 = "";
String s6 = "";
int j = 0;
int k = 0;
boolean flag = false;
as[0] = "";
as[1] = "\u62FE";
as[2] = "\u4F70";
as[3] = "\u4EDF";
as1[0] = "";
as1[1] = "\u4E07";
as1[2] = "\u4EBF";
as1[3] = "\u4E07";
as2[0] = "\u5206";
as2[1] = "\u89D2";
if(s.compareTo("0") == 0 || s.compareTo("0.0") == 0 || s.compareTo("0.00") == 0) {
s6 = "\u96F6\u5143\u6574";
return s6;
}
if(s.indexOf(".") > 0)
s1 = s.substring(0, s.indexOf("."));
else
s1 = s;
j = s1.length() % 4 == 0 ? s1.length() / 4 : s1.length() / 4 + 1;
for(int i1 = j; i1 >= 1; i1--) {
int l;
if(i1 == j && s1.length() % 4 != 0)
l = s1.length() % 4;
else
l = 4;
String s3 = s1.substring(k, k + l);
for(int j1 = 0; j1 < s3.length(); j1++)
if(Integer.parseInt(s3.substring(j1, j1 + 1)) != 0)
switch(Integer.parseInt(s3.substring(j1, j1 + 1))) {
case 1:
s6 = s6 + "\u58F9" + as[s3.length() - j1 - 1];
break;
case 2:
s6 = s6 + "\u8D30" + as[s3.length() - j1 - 1];
break;
case 3:
s6 = s6 + "\u53C1" + as[s3.length() - j1 - 1];
break;
case 4:
s6 = s6 + "\u8086" + as[s3.length() - j1 - 1];
break;
case 5:
s6 = s6 + "\u4F0D" + as[s3.length() - j1 - 1];
break;
case 6:
s6 = s6 + "\u9646" + as[s3.length() - j1 - 1];
break;
case 7:
s6 = s6 + "\u67D2" + as[s3.length() - j1 - 1];
break;
case 8:
s6 = s6 + "\u634C" + as[s3.length() - j1 - 1];
break;
case 9:
s6 = s6 + "\u7396" + as[s3.length() - j1 - 1];
break;
} else
if(j1 + 1 < s3.length() && s3.charAt(j1 + 1) != '0')
s6 = s6 + "\u96F6";
k += l;
if(i1 < j) {
if(Integer.parseInt(s3.substring(s3.length() - 1, s3.length())) != 0 || Integer.parseInt(s3.substring(s3.length() - 2, s3.length() - 1)) != 0 || Integer.parseInt(s3.substring(s3.length() - 3, s3.length() - 2)) != 0 || Integer.parseInt(s3.substring(s3.length() - 4, s3.length() - 3)) != 0)
s6 = s6 + as1[i1 - 1];
} else {
s6 = s6 + as1[i1 - 1];
}
}
if(s6.length() > 0)
s6 = s6 + "\u5143";
if(s.indexOf(".") > 0) {
String s5 = s.substring(s.indexOf(".") + 1);
for(int k1 = 0; k1 < 2; k1++)
if(Integer.parseInt(s5.substring(k1, k1 + 1)) != 0)
switch(Integer.parseInt(s5.substring(k1, k1 + 1))) {
case 1: // ?0?7\001?0?7
s6 = s6 + "\u58F9" + as2[1 - k1];
break;
case 2: // ?0?7\002?0?7
s6 = s6 + "\u8D30" + as2[1 - k1];
break;
case 3: // ?0?7\003?0?7
s6 = s6 + "\u53C1" + as2[1 - k1];
break;
case 4: // ?0?7\004?0?7
s6 = s6 + "\u8086" + as2[1 - k1];
break;
case 5: // ?0?7\005?0?7
s6 = s6 + "\u4F0D" + as2[1 - k1];
break;
case 6: // ?0?7\006?0?7
s6 = s6 + "\u9646" + as2[1 - k1];
break;
case 7: // ?0?7\007?0?7
s6 = s6 + "\u67D2" + as2[1 - k1];
break;
case 8: // ?0?7\b?0?7
s6 = s6 + "\u634C" + as2[1 - k1];
break;
case 9: // ?0?7\t?0?7
s6 = s6 + "\u7396" + as2[1 - k1];
break;
} else
if(s6.length() > 0)
s6 = s6 + "\u96F6";
} else {
s6 = s6 + "\u6574";
}
if(s6.substring(s6.length() - 1).compareTo("\u96F6") == 0)
s6 = s6.substring(0, s6.length() - 1);
return s6;
}
testStr.replace('2', '二');
testStr.replace('3', '三');
testStr.replace('4', '四');
testStr.replace('5', '五');
testStr.replace('6', '六');
testStr.replace('7', '七');
testStr.replace('8', '八');
testStr.replace('9', '九');
testStr.replace('0', '零');
testStr = testStr.replaceAll("2", "二");
testStr = testStr.replaceAll("3", "三");
testStr = testStr.replaceAll("4", "四");
testStr = testStr.replaceAll("5", "五");
testStr = testStr.replaceAll("6", "六");
testStr = testStr.replaceAll("7", "七");
testStr = testStr.replaceAll("8", "八");
testStr = testStr.replaceAll("9", "九");
testStr = testStr.replaceAll("0", "零"); System.out.println(testStr);
public class Change{
void fun(String str)
{
String str1="零壹贰叁肆伍陆柒捌玖";
String str2="千百十万千百十元角分";
double money=Double.parseDouble(str);
long temp;
long m[] =new long[10];
int i;
boolean flag=false;
int x=0;
int y=9;
money=money*100+0.5;
temp=(long)money;
m[0]=temp/1000000000;
m[1]=(temp%1000000000)/100000000;
m[2]=(temp%100000000)/10000000;
m[3]=(temp%10000000)/1000000;
m[4]=(temp%1000000)/100000;
m[5]=(temp%100000)/10000;
m[6]=(temp%10000)/1000;
m[7]=(temp%1000)/100;
m[8]=(temp%100)/10;
m[9]=temp%10;
for(i=0;i<10;i++)
{
if(m[i]!=0)
{
x=i;
break;
}
}
for(i=9;i>=0;i--)
{
if(m[i]!=0)
{
y=i;
break;
}
}
for(i=x;i<y+1;i++)
{
//System.out.print(m[i]);
if(m[i]==0)
{
if(flag==false)
{
System.out.print(""+str1.charAt((int)m[i]));
flag=true;
}
}
else
{
System.out.print(""+str1.charAt((int)m[i])+str2.charAt(i));
flag=false;
}
}
}
public static void main(String args[])
{
Change obj=new Change();
obj.fun(args[0]);
}}
public class ChineseCurrency{
public static void main(String[] args) {
double number = 100035.53;
System.out.println(toChineseCurrency(number));
}
public static String toChineseCurrency(Object o) {
if(o instanceof Number) {
String s = new DecimalFormat("#.00").format(o);
System.out.println(s);
s = s.replaceAll("\\.", "");
char[] digit = {'零', '壹', '贰', '叁', '肆',
'伍', '陆', '柒', '捌', '玖'};
String unit = "仟佰拾兆仟佰拾亿仟佰拾万仟佰拾元角分";
int l = unit.length();
StringBuilder sb = new StringBuilder(unit);
for(int i=s.length()-1; i>=0; i--)
sb = sb.insert(l-s.length()+i, digit[(s.charAt(i) - 0x30)]);
s = sb.substring(l-s.length(), l+s.length());
s = s.replaceAll("零[拾佰仟]", "零").
replaceAll("零{2,}", "零").
replaceAll("零([兆万元])", "$1").
replaceAll("零[角分]", "");
return s;
} else {
throw new NumberFormatException();
}
}
}
public static void main(String[] args)
{
StringBuffer numberToCn = new StringBuffer();
String number = "-2813040410.0787003560";
HashMap cnHash = getCNHash();
HashMap unitHash = getUnitHash();
String[] partOfNumber = null;
if(number.substring(0, 1).equals("-")) //判断数字是否为负数,并将数划分为小数、整数两部分
{
numberToCn.append("負");
partOfNumber = number.substring(1).split("\\.");
}
else
partOfNumber = number.substring(0).split("\\.");
if(partOfNumber.length == 1) //如果输入的数没有小数则只进行整数部分转化
{
String str = PositiveChangeToCN(partOfNumber[0],cnHash,unitHash);
numberToCn.append(str);
}
else //如输入的数有小数,则先转化整数部分,再转换小数部分
{
String str = PositiveChangeToCN(partOfNumber[0],cnHash,unitHash); //处理整数部分
numberToCn.append(str); numberToCn.append("點"); str = DecimalChangeToCN(partOfNumber[1],cnHash); //处理小数部分
numberToCn.append(str);
}
System.out.println("Number = " + number);
System.out.println("Chinese = " + numberToCn.toString());
}
/**
* 设置汉字中的数字表示名称
* @return
*/
public static HashMap getCNHash()
{
HashMap cnHash = new HashMap();
int count = 10;
String[] cnArray = {"零","壹","貳","叁","肆","伍","陸","柒","捌","玖","拾"};
for(int i = 0; i < count; i++)
{
cnHash.put(String.valueOf(i),cnArray[i]);
}
return cnHash;
}
/**
* 设置汉字中的数字单位名称
* @return
*/
public static HashMap getUnitHash()
{
HashMap unitHash = new HashMap();
int count = 5;
String[] unitArray = {"拾","佰","仟","萬","億","兆"};
for(int i = 2; i < count+2; i++)
{
unitHash.put(String.valueOf(i),unitArray[i-2]);
}
return unitHash;
}
/**
* 转化数字小数部分
* @param numberStr
* @param cnHash
* @return
*/
public static String DecimalChangeToCN(String numberStr,HashMap cnHash)
{
StringBuffer cnStrBuffer = new StringBuffer();
int zeroNumberAtLast = scanZeroAtLast(numberStr); //转化时除去输入时小数部分末尾存在的0
//遍历数字,转换表示方式及单位
for(int i = 0; i < numberStr.length() - zeroNumberAtLast; i++)
{
String aCnCode = (String)cnHash.get(numberStr.substring(i, i+1)); //转换数字表示名称
cnStrBuffer.append(aCnCode);
}
return cnStrBuffer.toString();
}
/**
* 转化数字正数部分,按照每四位数作为一个单元进行转化
* @param numberStr
* @param cnHash
* @param unitHash
* @return
*/
private static String PositiveChangeToCN(String numberStr,HashMap cnHash,HashMap unitHash)
{
StringBuffer cnStrBuffer = new StringBuffer();
int changeUnit = 4; //每次转换的位数范围
int strLength = numberStr.length();
int tempLoopCount = strLength /changeUnit;
if(strLength % changeUnit > 0)
tempLoopCount++;
for (int loop = 1 ; loop <= tempLoopCount; loop++) //每四位数字为一个单位转换数字
{
int beginIndex = strLength - (changeUnit * loop);
int endIndex = beginIndex + changeUnit;
if(beginIndex < 0)
{
beginIndex = 0;
endIndex = strLength % changeUnit;
}
String tempStr = numberStr.substring(beginIndex,endIndex);
int zeroNumberAtLast = scanZeroAtLast(tempStr); //转化时除去输入时整数部分末尾存在的0
String aCnCode = new String();
//遍历数字,转换表示方式及单位
for(int i = 0; i < tempStr.length() - zeroNumberAtLast; i++)
{
String number = tempStr.substring(i, i+1);
aCnCode += (String)cnHash.get(number); //转换数字表示名称
//根据数字所在数中的位置设置对应的单位
if(!number.equals("0"))
{
int position = tempStr.length() - i;
if(position > 1)
aCnCode += (String)unitHash.get(String.valueOf(position)); //获取数字单位名称(拾、佰、仟)
}
}
if(loop > 1)
{
aCnCode += (String)unitHash.get(String.valueOf(loop + 3)); //获取数字单位名称(萬、億、兆)
}
cnStrBuffer.insert(0, aCnCode); //合成转换结果
}
return cnStrBuffer.toString();
}
/**
* 返回正数部分末尾为0的个数
* @param numberStr
* @return
*/
public static int scanZeroAtLast(String numberStr)
{
int zeroNumberAtLast = 0;
int i = numberStr.length();
for(; i > 0; i--) //从数字字符串末尾开始遍历,获取由末尾开始连续的数字为0的个数
{
if(numberStr.substring(i-1,i).equals("0"))
zeroNumberAtLast++;
else
break;
}
return zeroNumberAtLast;
}
}
我机器中有一个网页记录,给你转一下,绝对好用
问题: 商业领域,开发票,支票等金钱相关项目通常要求转换成大写,诸如“壹拾圆陆角玖分”.编程过程中,一般的钱币都是double型.
当前看到的方法:之所以写这个方法,因为看到的方法设计的不是很好,通常的做法就是逐个字符处理,通过冗长的switch...case结构判断,来决定当前是否应该输出某某汉字,总体来说,完成这件任务是简单的,但是代码和设计质量却不令人满意.
设计方法如下:
需要注意的问题:
1.各个阿拉伯数字可以通过一个数组'壹','贰','叁'....表示.
2.对于大于10000和大于100000000的数字,可能出现'万','亿'字样
3.对于中间连续为0的数字,正确出现'零'的字样,但是有几种不同的情况需要处理
4.对于某个段的数字全零的情况,例如,整个万段都是0的情况-100000101,中间的0如何出现
5.角分的处理,如果不存在角分的话,应该出现'圆整'的字样
6.整数部分不存在的情况,即只有角分,应该没有'圆'的字样
设计框架:
1.把数字转化成字符串处理,使用Java的时候,把一个double类型转化成一个字符串类型很简单,
调用 String.valueOf(double_var)即可得到,但是有一个问题,当你的数字大于10个位的时候,
也就是达亿的时候,他会转换成科学计数法的字串,解决方法就是把他转化成整形long.
2.把数字分割成整数部分和小数部分分别处理,根据上面的方法,我们索性把double乘上100,
取后两位为小数部分,前面的为整数部分,得到
long l = (long)(d*100);
String strVal = String.valueOf(l);
String head = strVal.substring(0,strVal.length()-2); //整数部分
String end = strVal.substring(strVal.length()-2); //小数部分
3.我们应该把钱数分成段,每四个一段,实际上得到的是一个二维数组,如下:
仟 佰 拾 ' '
' ' $4 $3 $2 $1
万 $8 $7 $6 $5
亿 $12 $11 $10 $9
其中$i表示这个数字的第i个位置的数字,我们并不实际设定二维数组,我们得到的是数字的位置,
要处理的该产生什么样的表示法,很简单这种处理方式往往就是:设pos表示数字位置,pos/4 在那一个段
万以下段,万段,亿段.pos%4表示某一个段的段内位置,仟,佰,拾,由于叠加的缘故,即会有千万,百万,千亿等
出现,因此这种设计是成立的.这里面隐含了一个问题就是,我们当前的处理的最大数字达千亿位,
更大的数字用这种结构是不妥的,因为可能会有万亿,这时候推荐的想法是把这些设计成单维的数组结构,
从而取得叠加的表示.
4.循环处理各个位的过程中,我们可以预想到,零的问题是最难解决的.
因为我们多个连续的零你只能出现一个表示,更有甚者,当某段全为0时,'零'还不能出现.
因此这些问题综合考虑得到以下代码.
代码:(JAVA描述)
public static String changeToBig(double value){
char[] hunit={'拾','佰','仟'}; //段内位置表示
char[] vunit={'万','亿'}; //段名表示
char[] digit={'零','壹','贰','叁','肆','伍','陆','柒','捌','玖'}; //数字表示
long midVal = (long)(value*100); //转化成整形
String valStr=String.valueOf(midVal); //转化成字符串
String head=valStr.substring(0,valStr.length()-2); //取整数部分
String rail=valStr.substring(valStr.length()-2); //取小数部分
String prefix=""; //整数部分转化的结果
String suffix=""; //小数部分转化的结果
//处理小数点后面的数
if(rail.equals("00")){ //如果小数部分为0
suffix="整";
} else{
suffix=digit[rail.charAt(0)-'0']+"角"+digit[rail.charAt(1)-'0']+"分"; //否则把角分转化出来
}
//处理小数点前面的数
char[] chDig=head.toCharArray(); //把整数部分转化成字符数组
char zero='0'; //标志'0'表示出现过0
byte zeroSerNum = 0; //连续出现0的次数
for(int i=0;i<chDig.length;i++){ //循环处理每个数字
int idx=(chDig.length-i-1)%4; //取段内位置
int vidx=(chDig.length-i-1)/4; //取段位置
if(chDig[i]=='0'){ //如果当前字符是0
zeroSerNum++; //连续0次数递增
if(zero == '0'){ //标志
zero=digit[0];
} else if(idx==0 && vidx >0 &&zeroSerNum < 4){
prefix += vunit[vidx-1];
zero='0';
}
continue;
}
zeroSerNum = 0; //连续0次数清零
if(zero != '0') { //如果标志不为0,则加上,例如万,亿什么的
prefix+=zero;
zero='0';
}
prefix+=digit[chDig[i]-'0']; //转化该数字表示
if(idx > 0) prefix += hunit[idx-1];
if(idx==0 && vidx>0){
prefix+=vunit[vidx-1]; //段结束位置应该加上段名如万,亿
}
}
if(prefix.length() > 0) prefix += '圆'; //如果整数部分存在,则有圆的字样
return prefix+suffix; //返回正确表示
}
package ch01;import java.text.DecimalFormat;public class ChineseCurrency{
public static void main(String[] args) {
double number = 13500035.53;
System.out.println(toChineseCurrency(new Double(number)));
}
public static String toChineseCurrency(Object o) {
if(o instanceof Number) {
String s = new DecimalFormat("#.00").format(o);
System.out.println(s);
s = s.replaceAll("\\.", "");
char[] digit = {'零', '壹', '贰', '叁', '肆',
'伍', '陆', '柒', '捌', '玖'};
String unit = "仟佰拾兆仟佰拾亿仟佰拾万仟佰拾元角分";
int l = unit.length();
StringBuffer sb = new StringBuffer(unit);
for(int i=s.length()-1; i>=0; i--)
sb = sb.insert(l-s.length()+i, digit[(s.charAt(i) - 0x30)]);
s = sb.substring(l-s.length(), l+s.length());
s = s.replaceAll("零[拾佰仟]", "零").
replaceAll("零{2,}", "零").
replaceAll("零([兆万元])", "$1").
replaceAll("零[角分]", "");
return s;
} else {
throw new NumberFormatException();
}
}
}
public static void main(String[] args) {
double number = 13500035.53;
System.out.println(toChineseCurrency(new Double(number)));
}
public static String toChineseCurrency(Object o) {
if(o instanceof Number) {
String NumStr = new DecimalFormat("#.00").format(o);
System.out.println(NumStr);
NumStr = NumStr.replaceAll("\\.", "");
String[] digit = { "零","壹","贰","叁","肆",
"伍","陆","柒","捌","玖"};
String unit = "分角元拾佰仟万拾佰仟亿拾佰仟万拾佰仟亿拾佰仟......";
int len = NumStr.length();
string val="";
for(int i=0;i<len;i++)
{
val=val + digit[(NumStr.charAt(i) - 0x30)]+unit.substring(len-1-i,1);
if(digit[(NumStr.charAt(i) - 0x30)].Equals("零"))
val = val.replaceAll("零零", "零")
}
return val.replaceAll("零亿","亿").replaceAll("零万","万").replaceAll("零元","元").replaceAll("零[角分]", "");
} else {
throw new NumberFormatException();
}
}
}