如何用JAVA实现数字转换为大写?

litingwei8 2007-10-29 10:01:51
用JAVA的ArrayList类实现拉个不过有0连着的很不好处理
请高手解答
...全文
6938 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
a345710484 2012-06-13
  • 打赏
  • 举报
回复
34楼的 你的还得加一个判断 小数的最后以为为零则只输出角 不然就有零分了
wangjishuai1 2011-05-18
  • 打赏
  • 举报
回复
请各位帮我测试一下。。。。
wangjishuai1 2011-05-18
  • 打赏
  • 举报
回复
package com.money;
import java.util.HashMap;
import java.util.Map;
public class SimpleMoneyFormat {
private static String[] danwei={"元","十","百","千","万","十","百","千","亿"};
private static String[] chinastr={"元","十","百","千","万","十","百","千","亿"};
private static Map<Integer,String> map=new HashMap<Integer,String>();
private static int flag=0;
private static int iszero=0;
public static void main(String[] args) {
String englishstr="10000700";
String formatstr="";
map.put(1, "壹");
map.put(2, "贰");
map.put(3, "叁");
map.put(4, "肆");
map.put(5, "伍");
map.put(6, "陆");
map.put(7, "漆");
map.put(8, "捌");
map.put(9, "玖");
map.put(0, "零");
for (int i = englishstr.length(); i >0 ; i--) {
if(englishstr.charAt(englishstr.length()-i)=='0'){
flag=flag+1;
if(flag==4&&formatstr.indexOf("万")==-1) formatstr=formatstr+"万";
iszero=1;}
else
flag=0;
if(flag==0){
if(iszero==1)formatstr=formatstr+"零";
formatstr = formatstr+map.get(Integer.parseInt(englishstr.charAt(englishstr.length()-i)+""))+danwei[i-1];
iszero=0;}
}
System.out.println(formatstr);
}
}
.︶ㄣ☆.'龍 2009-03-12
  • 打赏
  • 举报
回复
上面的程序不是我写的,是把楼上一个人的改了一点,并运行了。
.︶ㄣ☆.'龍 2009-03-12
  • 打赏
  • 举报
回复
package javaapplication9;

import java.io.*;
public class Test {

public static void main(String[] args) throws IOException {
String strNum="";
double dNum;
System.out.println("输入:");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
strNum=br.readLine();
dNum=Double.parseDouble(strNum);
System.out.println(changeToBig(dNum));
System.gc();
}

public static String changeToBig(double value) {
char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示
char[] vunit = { '万', '亿' }; // 段名表示
char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示
long midVal = (long) (value * 100+0.5); // 转化成整形,四舍五入
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(); // 把整数部分转化成字符数组
boolean preZero = false; // 标志当前位的上一位是否为有效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
preZero = true;
zeroSerNum++; // 连续0次数递增
if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
prefix += vunit[vidx - 1];
preZero = false; // 不管上一位是否为0,置为无效0位
}
}
else {
zeroSerNum = 0; // 连续0次数清零
if (preZero) { // 上一位为有效0位
prefix += digit[0]; // 只有在这地方用到'零'
preZero = false;
}
prefix += digit[chDig[i] - '0']; // 转化该数字表示
if (idx > 0)
prefix += hunit[idx - 1];
if (idx == 0 && vidx > 0) {
prefix+=vunit[(vidx+1)%2];
for(int j=0;j<(vidx+1)/2-1;j++){
prefix+=vunit[1];
}
}
}
}
if (prefix.length() > 0)
prefix += '圆'; // 如果整数部分存在,则有圆的字样
return prefix + suffix; // 返回正确表示
}
}
我运行过了,可以!用的是Netreans6.5.
Hokeen 2007-11-01
  • 打赏
  • 举报
回复
上面代码不能超过long的精度
Hokeen 2007-11-01
  • 打赏
  • 举报
回复
cursor_wang,你程序的四舍五入有问题 ,例外单位超过亿就没法正确显示。改了改,优化了下代码:

import java.io.*;
public class Test {

public static void main(String[] args) {
String strNum="";
double dNum;
System.out.println("输入:");
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
try{
strNum=br.readLine();
}catch(IOException e){}
dNum=Double.parseDouble(strNum);
System.out.println("四舍五入,精确到(分),转化成大写:");
System.out.println(changeToBig(dNum));
System.gc();
}

public static String changeToBig(double value) {
char[] hunit = { '拾', '佰', '仟' }; // 段内位置表示
char[] vunit = { '万', '亿' }; // 段名表示
char[] digit = { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; // 数字表示
long midVal = (long) (value * 100+0.5); // 转化成整形,四舍五入
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(); // 把整数部分转化成字符数组
boolean preZero = false; // 标志当前位的上一位是否为有效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
preZero = true;
zeroSerNum++; // 连续0次数递增
if (idx == 0 && vidx > 0 && zeroSerNum < 4) {
prefix += vunit[vidx - 1];
preZero = false; // 不管上一位是否为0,置为无效0位
}
}
else {
zeroSerNum = 0; // 连续0次数清零
if (preZero) { // 上一位为有效0位
prefix += digit[0]; // 只有在这地方用到'零'
preZero = false;
}
prefix += digit[chDig[i] - '0']; // 转化该数字表示
if (idx > 0)
prefix += hunit[idx - 1];
if (idx == 0 && vidx > 0) {
prefix+=vunit[(vidx+1)%2];
for(int j=0;j<(vidx+1)/2-1;j++){
prefix+=vunit[1];
}
}
}
}
if (prefix.length() > 0)
prefix += '圆'; // 如果整数部分存在,则有圆的字样
return prefix + suffix; // 返回正确表示
}
}
chenjie103 2007-11-01
  • 打赏
  • 举报
回复
楼上的也是出错
转换大数不行
1000000000000000000000000000000000000000000000000000000000000000000.9
报异常:
Exception in thread "main " java.lang.NumberFormatException: For input string: "1000000000000000000000000000000000000000000000000000000000000000000 "
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Long.parseLong(Long.java:415)
at java.lang.Long.parseLong(Long.java:461)
at CurrencyUtil.toChinese(CurrencyUtil.java:60)
at CurrencyUtil.main(CurrencyUtil.java:220)


现在人民币有那么长的吗,再说了,你去银行看一下,最多时24位数的数字,长的都认为是错误的或者乱输得数字,我们现在也只考虑到24位长的数字。
NONE9 2007-11-01
  • 打赏
  • 举报
回复
都是代码高手啊,我看都看晕了
zhaoyh82 2007-11-01
  • 打赏
  • 举报
回复
import java.util.*;
class Test
{
public static void main(String[] args)
{
Test nt = new Test();
nt.getBig("1000000000000000000000000000000000000000000000000000000000000000000.011");
}

public void getBig(String number){
//String str = "**ab**e**f ";
//str = str.replaceAll("^[a]+", "A");
//System.out.println(str);
//String[] s = str.split( "\\*+");
// for(int i=0;i<s.length;i++){System.out.println(i+":"+s[i]);}

//String str = "010003000000000";
//System.out.println(str);
//str = str.replaceAll("(0{3})*$","x");
//System.out.println(str);

String[] danwei = {"拾","佰","仟","萬","亿","圆"};
//String str = "00123456789123456789.012";
String str = number;
double num = 0;
try{
num = Double.parseDouble(str);
}catch(Exception e){
System.out.println("数据不符合要求!");
}
String[] str_num = str.split("\\.");
String z_num = str_num[0].replaceAll("^[0]+","");//整数部分
String x_num = "";//小数部分
String r_xiaoshu = "";
if(str_num.length==2){
x_num = str_num[1];
r_xiaoshu = numTochn(Integer.parseInt(x_num.substring(0,1)))+"角";
if(x_num.length()>1){
r_xiaoshu += numTochn(Integer.parseInt(x_num.substring(1,2)))+"分";
}
if(r_xiaoshu.indexOf("零角零分")>-1){
danwei[5] = "圆整";
}
r_xiaoshu = r_xiaoshu.replaceAll("零角零分|零分", "").replaceAll("零角", "零");
}
else{
danwei[5] = "圆整";
}
//System.out.println("z_num=="+z_num);
//System.out.println("x_num=="+x_num);
String result = "";
String fuhao = "";
if(z_num.startsWith("-")){
fuhao = "负";
z_num = z_num.substring(1);
}
int tmp_length = z_num.length();
int tmp = 0;
String tmp_danwei = "";

for(int i=1;i<=tmp_length;i++){
if(i%4==1){
switch(tmp%2){
case 1:
tmp_danwei += danwei[3];
break;
case 0:
if (tmp == 0) {
tmp_danwei += danwei[5];
} else {
tmp_danwei += danwei[4];
}
break;
default:
break;
}
tmp++;

}
else if(i%4==2){
tmp_danwei += danwei[0];
}
else if(i%4==3){
tmp_danwei += danwei[1];
}
else if(i%4==0){
tmp_danwei += danwei[2];

}
result = numTochn(Integer.parseInt(z_num.substring(tmp_length-i,tmp_length-i+1)))+tmp_danwei+result;
tmp_danwei = "";

}
result = fuhao + result;
System.out.println(result);
result = result.replaceAll("零仟零佰零拾零", "").replaceAll("零仟零佰零拾", "零").replaceAll("零仟零佰", "零").replaceAll("零仟", "零")
.replaceAll("零佰零拾零", "").replaceAll("零佰零拾", "零").replaceAll("零佰", "零")
.replaceAll("零拾零", "").replaceAll("零拾", "零").replaceAll("零萬", "萬").replaceAll("零亿", "亿");
result += r_xiaoshu;
System.out.println(result);
}

/**
* @function 小写转大写
*/
public static String numTochn(int i) {
String temp = "";

switch(i) {
case 0:
temp = "零";
break;
case 1:
temp = "壹";
break;
case 2:
temp = "贰";
break;
case 3:
temp = "叁";
break;
case 4:
temp = "肆";
break;
case 5:
temp = "伍";
break;
case 6:
temp = "陆";
break;
case 7:
temp = "柒";
break;
case 8:
temp = "捌";
break;
case 9:
temp = "玖";
break;
default:
break;
}

return temp;
}

}
Marx2 2007-10-31
  • 打赏
  • 举报
回复
学习
fastunit 2007-10-31
  • 打赏
  • 举报
回复
大家看看我的,经过比较严格测试的,只是不太确认用于财务方面是否规范,欢迎批评指正!
测试结果:
1234567890123456.43-壹仟贰佰叁拾肆万伍仟陆佰柒拾捌亿玖仟零壹拾贰万叁仟肆佰伍拾陆元肆角叁分
0.979-玖角柒分玖厘
09999999999999999-玖仟玖佰玖拾玖万玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖元
10,001,000.09-壹仟万零壹仟元玖分
01.107000-壹元壹角柒厘
1.0778879-壹元柒分柒厘
1,002,002,020,000,201.897675434-壹仟零贰万零贰拾亿零贰仟万零贰佰零壹元捌角玖分柒厘
201000000-贰亿零壹佰万元

/**
* 金额转换处理类,a.小写转大写;(b.大写转小写)
* <ul>
* <li>处理能力:</li>
* <li>a.整数部分:9999999999999999(16位长,仟万亿级)</li>
* <li>b.小数部分:3位(可扩展,单位?),多于3位舍去(不四舍五入)</li>
* <li>可无限扩展,方法:IUNIT后依次递加合适的单位,并处理0出现在关键位置</li>
* </ul>
* @author JIM
* @version 2.1
*/
public class CurrencyUtil {


/** 大写数字 */
private static final String[] NUMBERS = { "零", "壹", "贰", "叁", "肆", "伍", "陆",
"柒", "捌", "玖" };

/** 整数部分的单位 */
private static final String[] IUNIT = { "元", "拾", "佰", "仟", "万", "拾", "佰",
"仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟" };

/** 小数部分的单位 */
private static final String[] DUNIT = { "角", "分", "厘" };

/** 整数部分长度限制,仟万亿级 */
private static int LIMIT = 16;


/**
* 得到中文金额。
* @return 中文金额
*/
public static String toChinese(String str) {
// 去掉","
String number = getFormatNum(str);
// 不是金额,直接返回
if (!isMoney(number)) {
return number;
}
// 整数部分数字
String integerStr;
// 小数部分数字
String decimalStr;

// 初始化:格式数字;分离整数部分和小数部分;确定长度
if (number.indexOf(".") > 0) {
integerStr = number.substring(0, number.indexOf("."));
decimalStr = number.substring(number.indexOf(".") + 1);
} else if (number.indexOf(".") == 0) {
integerStr = "";
decimalStr = number.substring(1);
} else {
integerStr = number;
decimalStr = "";
}

// integerStr去掉首0,不必去掉decimalStr的尾0(超出部分舍去)
if (!integerStr.equals("")) {
integerStr = Long.toString(Long.parseLong(integerStr));
if (integerStr.equals("0")) {
integerStr = "";
}
}

// overflow超出处理能力,直接返回
if (integerStr.length() > LIMIT) {
System.out.println(number + ":超出处理能力");
return number;
}
// 整数部分数字
int[] integers = toArray(integerStr);
// 设置万单位
boolean isMust5 = isMust5(integerStr);
// 小数部分数字
int[] decimals = toArray(decimalStr);

// 返回大写金额
return getChineseInteger(integers, isMust5) + getChineseDecimal(decimals);
}

/**
* 整数部分和小数部分转换为数组,从高位至低位
*/
private static int[] toArray(String number) {
int[] array = new int[number.length()];
for (int i = 0; i < number.length(); i++) {
array[i] = Integer.parseInt(number.substring(i, i + 1));
}
return array;
}

/**
* 得到中文金额的整数部分。
* @return 整数部分
*/
private static String getChineseInteger(int[] integers, boolean isMust5) {
StringBuffer chineseInteger = new StringBuffer("");
String key = "";
int length = integers.length;
// int lastNum = 1;
// int lengthOfZero = 0;
for (int ii = 0; ii < length; ii++) {
// 1234(万)5678(亿)9012(万)3456(元)
// 0出现在关键位置:元、万、亿、万亿、兆、万兆、亿兆、万亿兆
// 处理顺序:不限,只跟具体位置有关,不必从高位到低位
// 特殊情况:10(拾元、壹拾元、壹拾万元、拾万元)
if (integers[ii] == 0) {
// 万(亿)(必填)
if ((length - ii) == 13)
key = IUNIT[4];
// 亿(必填)
else if ((length - ii) == 9)
key = IUNIT[8];
// 万(不必填)
else if ((length - ii) == 5 && isMust5)
key = IUNIT[4];
// 元(必填)
else if ((length - ii) == 1)
key = IUNIT[0];

// 0遇非0时补零,不包含最后一位
if ((length - ii) > 1 && integers[ii + 1] != 0)
key += NUMBERS[0];
// 其余情况
else
key += "";
// if(ii==5) break;
}
chineseInteger.append(integers[ii] == 0 ? key
: (NUMBERS[integers[ii]] + IUNIT[length - ii - 1]));
key = "";
}
return chineseInteger.toString();
}

/**
* 得到中文金额的小数部分。
* @return 小数部分
*/
private static String getChineseDecimal(int[] decimals) {
StringBuffer chineseDecimal = new StringBuffer("");
for (int ii = 0; ii < decimals.length; ii++) {
// 舍去3位小数之后的
if (ii == 3)
break;
chineseDecimal.append(decimals[ii] == 0 ? ""
: (NUMBERS[decimals[ii]] + DUNIT[ii]));
}
return chineseDecimal.toString();
}

/**
* 格式化数字:去掉","。
* @param num 数字
* @return 格式化后的数字
*/
private static String getFormatNum(String number) {
return StringUtil.replace(number, ",", "");
}

/**
* 判断第5位数字的单位"万"是否应加。
* @return true是false否
*/
private static boolean isMust5(String integerStr) {
int length = integerStr.length();
if (length > 4) {
String subInteger = "";
if (length > 8) {
// 取得从低位数,第5到第8位的字串
subInteger = integerStr.substring(length - 8, length - 4);
} else {
subInteger = integerStr.substring(0, length - 4);
}
return Integer.parseInt(subInteger) > 0;
} else {
return false;
}
}

/**
* 判断金额字符串是否合法 不合法:a.包含多于一个".";b.包含"."、","和数字以外的字符;c.¥/$?。
* @return true是false否
*/
private static boolean isMoney(String number) {
try {
Double.parseDouble(number);
} catch (Exception ex) {
System.out.println(number + "不是合法金额");
return false;
}
return true;
}

public static void main(String[] args) {
String num = "1234567890123456.43";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "0.979";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "09999999999999999";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "10,001,000.09";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "01.107000";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "1.0778879";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "1,002,002,020,000,201.897675434";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
num = "201000000";
System.out.println(num + "-" + CurrencyUtil.toChinese(num));
}
}

Lisliefor 2007-10-31
  • 打赏
  • 举报
回复
哈哈~
一帮代码狂人!!!
怒放的生命罒 2007-10-31
  • 打赏
  • 举报
回复
挺厉害,学到了...
imagicedit 2007-10-31
  • 打赏
  • 举报
回复
你们都是猛男 说得太牛了
zbl0201 2007-10-31
  • 打赏
  • 举报
回复
http://blog.csdn.net/jinggangshi/archive/2007/10/29/1854264.aspx
这个测试能通过吗?
jinggangshi 2007-10-31
  • 打赏
  • 举报
回复
楼上的也是出错
转换大数不行
1000000000000000000000000000000000000000000000000000000000000000000.9
报异常:
Exception in thread "main" java.lang.NumberFormatException: For input string: "1000000000000000000000000000000000000000000000000000000000000000000"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Long.parseLong(Long.java:415)
at java.lang.Long.parseLong(Long.java:461)
at CurrencyUtil.toChinese(CurrencyUtil.java:60)
at CurrencyUtil.main(CurrencyUtil.java:220)
我还是觉得这个好一点,不是我写的,只是改了一下
http://blog.csdn.net/jinggangshi/archive/2007/10/29/1854264.aspx
nabber 2007-10-31
  • 打赏
  • 举报
回复
上程序可以回家歇着了
zhb_821012 2007-10-30
  • 打赏
  • 举报
回复
楼上正解
rayleigh_w 2007-10-30
  • 打赏
  • 举报
回复
3楼的答案问题出在 “long midVal = (long)(value*100);”,这是因为java中简单类型不能够精确的对浮点数进行运算,财务中一般也使用java.math.BigDecimal进行计算。
大家可以参考一下这篇文章:
http://hi.baidu.com/zqeast/blog/item/64eacefcbb90bafefd037f3e.html
加载更多回复(17)

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧