java 金额数字转换大写算法
根据人民币大写金额规范,转换有几点要注意的:
阿拉伯数字中间有“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 金额数字转换大写算法的更多相关文章
- 将金额数字转换为大写汉字的js函数
//将金额数字转换为大写汉字的函数 function convertCurrency(money) { //汉字的数字 var cnNums = new Array('零', '壹', '贰', '叁 ...
- 【PHP】金额数字转换成大写形式
<?php /*将数字金额转成大写*/ function num_to_upper($num) { $d = array('零','壹','贰','叁','肆','伍','陆','柒','捌', ...
- C#金额数字转换中文繁体
/// <summary> /// 数字转换中文繁体金钱 /// </summary> /// <param name="Digital">&l ...
- PHP实现金额数字转换成大写函数
<?php header("Content-Type:text/html;charset=utf-8"); function num_to_upper($num) { $d ...
- 数字转换大写人民币的delphi实现
function TForm1.changeRmb(const strRmb:string):string; var txt,strhighlevel:string; i,n,m,ilen,ipos: ...
- 比较java与c语言中数字转换成字符的不同
java java中将数字转换成字符非常方便,只要用一个"+"然后在跟一个空格行了.比如,你输入一个122 ,就会变成"122 ". import java.u ...
- C# 金额数字转中文的方法
/// <summary> /// 金额数字转大写(带小数点) /// </summary> public static string PriceToCn(decimal pr ...
- 算法--java实现将数字转换成人民币大写(迅雷面试题)
今天去迅雷面试,是个数字转换成人民币的算法题: public class Rmb { /** * 人民币的基本信息和操作 * * @author soyoungboy * @version 1.0 * ...
- java数字金额转中文大写
package com.example.convert; import java.text.DecimalFormat; import java.util.Scanner; /** * 金额转换 * ...
随机推荐
- 分词 | 双向匹配中文分词算法python实现
本次实验内容是基于词典的双向匹配算法的中文分词算法的实现.使用正向和反向最大匹配算法对给定句子进行分词,对得到的结果进行比较,从而决定正确的分词方法. 算法描述正向最大匹配算法先设定扫描的窗口大小ma ...
- DatabaseLibrary -数据库操作
操作数据库: Table Must Exist 验证表必须存在,存在则Pass,反之Fail Delete All Rows From Table 删除数据库中表的所有行 Execute Sql St ...
- Redis for OPS 04:主从复制
写在前面的话 Redis 的主从其实和 MySQL 类似,更多的还是作为备份的功能存在,在复杂的 Rediis 集群架构中,主从也是不可或缺的. 主从复制 主从复制原理: 1. 从库通过命令连接到主库 ...
- du 配合sort查看文件夹大小
du -s * | sort -nr | head 选出排在前面的10个 du -s * | sort -nr | tail 选出排在后面的10个
- git基本操作:分支管理
一.创建测试项目 1.新建GitHub仓库 在GitHub上面新创建一个仓库,用来演示分支管理,如下图所示: 点击“Create repository”按钮创建新仓库. 2.将本地仓库项目上传到Git ...
- 在Vue中使用i18n 国际化遇到 Uncaught TypeError: Cannot assign to read only property 'exports' of object '#<Object>'
最近用Vue在搭建前端框架,在引用i18n时,运行的时候报错:Uncaught TypeError: Cannot assign to read only property 'exports' of ...
- C# 矢量图EMF 总结
个人知识记录.如果有用请点赞,否则勿喷.忽略. 个人站点:https://i.cnblogs.com/EditPosts.aspx?opt=1 注意:句柄的操作1.创建 代码如下: Metafile ...
- Flask笔记:信号机制
Flask中有内置的一些信号,也可以通过三方库blinker自定义信号,其实Flask内置的信号也是优先使用的blinker库,如果没有安装blinker才会使用自定义的信号机制.可以通过点击任意导入 ...
- 高强度学习训练第十一天总结:Class文件结构(二)
常量池 可以理解为Class文件之中的资源仓库,他是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一 访问标志 在常量池结束后,紧接着的俩个字节代表访问标 ...
- js绑定事件代理的坑
js通过事件代理的方式绑定跳转事件,我这里的逻辑是把click事件绑定在最外层container上面,如果e.target包含我已经写好的class,则执行跳转逻辑.但是这种方式好像只能是在点击的元素 ...