java人民币大小写转换_人民币大小写转换 java 实现
参考:http://blog.csdn.net/guaishushu1ss/article/details/76757405
对匹配的金额大小,转换规则做了部分修改
工具类:
public class CurrencyUtil {
/**
* 转换为中国人民币大写字符串,精确到分
* @param money 传入小写数字字符串
* @return
* @throws Exception
*/
public static String toChinaUpper(String money) throws Exception {
boolean lessZero = false;
if(money.startsWith("-")) {
money = money.substring(1);
lessZero = true;
}
if (!money.matches("^[0-9]*$|^0+\\.[0-9]+$|^[1-9]+[0-9]*$|^[1-9]+[0-9]*.[0-9]+$")) {
throw new Exception("钱数格式错误!");
}
String[] part = money.split("\\.");
String integerData = part[0];
String decimalData = part.length > 1 ? part[1] : "";
//替换前置0
if(integerData.matches("^0+$"))
{
integerData = "0";
}else if(integerData.matches("^0+(\\d+)$")){
integerData = integerData.replaceAll("^0+(\\d+)$", "$1");
}
StringBuffer integer = new StringBuffer();
for (int i = 0; i < integerData.length(); i++) {
char perchar = integerData.charAt(i);
integer.append(upperNumber(perchar));
integer.append(upperNumber(integerData.length() - i - 1));
}
StringBuffer decimal = new StringBuffer();
if (part.length > 1 && !"00".equals(decimalData)) {
int length = decimalData.length() >= 2 ? 2 : decimalData.length();
for (int i = 0; i < length; i++) {
char perchar = decimalData.charAt(i);
decimal.append(upperNumber(perchar));
if (i == 0)
decimal.append("角");
if (i == 1)
decimal.append("分");
}
}
String result = integer.toString() + decimal.toString();
result = dispose(result);
if(lessZero && !"零圆整".equals(result)) {
result = "负" + result;
}
return result;
}
private static char upperNumber(char number) {
switch (number) {
case "0":
return "零";
case "1":
return "壹";
case "2":
return "贰";
case "3":
return "叁";
case "4":
return "肆";
case "5":
return "伍";
case "6":
return "陆";
case "7":
return "柒";
case "8":
return "捌";
case "9":
return "玖";
}
return "0";
}
private static char upperNumber(int index) {
int realIndex = index % 9;
if(index > 8) {//亿过后进入回归,之后是拾,佰...
realIndex = (index - 9) % 8;
realIndex = realIndex + 1;
}
switch (realIndex) {
case 0:
return "圆";
case 1:
return "拾";
case 2:
return "佰";
case 3:
return "仟";
case 4:
return "万";
case 5:
return "拾";
case 6:
return "佰";
case 7:
return "仟";
case 8:
return "亿";
}
return "0";
}
private static String dispose(String result) {
result = result.replaceAll("0", "");//处理
result = result.replaceAll("零仟零佰零拾|零仟零佰|零佰零拾|零仟|零佰|零拾", "零");
result = result.replaceAll("零+", "零").replace("零亿", "亿");
result = result.matches("^.*亿零万[^零]仟.*$") ? result.replace("零万", "零") : result.replace("零万", "万");
result = result.replace("亿万", "亿");
//处理小数
result = result.replace("零角", "零").replace("零分", "");
result = result.replaceAll("(^[零圆]*)(.+$)", "$2");
result = result.replaceAll("(^.*)([零]+圆)(.+$)", "$1圆零$3");
//处理整数单位
result = result.replaceAll("圆零角零分|圆零角$|圆$|^零$|圆零$|零圆$", "圆整");
result = result.replaceAll("^圆整$", "零圆整");
return result;
}
}
测试类:
public class CurrencyUtilTest {
@Test
public void test(){
try {
Assert.assertEquals(CurrencyUtil.toChinaUpper("0"),"零圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("000000000000"),"零圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("0.00"),"零圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("0.03"),"叁分");
Assert.assertEquals(CurrencyUtil.toChinaUpper("0.43"),"肆角叁分");
Assert.assertEquals(CurrencyUtil.toChinaUpper("0000.43"),"肆角叁分");
Assert.assertEquals(CurrencyUtil.toChinaUpper("10000.43"),"壹万圆零肆角叁分");
Assert.assertEquals(CurrencyUtil.toChinaUpper("000000000000.000"),"零圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("421.0"),"肆佰贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("421.0000"),"肆佰贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("215224635421.00"),"贰仟壹佰伍拾贰亿贰仟肆佰陆拾叁万伍仟肆佰贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("215224635421.53"),"贰仟壹佰伍拾贰亿贰仟肆佰陆拾叁万伍仟肆佰贰拾壹圆伍角叁分");
Assert.assertEquals(CurrencyUtil.toChinaUpper("215224635421.03"), "贰仟壹佰伍拾贰亿贰仟肆佰陆拾叁万伍仟肆佰贰拾壹圆零叁分");
Assert.assertEquals(CurrencyUtil.toChinaUpper("2463215224635421.03"),"贰仟肆佰陆拾叁万贰仟壹佰伍拾贰亿贰仟肆佰陆拾叁万伍仟肆佰贰拾壹圆零叁分");
Assert.assertEquals(CurrencyUtil.toChinaUpper("1"),"壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("10"),"壹拾圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("20.7"),"贰拾圆零柒角");
Assert.assertEquals(CurrencyUtil.toChinaUpper("10.70"),"壹拾圆零柒角");
Assert.assertEquals(CurrencyUtil.toChinaUpper("18.5"),"壹拾捌圆伍角");
Assert.assertEquals(CurrencyUtil.toChinaUpper("200.5"),"贰佰圆零伍角");
Assert.assertEquals(CurrencyUtil.toChinaUpper("2000"),"贰仟圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("50000"),"伍万圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("500000"),"伍拾万圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("5000000"),"伍佰万圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("50000000"),"伍仟万圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("500000000"),"伍亿圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("5000000000"),"伍拾亿圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("5000000001"),"伍拾亿零壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("5000000021"),"伍拾亿零贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("5000000421"),"伍拾亿零肆佰贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("5000005421"),"伍拾亿零伍仟肆佰贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("5000035421"),"伍拾亿零叁万伍仟肆佰贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("5000635421"),"伍拾亿零陆拾叁万伍仟肆佰贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("5004635421"),"伍拾亿零肆佰陆拾叁万伍仟肆佰贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("5024635421"),"伍拾亿贰仟肆佰陆拾叁万伍仟肆佰贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("5224635421"),"伍拾贰亿贰仟肆佰陆拾叁万伍仟肆佰贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("15224635421"),"壹佰伍拾贰亿贰仟肆佰陆拾叁万伍仟肆佰贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("215224635421"),"贰仟壹佰伍拾贰亿贰仟肆佰陆拾叁万伍仟肆佰贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("500021"),"伍拾万零贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("5000821"),"伍佰万零捌佰贰拾壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("5050006501"),"伍拾亿伍仟万陆仟伍佰零壹圆整");
Assert.assertEquals(CurrencyUtil.toChinaUpper("550300001"),"伍亿伍仟零叁拾万零壹圆整");
} catch (Exception e) {
e.printStackTrace();
}
}
}
附上转换的一些规则:
人民币常识
人民币金额中文大写汉字主要包括:零、壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿。
人民币(缩写为RMB)是我国大陆地区的法定货币,尽管每个人几乎天天都要接触到人民币或者支票,但是人民币大写如何写是困扰很多人的问题。
尽管生活中看起来极其熟悉而又简单的东西,但发现其实并不会写。人民币在ISO 4217简称为CNY(China Yuan),常用简写为RMB(Ren Min Bi);人民币货币的符号是“ ¥”("Y"+"="),读音为“YUAN”。
人民币按照材料的自然属性划分,有金属币(亦称硬币)、纸币(亦称钞票)。无论纸币、硬币均等价流通,至今已发行了五套人民币。
人民币大写规范介绍
银行、单位和个人填写的各种票据和结算凭证是办理支付结算和现金收付的重要依据,直接关系到支付结算的准确、及时和安全。票据和结算凭证是银行、单位和个人凭以记载账务的会计凭证,是记载经济业务和明确经济责任的一种书面证明。因此,填写票据和结算凭证必须做到标准化、规范化、要素齐全、数字正确、字迹清晰、不错漏、不潦草、防止涂改。
中文大写金额数字应用正楷或行书填写,如壹、贰、叁、肆、伍、陆、柒、捌、玖、拾、佰、仟、万、亿、元、角、分、零、整(正)等字样,不得用一、二(两)、三、四、五、六、七、八、九、十、毛、另(或0)填写,不得自造简化字。如果金额数字书写中使用繁体字,如贰、陆、亿、万、圆的,也应受理。
人民币大写的正确写法还应注意以下几项:
一、中文大写金额数字到“元”为止的,在“元”之后、应写“整”(或“正”)字;在“角”之后,可以不写“整”(或“正”)字;大写金额数字有“分”的,“分”后面不写“整”(或“正”)字。
二、中文大写金额数字前应标明“人民币”字样,大写金额数字应紧接“人民币”字样填写,不得留有空白。大写金额数字前未印“人民币”字样的,应加填“人民币”三字,在票据和结算凭证大写金额栏内不得预印固定的“仟、佰、拾、万、仟、佰、拾、元、角、分”字样。
三、阿拉伯数字小写金额数字中有“0”时,中文大写应按照汉语语言规律、金额数字构成和防止涂改的要求进行书写。
四、阿拉伯小写金额数字前面均应填写人民币符号“¥”,阿拉伯小写金额数字要认真填写,不得连写分辨不清。
五、票据的出票日期必须使用中文大写,为防止变造票据的出票日期,在填写月、日时、月为壹、贰和壹拾的,日为壹至玖和壹拾、贰拾和叁拾的,应在其前加“零”,日为拾壹至拾玖的应在其前加“壹”,如1月15日应写成零壹月壹拾伍日,再如10月20日应写成零壹拾月零贰拾日。
六、票据出票日期使用小写填写的,银行不予受理;大写日期未按要求规范填写的,银行可予受理,但由此造成损失的由出票人自行承担。
java人民币大小写转换_人民币大小写转换 java 实现相关推荐
- 字符编码转换_进制转换(GB2312,GBK,JNI,HexTOStr)
[cpp] view plain copy print? // /* ASCII 英文一个字节 gb2312,gbk 中文两个字节,英文一个字节 在中文系统中ansi一般指gb2312或gbk GB2 ...
- java人民币大小写转换_人民币大小写转换
usingSystem;usingSystem.Text;usingSystem.Text.R using System; using System.Text; using System.Text.R ...
- java list e 查找_源码(04) -- java.util.ListE
java.util.List 源码分析(JDK1.7) ------------------------------------------------------------------------ ...
- java 基础 笔试题_非常全面的java基础笔试题
1.下列说法正确的是() (程序结构) A java程序的main方法必须写在类甩面 B java程序中可以有多个main方法 C.java程序中类名必须与文件名一样 D.JAVA程序的main方法中 ...
- 李兴华java视频在线观看_李兴华Java开发实战经典视频教程_IT教程网
资源名称:李兴华Java开发实战经典视频教程 资源目录: [IT教程网]010201_[第2章:简单Java程序]_简单Java程序 [IT教程网]010301_[第3章:Java基础程序设计]_Ja ...
- 李兴华java实战经典视频_李兴华Java开发实战经典视频教程
资源名称:李兴华Java开发实战经典视频教程 资源目录:[一品资源网]010201_[第2章:简单Java程序]_简单Java程序[一品资源网]010301_[第3章:Java基础程序设计]_Java ...
- java面试32问_学员分享:JAVA面试32问(11-20)
第十一,short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1;有错,s1是shor ...
- java跟python对比_【多年的Java程序员总结Java与Python的对比 】
多年的Java程序员总结Java与Python的对比 作为一个有多年职场经验的技术员,每当我遇到同行时,我都会问一句"你现在用的是什么语言?你喜欢用哪种语言?"至于答案,容后再说. ...
- java 开发书籍 目录_《零基础 Java 开发 》全书目录
第1部分 Java开发基础 第一章 搭建Java开发环境 1.1 Java简介 1.2 Java开发环境搭建 1.3 Java语⾔的功能 1.4 使用Eclipse开发Java程序 1.5 使用IDE ...
最新文章
- 【iOS-cocos2d-X 游戏开发之十四】cocos2dx(c++)中访问object函数
- linux 分析 ptrace
- python抢票代码_教你用Python动刷新抢12306火车票,附源码!
- Java商场对顾客年龄,购物中心客群调查:不同年龄层消费者进商场都干嘛?
- (JAVA)StringBuffer类(练习)
- 你的模型真的陷入局部最优点了吗?
- 求助pycharm里import pandas遇到No module named pandas怎么办
- 每日一道剑指offer-两个栈来实现一个队列
- iis swagger 部署_AspNet Core Api Restful +Swagger 发布IIS 实现微服务之旅 (二)
- Prim算法实现最小生成树MST(java)
- 单片机编程软件很简单(19),keil单片机编程软件3点介绍
- Appium使用教程_Android篇
- ps里面的css,PS中如何添加图层样式
- win10服务器系统要设置要密码是什么,云服务器win10系统初始密码
- 现代公关无需遮遮掩掩,明火执仗开干就行
- Linux之NTFS、FAT32、exFAT 各种格式硬盘挂载整理
- 第四章第九节数据资产盘点-数据资产目录分类
- 100多个经典常用的PHP功能插件大全实例演示和下载
- [bzoj1233]干草堆tower
- 初学C语言一些知识点的整理
热门文章
- 红细胞膜包裹载抗癌药的PLGA纳米载体/聚多巴胺涂覆载药plga材料(生物偶联)
- 练习:银行复利计算(用 for 循环解一道初中小题)
- 解决Error:All flavors must now belong to a named flavor dimension
- 计算机术语hpa,hpa(计算机术语)_百度百科
- 反射机制-Reflected
- 浏览器会不会缓存html,浏览器缓存机制(一)
- MBT测试思想在苏宁蛙测的运用实践分享
- 多目标优化之帕累托最优
- python计算三阶行列式
- sockaddr与sockaddr_in,sockaddr_un结构体详解