public class RmbCapitalFormatter {
//大写对应数组
private static final String RMB_CAPITAL[] = {
"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "拾"
};
private static final HashMap<String, Integer> RMB_CAPITAL_MAP = new HashMap<String, Integer>();
static {
RMB_CAPITAL_MAP.put("零", 0);
RMB_CAPITAL_MAP.put("壹", 1);
RMB_CAPITAL_MAP.put("贰", 2);
RMB_CAPITAL_MAP.put("叁", 3);
RMB_CAPITAL_MAP.put("肆", 4);
RMB_CAPITAL_MAP.put("伍", 5);
RMB_CAPITAL_MAP.put("陆", 6);
RMB_CAPITAL_MAP.put("柒", 7);
RMB_CAPITAL_MAP.put("捌", 8);
RMB_CAPITAL_MAP.put("玖", 9);
RMB_CAPITAL_MAP.put("拾", 10);
}
//是圆(复)还是元(简)
private boolean isSimpleYuan = false;
//是整(复)还是正(简)
private boolean isSimpleZheng = false;
public RmbCapitalFormatter() {
}
public boolean isSimpleYuan() {
return isSimpleYuan;
}
public void setSimpleYuan(boolean isSimpleYuan) {
this.isSimpleYuan = isSimpleYuan;
}
public boolean isSimpleZheng() {
return isSimpleZheng;
}
public void setSimpleZheng(boolean isSimpleZheng) {
this.isSimpleZheng = isSimpleZheng;
}
public String format(Double data) {
StringBuilder buf = new StringBuilder();
boolean isNegative = false;
if (data < 0) {
isNegative = true;
data = 0 - data;
}
//整数部分
long intPart = data.longValue();
//小数部分,只有前两位小数有意义
int fractionPart = (int)((data - intPart) * 100);
if (intPart == 0 && fractionPart == 0) {
buf.append("人民币零");
if (isSimpleYuan) {
buf.append("元");
} else {
buf.append("圆");
}
if (isSimpleZheng) {
buf.append("正");
} else {
buf.append("整");
}
return buf.toString();
}
String cur = "";
boolean needZero = false;
//亿为一个大循环,四位数是一个小循环
while(intPart > 0) {
int lowestFourDigits = (int)(intPart % 10000);
intPart = intPart / 10000;
if (lowestFourDigits > 0) {
if (needZero) {
buf.insert(0, "零");
needZero = false;
}
buf.insert(0, changeFourDigists(lowestFourDigits) + cur);
if (lowestFourDigits < 1000) {
needZero = true;
}
} else {
if ("亿".equals(cur)) {
buf.insert(0, cur);
}
}
if (cur.length() == 0) {
cur = "万";
} else if ("万".equals(cur)) {
cur = "亿";
} else if ("亿".equals(cur)) {
cur = "万";
}
}
if (data > 1) {
if (isSimpleYuan) {
buf.append("元");
} else {
buf.append("圆");
}
}
if (fractionPart > 0) {
int jiaoPart = fractionPart / 10;
int fenPart = fractionPart % 10;
if (jiaoPart > 0) {
buf.append(RMB_CAPITAL[jiaoPart]).append("角");
}
if (fenPart > 0) {
if (data > 1 && jiaoPart == 0) {
buf.append(RMB_CAPITAL[0]);// 零
}
buf.append(RMB_CAPITAL[fenPart]).append("分");
}
} else {
if (isSimpleZheng) {
buf.append("正");
} else {
buf.append("整");
}
}
String result = buf.toString();
if (isNegative) {
return "人民币负" + result;
} else {
return "人民币" + result;
}
}
//四位整数转换成大写金额
private static String changeFourDigists(int number) {
if (number == 0) {
return "零";
}
StringBuilder buf = new StringBuilder();
//千位数部分
int qianPart = number / 1000;
number = number % 1000;
//百位数部分
int baiPart = number / 100;
number = number % 100;
//十位数部分
int shiPart = number / 10;
number = number % 10;
//个位数部分
int gePart = number;
//是否需要添零
boolean needZero = false;
//前面是否有值
boolean havaValueBefore = false;
if (qianPart > 0) {
buf.append(RMB_CAPITAL[qianPart]).append("仟");
havaValueBefore = true;
} else {
havaValueBefore = false;
}
if (baiPart > 0) {
buf.append(RMB_CAPITAL[baiPart]).append("佰");
havaValueBefore = true;
} else {
if (havaValueBefore) {
needZero = true;
}
}
if (shiPart > 0) {
if (needZero) {
buf.append("零");
needZero = false;
}
buf.append(RMB_CAPITAL[shiPart]).append("拾");
havaValueBefore = true;
} else {
if (havaValueBefore) {
needZero = true;
}
}
if (gePart > 0) {
if (needZero) {
buf.append("零");
needZero = false;
}
buf.append(RMB_CAPITAL[gePart]);
}
return buf.toString();
}
public Double unformat(String data) {
boolean isNegative = false;
if (data.startsWith("人民币")) {
data = data.substring(3);
}
if (data.startsWith("负")) {
isNegative = true;
data = data.substring(1);
}
//整数部分
long intPart = 0;
//小数部分
int fractionPart = 0;
//千分位部分
int qianPart = 0;
//百分位部分
int baiPart = 0;
//十分位部分
int shiPart = 0;
//个位部分
int gePart = 0;
while(data.length() > 0) {
String token = data.substring(0, 1);
if (token.equals("零")) {
} else if (token.equals("整") || token.equals("正")) {
break;
} else if (token.equals("角")) {
shiPart = gePart * 10;
gePart = 0;
} else if (token.equals("分")) {
fractionPart += shiPart + gePart;
shiPart = 0;
gePart = 0;
break;
} else if (token.equals("圆") || token.equals("元")) {
intPart += qianPart + baiPart + shiPart + gePart;
qianPart = 0;
baiPart = 0;
shiPart = 0;
gePart = 0;
} else if (token.equals("拾")) {
shiPart = gePart * 10;
gePart = 0;
} else if (token.equals("佰")) {
baiPart = gePart * 100;
gePart = 0;
} else if (token.equals("仟")) {
qianPart = gePart * 1000;
gePart = 0;
} else if (token.equals("万")) {
intPart += (qianPart + baiPart + shiPart + gePart) * 10000;
qianPart = 0;
baiPart = 0;
shiPart = 0;
gePart = 0;
} else if (token.equals("亿")) {
intPart += qianPart + baiPart + shiPart + gePart;
intPart = intPart * 100000000;
qianPart = 0;
baiPart = 0;
shiPart = 0;
gePart = 0;
} else {
gePart = RMB_CAPITAL_MAP.get(token);
}
data = data.substring(1);
}
double result = intPart + ((double)fractionPart) / 100;
if (isNegative) {
return 0 - result;
} else {
return result;
}
}
}
分享到:
相关推荐
本文实例为大家分享了python实现人民币大写转换的具体代码,供大家参考,具体内容如下 #!/usr/bin/python # -*- coding:utf-8 -*- # ********* 转换方法介绍 ********* # 将需要转换的数字从右向左,每4位分成一个...
这是一个把人民币数字转换成大写的java程序
人民币数字转换成汉字大写 android Java 运行效率
C语言成序设计__实现人民币小写金额与大写金额的转换
jsp页面调用applet实现人民币的大小写转换.docx
实现人民币由数值转换成中文大写,其中包含进位、精确度的设置
将阿拉伯数字复制粘贴或输入到“输入小写数字金额”中,比如(123456),然后单击“转换为大写金额”按钮。就会在“显示中文大写金额”框中显示自动转换完成的中文大写内容...
基于java的人民币大写的转换,基本实现了亿以内的小写转大写的功能
mysql下人民币金额转为大写,通过函数实现,灵活实现把金额转为大写的数字
网页模板——原生JS实现的人民币数字大写转换特效源码
原生JS实现的人民币数字大写转换特效源码.zip 原生JS实现的人民币数字大写转换特效源码.zip 原生JS实现的人民币数字大写转换特效源码.zip
将人民币转换为大写,实现了仟亿级别以内的大写转换。 具体内容看博客 https://blog.csdn.net/H200102/article/details/104672484
主要为大家详细介绍了java实现数字转换人民币中文大写工具,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Ireport实现金额大写 在irport里面写script脚本 完成转换
在与财务相关的应用中,经常会用到人民币金额的大写,比如发票的打印 程序。本题的任务是:从键盘输入一个十亿以内的正整数( int 类型),把它转换 为人民币金额大写(不考虑用户输入错误的情况)。
VB.NET编写的人民币大小写转换工具,实现小写转大写,大写转小写。
人民币大小写转换器可以实现在文本框中输入数字人民币,然后通过点击大小写转换按钮,实现将数字人民币转换成大写汉字人民币的形式,并在列一个文本框中显示出来。
Java语言实现的,将数字金额转换为人民币大写金额的例子,没有对输入数字进行校验,小数点后只保留两位,支持千分符。最大金额范围为千亿。