根据人民币大写金额规范,转换有几点要注意的:

阿拉伯数字中间有“0”时,中文大写金额中间可以只写一个“零”字。如¥1,409.50,应写成人民币壹仟肆佰零玖圆伍角。

阿拉伯数字中间连续有几个“0”,中文大写金额中间可以只写一个“零”字,如¥6,007.14,应写成人民币陆仟零柒圆壹角肆分。

阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”,但仟位、角位不是“0”时,中文大写金额中可以只写一个零字,也可以不写“零”字,如¥1,680.32,应写成人民币壹仟陆佰>捌拾元零三角贰分,或者写成人民币壹仟陆佰捌拾元三角贰分;又如¥107,000.53,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万柒仟圆伍角叁分。

阿拉伯金额数字角位是“0”,而分位不是“0”时,中文大写金额“元”后面应写“零”字。如¥16,409.02,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾圆零肆分。

大写金额到“元”为止的,在“元”之后应写上“整”或“正”字,在“角”之后可以不写“整”或“正”字,在“分”之后的不写”整“或”正“字。

基本思路,每4个一组,表示千、百、拾,然后加上亿、万、圆,这样的,如果有重复的0,需要忽略

public class MoneyToChiness{
public static void main(String[] args) {
long l = System.currentTimeMillis();
System.out.println(MoneyToChiness.moneyToChinese(new BigDecimal("999999999999.99")));
System.out.println(System.currentTimeMillis()-l);
}
public static String moneyToChinese(BigDecimal i_money) {
if(i_money.equals(BigDecimal.ZERO)){
return "零圆整";
}
Double max = 1000000000000D;
Double min = 0.01D;
if (i_money.doubleValue() >= max || i_money.doubleValue() < min) {
return "大于1万亿或小于1分了";
}
i_money = i_money.setScale(2, RoundingMode.HALF_UP);
String numStr = i_money.toString();
int pointPos = numStr.indexOf('.');
//整数部分
String s_int = null;
//小数部分
String s_point = null;
if (pointPos >= 0) {
s_int = numStr.substring(0, pointPos);
s_point = numStr.substring(pointPos + 1);
} else {
s_int = numStr;
}
StringBuilder sb = new StringBuilder();
if(!"0".equals(s_int)){
int groupCount = (int) Math.ceil(s_int.length() / 4.0);
for (int group = 0; group < groupCount; group++) {
boolean zeroFlag = true;
boolean noZeroFlag = false;
int start = (s_int.length() % 4 == 0 ? 0 : (s_int.length() % 4 - 4)) + 4 * group;
for (int i = 0; i < 4; i++) {
if (i + start >= 0) {
int value = s_int.charAt(i + start) - '0';
if (value > 0) {
sb.append(CN_UPPER_NUMBER[value]);
if (i < 3) {
sb.append(CN_UPPER_UNIT[i]);
}
zeroFlag = true;
noZeroFlag = true;
} else if (zeroFlag) {
sb.append('零');
zeroFlag = false;
}
}
}
if(sb.charAt(sb.length() - 1) == '零'){
sb.deleteCharAt(sb.length() - 1);
}
if(noZeroFlag || groupCount - group == 1){
sb.append(CN_GROUP[groupCount - group - 1]);
}
}
}
if (s_point == null || "00".equals(s_point)) {
sb.append('整');
}else{
int j = s_point.charAt(0) - '0';
int f = s_point.charAt(1) - '0';
if(j > 0){
sb.append(CN_UPPER_NUMBER[j]).append('角');
if(f != 0){
sb.append(CN_UPPER_NUMBER[f]).append('分');
}
}else if("0".equals(s_int)){
sb.append(CN_UPPER_NUMBER[f]).append('分');
}else {
sb.append('零').append(CN_UPPER_NUMBER[f]).append('分');
}
}
return sb.toString();
} private static final char[] CN_UPPER_NUMBER = "零壹贰叁肆伍陆柒捌玖".toCharArray();
private static final char[] CN_UPPER_UNIT = "仟佰拾".toCharArray();
private static final char[] CN_GROUP = "圆万亿".toCharArray();
}

执行三次耗时分别为,6毫秒,5毫秒,6毫秒,平均5.67毫秒。在我电脑CPU90%的情况下测得。

转自https://www.cnblogs.com/xcr1234/p/9140867.html

java 金额数字转换大写算法的更多相关文章

  1. 将金额数字转换为大写汉字的js函数

    //将金额数字转换为大写汉字的函数 function convertCurrency(money) { //汉字的数字 var cnNums = new Array('零', '壹', '贰', '叁 ...

  2. 【PHP】金额数字转换成大写形式

    <?php /*将数字金额转成大写*/ function num_to_upper($num) { $d = array('零','壹','贰','叁','肆','伍','陆','柒','捌', ...

  3. C#金额数字转换中文繁体

    /// <summary> /// 数字转换中文繁体金钱 /// </summary> /// <param name="Digital">&l ...

  4. PHP实现金额数字转换成大写函数

    <?php header("Content-Type:text/html;charset=utf-8"); function num_to_upper($num) { $d ...

  5. 数字转换大写人民币的delphi实现

    function TForm1.changeRmb(const strRmb:string):string; var txt,strhighlevel:string; i,n,m,ilen,ipos: ...

  6. 比较java与c语言中数字转换成字符的不同

    java java中将数字转换成字符非常方便,只要用一个"+"然后在跟一个空格行了.比如,你输入一个122 ,就会变成"122 ". import java.u ...

  7. C# 金额数字转中文的方法

    /// <summary> /// 金额数字转大写(带小数点) /// </summary> public static string PriceToCn(decimal pr ...

  8. 算法--java实现将数字转换成人民币大写(迅雷面试题)

    今天去迅雷面试,是个数字转换成人民币的算法题: public class Rmb { /** * 人民币的基本信息和操作 * * @author soyoungboy * @version 1.0 * ...

  9. java数字金额转中文大写

    package com.example.convert; import java.text.DecimalFormat; import java.util.Scanner; /** * 金额转换 * ...

随机推荐

  1. ES6入门 阮一峰

    ECMAScript 6 入门 http://es6.ruanyifeng.com/#README 在线ES6转ES5 https://es6console.com/k11vgg1r/

  2. 黄聪:PHP转换网址相对路径到绝对路径的一种方法

    相信很多程序(尤其是采集类的程序)都会有需要把网址的相对路径转换成绝对路径的需要,例如采集到某页面的HTML代码中包含资源文件经常会看到这样的文件名: <link rel="style ...

  3. vue拖拽组件开发

    vue拖拽组件开发 创建临时vue项目 先查看node和npm版本,怎么安装就不多多bb了 再安装vue-cli npm install vue-cli -g //全局安装 vue-cli 检测是否安 ...

  4. jxl解析excel时,处理中文乱码问题

    jxl解析excel时,处理中文乱码问题 一般出现较多的问题是,当exce中包含了中文或特殊字符时,在解析时候就会出现乱码现象. 解决方法为: InputStream in = new FileInp ...

  5. 如何将vim改造为python的IDE

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Jeffrey Wang PS:如有需要Python学习资料的小伙 ...

  6. Javase之内部类概述

    内部类概述 把类定义在其他类的内部就称为内部类 class A{ class B{ } } B就称为内部类,A称为外部类. 内部类的访问特点 内部类直接访问外部类成员,包括私有. 外部类要访问内部类要 ...

  7. Android开发利器之pidcat

    介绍pidcat: pidcat 是Android届JakeWharton大神开发的一款命令行工具,堪称Android开发利器,它能方便Android程序猿捕获日志,过滤日志,定位程序问题,超级好用. ...

  8. iOS 禁用`URL Scheme`和`Universal Link`(通用链接)

    为什么要禁用URL Scheme和Universal Link(通用链接) 通常我们APP中都会嵌套一些web页面,有时我们的web页面会被DNS劫持从而跳转到其他APP中:或者是某些APP的Univ ...

  9. Saltstack_使用指南11_配置管理-状态之间依赖关系

    1. 说明 下文的案例是根据上一篇文章进行的修改.因此请优先读取上一篇文章内容<Saltstack_10_配置管理-状态模块> 并且目录进行了变化,从 /srv/salt/lamp 变为了 ...

  10. 将Docker容器转移至另一服务器

    1 把当前的容器提交为一个镜像: docker commit 容器名 镜像名 2 将镜像存为tar文件 docker save 镜像名 >备份文件.tar 3将 备份文件.tar 复制到目的主机 ...