注:此程序是根据网上的一位网友的程序优化改编而来。因为该网友的网址记不清了,所以未注明原来的出处。见谅!
package com.work.util;
/**
* @author wangmj
* 编写时间:2005-8-2 <br />
* 优化:2008-07-03
* 类的名称为:RMB.java <br />
* 比较完善的解决方案。 测试通过。 <br />
* 最准确的使用就是小数点之前最多13位,小数点之后不限,当然写多了也没有用,哈哈。<br />
*/
import java.text.DecimalFormat;
import java.text.NumberFormat;
//总体思路:
//对数字进行分级处理,级长为4
//对分级后的每级分别处理,处理后得到字符串相连
//如:123456=12|3456
//第二级:12=壹拾贰 + “万”
//第一级:3456 =叁千肆百伍拾陆 + “”
public final class RMB {
private double amount = 0.0D;
private static final String NUM = "零壹贰叁肆伍陆柒捌玖";
private static final String UNIT = "仟佰拾个";
private static final String GRADEUNIT = "仟万亿兆";
private static final String DOTUNIT = "角分厘";
private static final int GRADE = 4;
private static final String SIGN = "¥";
private static final NumberFormat nf = new DecimalFormat("#0.###");
/**
* 带参数的构造方法
*
* @param amount
*/
private RMB(double amount) {
this.amount = amount;
}
public static String toBigAmt(double amount) {
nf.setMinimumFractionDigits(3);//小数点后不足的补零
String amt = nf.format(amount);//将double类型的数格式化并转换成字符串,实际上进行了四舍五入
System.out.println(amt);
Double d = new Double(amount);
String dotPart = ""; //取小数位
String intPart = ""; //取整数位
int dotPos;
if ((dotPos = amt.indexOf('.')) != -1) {
intPart = amt.substring(0, dotPos);
dotPart = amt.substring(dotPos + 1);
if(dotPart.length()>4){ //超过4位直接截取
dotPart = dotPart.substring(0,4);
}
} else {
intPart = amt;
}
if (intPart.length() > 16)
throw new java.lang.InternalError("数额太大,无法转换。");
String intBig = intToBig(intPart);
String dotBig = dotToBig(dotPart);
//以下代码稍做修改,现在好多了。
if ((dotBig.length() == 0) && (intBig.length() != 0)) {
return intBig + "元整";
} else if ((dotBig.length() == 0) && (intBig.length() == 0)) {
return intBig + "零元";
} else if ((dotBig.length() != 0) && (intBig.length() != 0)) {
return intBig + "元" + dotBig;
} else {
return dotBig;
}
}
/**
* 用来处理几角几分几厘
* @param dotPart
* @return
*/
private static String dotToBig(String dotPart) {
//得到转换后的大写(小数部分)
String strRet = "";
for (int i = 0; i < dotPart.length() && i < 3; i++) {
int num;
if ((num = Integer.parseInt(dotPart.substring(i, i + 1))) != 0)
strRet += NUM.substring(num, num + 1)
+ DOTUNIT.substring(i, i + 1);
}
return strRet;
}
/**
* 用来处理多少元 ,这个要仔细考虑才行
* @param intPart
* @return
*/
private static String intToBig(String intPart) {
//得到转换后的大写(整数部分)
int grade; //级长
String result = "";
String strTmp = "";
//得到当级长
grade = intPart.length() / GRADE;
//调整级次长度
if (intPart.length() % GRADE != 0)
grade += 1;
//对每级数字处理,先处理最高级,然后再处理低级的
for (int i = grade; i >= 1; i--) {
strTmp = getNowGradeVal(intPart, i);//取得当前级次数字
result += getSubUnit(strTmp);//转换大写
//System.out.println(strTmp+"|"+getSubUnit(strTmp));
result = dropZero(result);//除零 去掉连续的零
//System.out.println("result="+result);
//加级次单位
if (i > 1) //末位不加单位
//单位不能相连续
//注意:连续4个零的时候要特殊处理(wmj修改此bug)
if(getSubUnit(strTmp).equals("零零零零")){
result = result+"零";
}else{
result += GRADEUNIT.substring(i - 1, i);
}
}
return result;
}
private static String getNowGradeVal(String strVal, int grade) {
//得到当前级次的串
String rst;
if (strVal.length() <= grade * GRADE)
rst = strVal.substring(0, strVal.length() - (grade - 1) * GRADE);
else
rst = strVal.substring(strVal.length() - grade * GRADE, strVal
.length()
- (grade - 1) * GRADE);
return rst;
}
private static String getSubUnit(String strVal) {
//数值转换
String rst = "";
for (int i = 0; i < strVal.length(); i++) {
String s = strVal.substring(i, i + 1);
int num = Integer.parseInt(s);
if (num == 0) {
//“零”作特殊处理
if (i != strVal.length()) //转换后数末位不能为零
rst += "零";
} else {
//If IntKey = 1 And i = 2 Then
//“壹拾”作特殊处理
//“壹拾”合理
//Else
rst += NUM.substring(num, num + 1);
//End If
//追加单位
if (i != strVal.length() - 1)//个位不加单位
rst += UNIT.substring(i + 4 - strVal.length(), i + 4
- strVal.length() + 1);
}
}
return rst;
}
/**
*
* @param strVal
* @return
*/
private static String dropZero(String strVal) {
//去除连继的“零”
String strRst;
String strBefore; //前一位置字符
String strNow; //现在位置字符
strBefore = strVal.substring(0, 1);
strRst = strBefore;
for (int i = 1; i < strVal.length(); i++) {
strNow = strVal.substring(i, i + 1);
if (strNow.equals("零") && strBefore.equals("零"))
;//同时为零
else
strRst += strNow;
strBefore = strNow;
}
//末位去零
if (strRst.substring(strRst.length() - 1, strRst.length()).equals("零"))
strRst = strRst.substring(0, strRst.length() - 1);
return strRst;
}
public static void main(String[] args) {
System.out.println(RMB.toBigAmt(0.090D));
System.out.println(RMB.toBigAmt(10.090D));
System.out.println(RMB.toBigAmt(9.090D));
System.out.println(RMB.toBigAmt(9.290D));
System.out.println(RMB.toBigAmt(5.90D));
// System.out.println(RMB.toBigAmt(10052345.00D));
// System.out.println(RMB.toBigAmt(0.00D));
// System.out.println(RMB.toBigAmt(0.60D));
// System.out.println(RMB.toBigAmt(00.60D));
// System.out.println(RMB.toBigAmt(150.2101D));
// System.out.println(RMB.toBigAmt(15400089666.234D));
// System.out.println(RMB.toBigAmt(15400089666.2347D));
// System.out.println(RMB.toBigAmt(1111222233334444.2347D));
System.out.println(RMB.toBigAmt(111222233334444.2347D));
System.out.println(RMB.toBigAmt(11222233334444.2347D));
System.out.println(RMB.toBigAmt(1222233334444.2347D));
System.out.println(RMB.toBigAmt(222233334444.2347D));
// System.out.println(RMB.toBigAmt(33334444.2347D));
// java.math.BigDecimal bg = new java.math.BigDecimal(1111222233334444.2347D);
// System.out.println(bg.toString());
// //1111222233334444.25 BigDecimal也不是很准确
System.out.println(RMB.toBigAmt(22200004444.2347D));
// //贰佰贰拾贰亿万肆仟肆佰肆拾肆元贰角叁分伍厘
System.out.println(RMB.toBigAmt(10004.2347D));
System.out.println(RMB.toBigAmt(22200000004.2347D));
System.out.println(RMB.toBigAmt(10400.0047D));
System.out.println(RMB.toBigAmt(1000000000000.23477777777777D));
System.out.println(RMB.toBigAmt(100100100.090566D));
//壹亿零壹拾万零壹佰元玖分
//壹亿零壹拾万零壹佰元玖分
}
}
分享到:
相关推荐
Java 类金额转换成大写 在 Java 编程语言中,金额转换成大写是非常有用的功能,特别是在财务、银行、电子商务等领域中。下面我们来详细介绍如何使用 Java 实现金额转换成大写的功能。 实例代码分析 首先,我们来...
输入字符,通过正则验证是否为金额不超过万亿精确到小数点后两位,然后将数字转换为大写 包括后台java正则验证及前台js验证 请输入一个数字(精确到小数点后两位): fdsa54325.54 fdsa54325.54 false 请输入一个...
在Java编程中,将阿拉伯数字转换为中国传统形式的金额表示是一项常见的需求,特别是在财务系统或者银行应用中。这种转换能够使数字更符合中国人的阅读习惯,增加可读性。在这个问题中,我们要处理的是将像...
java金额单位转换
金额转换成大写
自己写的将阿拉伯数字金额转换为中国传统形式人民币值的小程序,亲测可用!
这段代码首先将输入的`double`类型金额转换为字符串,并保留两位小数。接着,它将整数部分和小数部分分开,对整数部分添加逗号分隔符。然后,根据金额正负判断是否添加负号。最后,根据需要填充前导零。 为了测试这...
java金额转换小程序
精确到0.1
看到网上有很多这样的例子程序,不过觉得很不满意。有些程序我从命名上就觉得 * 实在是不符合规范,程序里面的算法没有让人明白得很清楚的注释,读...由于本人对算法不怎么在行,在做转换操作的时候用的是很笨的方法
java金额数字转中文工具类详解 Java 金额数字转中文工具类是将阿拉伯数字转换为汉字表示的工具类,具有实用的参考价值。本工具类主要用于将金额数字转换为中文表示,例如将12345.67转换为「一万二千三百四十五元六...
有些变态的报表需要把数字转换成英文输出,但愿这个能帮得到你 one hundred eighty-eight thousand, eight hundred one hundred eighty-eight thousand, eight hundred one one hundred eighty-eight thousand, ...
用JAVA书写的一个大写金额转化为小写金额的类
根据给定的文件信息,我们可以总结出以下关于“银行金额转换”的相关知识点,主要聚焦于Java编程语言在处理银行金额转换中的应用。 ### 银行金额转换:Java实现细节 #### 核心功能与算法设计 在Java中实现银行金额...
// 实现金额转换逻辑,这里仅提供思路,具体实现需根据实际情况调整 // 分离整数部分和小数部分 String integerPart = amount.split("\\.")[0]; String decimalPart = amount.contains(".") ? amount.split("\\....
1. 方便易用:使用 Java 实现数字金额到中文大写字符的转换可以方便地将数字金额转换成中文大写字符。 2. 高效快捷: Java 实现数字金额到中文大写字符的转换可以快速地将数字金额转换成中文大写字符。 3.灵活多样:...
可以把金额数值转为财务上常用的金额大写,如100元 转为壹佰园
本文将详细介绍一个Java程序,该程序用于将小写的人民币金额转换为大写形式。此转换主要用于财务、会计和其他正式场合,在这些场合中,大写金额是标准且必须的格式。此程序能够处理的金额范围最大支持到“仟万亿”,...
本篇将介绍如何使用Java编程语言将人民币金额转换成大写,并且通过自定义标签库(Tag Library)在网页上显示。首先,我们来看`ChangeNumMoney.java`这个文件,它可能包含了实现金额转换的核心逻辑。 `...