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; /** * 金额转换 * ...
随机推荐
- 数据库——SQL-SERVER练习(4) 建表及数据完整性
1. 输入下图的语句, 建立学生表STU. CREATE TABLE STU ( SNO NUMERIC() PRIMARY KEY, SNANE CHAR() NOT NULL, SSEX CHAR ...
- Elastic:用Docker部署Elastic栈
安装 因为我们需要使用docker来进行安装,我们必须安装: docker:根据不同的操作系统,请按照要求安装docker.可以到网站https://docs.docker.com/去安装 docke ...
- oracle学习笔记(十) 查询练习(一)
查询练习一 表创建 create table employee as select * from soctt.emp ; --记得授权 sysdba用户登录 grant select on scott ...
- LinuxShell脚本——认识Shell脚本
LinuxShell脚本——认识Shell脚本 摘要:本文主要介绍了Shell脚本的一些基本知识. 什么是Shell脚本 shell脚本是利用shell的功能所写的一个程序,这个程序是使用纯文本文件, ...
- Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析
Java生鲜电商平台-电商中海量搜索ElasticSearch架构设计实战与源码解析 生鲜电商搜索引擎的特点 众所周知,标准的搜索引擎主要分成三个大的部分,第一步是爬虫系统,第二步是数据分析,第三步才 ...
- SSM框架之Mybatis(2)CRUD操作
Mybatis(2)CRUD 1.基于代理Dao实现CRUD操作 使用要求: 1.持久层接口(src\main\java\dao\IUserDao.java)和持久层接口的映射配置(src\main\ ...
- Windows下Django项目搭建流程
1.创建虚拟环境 virtualenv test 2.进入虚拟环境 source ./项目名/Scripts/activate 3.创建项目 django-admin startproject 项目名 ...
- nRF24L01+不能接收或接收偶尔异常等问题实战分享
nRF24L01+接收异常问题综述 在调试nRF24L01+无线收发模块的时候,最具标志性的环节就是在接收端可以收到数据.在实际应用调试中,会出现很多意想不到的情况,造成nRF24L01+模块接收端无 ...
- pycharm 字符编码错误处理
如果在MySQL创建表空间时指定了他的字符集为utf8 但是插入数据后 在pycharm查看却出现字符乱码 怎么解决呢 ? 首先进入cmd 页面 输入 chcp 65001 (意思是指定cmd所有字 ...
- [Linux] 使用mount来挂载设备到目录
一般情况下直接mount 设备路径 目录路径,就可以了.umount 设备名,就可以卸载这个设备了使用lsblk -f可以查看挂载的设备,以及这些设备的文件系统. root@tao-PC:/boot# ...