JAVA处理数字与中文数字互转(最大处理数字不超过万兆即:9999999999999999.9999)
package practice; import java.util.Arrays; /**
* 数字与中文数字互转(最大处理数字不超过万兆即:9999999999999999.9999)
* @author Archimedes
* @Date 6 7 19
*/
public class ChineseNumberAndNumber { private static final char NUMBER_CONSTRAINT[] = {'9', '8', '7', '6', '5', '4', '3', '2', '1', '0', '.'}; private static final String[] DECIMAL_UNIT = {"角", "分", "厘", "毫"}; private static final String[] CHINESE_NUMBER = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; private static final String[] INTEGER_UNIT = {"", "万", "亿", "兆"}; private static final String[] INTEGER_UNIT1 = {"", "拾", "佰", "仟"}; /**
* 数字转中文数字
* @param number
* @return
*/
public static String numberToChineseNumber(String number) {
//数字有效性判断
//先判断number中的数字是否在NUMBER_CONSTRAINT[]中
int quantity = NUMBER_CONSTRAINT.length - 1;
for (int i = 0; i < number.length(); i++) {
char unit = number.charAt(i);
for (int j = 0; j < NUMBER_CONSTRAINT.length; j++) {
if (unit == NUMBER_CONSTRAINT[j]) break;
if (j == quantity) return "请输入有效数字";
}
}
//再判断number中小数点是否不超过1个且小数点不在第一位和最后一位
int quantity1 = 0;
for (int i = 0; i < number.length(); i++) {
if ('.' == number.charAt(i) && (i == 0 || i == number.length() - 1)) return "1请输入有效数字";
if ('.' == number.charAt(i)) {
++quantity1;
if (quantity1 == 2) return "2请输入有效数字";
}
}
//最后做数字范围的有效判断,并且把诸如0.000000000000000的数字转换为0
if (quantity1 == 0) {
number = headNumberIsZero(number);
if (number.length() > 16) return "3请输入有效数字";
} else {
String[] split = number.split("[.]");
//处理整数部分
split[0] = headNumberIsZero(split[0]);
if (split[0].length() > 16) return "4请输入有效数字";
//处理小数部分
if (split[1].length() > 4) {
for (int i = 4; i < split[1].length(); i++) {
if ('0' != split[1].charAt(i)) return "5请输入有效数字";
}
split[1] = split[1].substring(0, 4);
}
for (int i = split[1].length() - 1; i >= 0; i--) {
if ('0' == split[1].charAt(i)) split[1] = split[1].substring(0, i);
else break;
}
//合并整数与小数
if (split[1].isEmpty()) number = split[0];
else number = split[0] + "." + split[1];
}
//数字有效性判断完毕 //数字转中文数字
String[] result = {"", ""};
String[] split = number.split("[.]");
//处理小数部分
if (split.length == 2) {
int c = 0; //定义标识用于判断前一位是否为0
for (int i = 0; i < split[1].length(); i++) {
if (c == 0 && ('0' == split[1].charAt(i))) {
result[1] += CHINESE_NUMBER[0];
c = 1;
} else if ('0' != split[1].charAt(i)) {
result[1] += (CHINESE_NUMBER[Integer.parseInt(String.valueOf(split[1].charAt(i)))] + DECIMAL_UNIT[i]);
c = 0;
}
}
}
//处理整数部分
//把整数部分从左到右每4个一组放入数组
String[] integerPart = new String[(split[0].length() - 1) / 4 + 1];
for (int i = split[0].length() - 1; i >= 0; i -= 4) {
if (i - 3 >= 0) integerPart[i / 4] = split[0].substring(i - 3, i + 1);
else integerPart[i / 4] = split[0].substring(0, i + 1);
}
System.out.println(Arrays.toString(integerPart));
//转换
int length = integerPart.length;
int c = 0; //用于判断前一位是否为0
if (length > 1) {
int l = 1; ////用于判断上一次计数单位是否全为0(0表示全为0)
for (int i = 0; i < integerPart.length; i++) {
int x = 0; //用于判断计数单位是否全为0
int length1 = integerPart[i].length();
for (int j = 0; j < length1; j++) {
if (c == 0 && '0' != integerPart[i].charAt(j)) {
String temp = CHINESE_NUMBER[Integer.parseInt(String.valueOf(integerPart[i].charAt(j)))]
+ INTEGER_UNIT1[length1 - 1 -j];
result[0] += temp;
x = 1;
} else if ('0' == integerPart[i].charAt(j)) {
c = 1;
} else if (c == 1 && j == 0 && '0' != integerPart[i].charAt(j)) {
if (l == 0) result[0] += "零";
String temp = CHINESE_NUMBER[Integer.parseInt(String.valueOf(integerPart[i].charAt(j)))]
+ INTEGER_UNIT1[length1 - 1 -j];
result[0] += temp;
c = 0; x = 1;
} else if (c == 1 && j != 0 && '0' != integerPart[i].charAt(j)) {
String temp = "零" + CHINESE_NUMBER[Integer.parseInt(String.valueOf(integerPart[i].charAt(j)))]
+ INTEGER_UNIT1[length1 - 1 -j];
result[0] += temp;
c = 0; x = 1;
}
}
l = x; //把此次循环的计数单位是否全为0的结果赋值给变量,用于下次循环判断
if (x == 1) result[0] += INTEGER_UNIT[length - 1 - i];
}
result[0] += "元";
} else {
int length1 = integerPart[0].length();
for (int i = 0; i < length1; i++) {
if (c == 0 && ('0' != integerPart[0].charAt(i))) {
String temp = CHINESE_NUMBER[Integer.parseInt(String.valueOf(integerPart[0].charAt(i)))]
+ INTEGER_UNIT1[length1 - 1 - i];
result[0] += temp;
} else if ('0' == integerPart[0].charAt(i)) {
if (length1 == 1) {
result[0] += "零";
}
c = 1;
} else if (c == 1 && ('0' != integerPart[0].charAt(i))) {
String temp = "零" + CHINESE_NUMBER[Integer.parseInt(String.valueOf(integerPart[0].charAt(i)))]
+ INTEGER_UNIT1[length1 - 1 - i];
result[0] += temp;
c = 0;
}
}
result[0] += "元";
}
if (split.length == 1) {
result[0] += "整";
return result[0];
} else {
if ("零元".equals(result[0])) return result[1];
else return result[0] + result[1];
}
//数字转中文数字完毕
} /**
* 把数字的前几个连续的0去掉,但数字如全为0则保留1个
* @param number
* @return
*/
private static String headNumberIsZero(String number) {
try {
if ('0' == number.charAt(0)) return headNumberIsZero(number.substring(1));
else return number;
} catch (IndexOutOfBoundsException e) {
return "0";
}
} private static String headNumberIsZero1(String number) {
if (number.isEmpty()) return "0";
if ('0' == number.charAt(0)) return headNumberIsZero(number.substring(1));
else return number;
} private static String headNumberIsZero2(String number) {
if ('0' != number.charAt(0)) return number;
else {
for (int i = 1; i < number.length(); i++) {
if ('0' != number.charAt(i)) {
number = number.substring(i);
break;
} else if (i == number.length() -1) number = "0";
}
}
return number;
} public static void main(String[] args) {
String number = numberToChineseNumber("64646405000.033");
System.out.println(number);
} }
JAVA处理数字与中文数字互转(最大处理数字不超过万兆即:9999999999999999.9999)的更多相关文章
- Java中过滤出字母、数字和中文的正则表达式
1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A-Za-z)] (2)过滤出数字的正则表达式 [^(0-9)] (3)过滤出中文的正则表达式 [^(\\u4e0 ...
- java 数字转中文
java代码 数字转中文,该方法只做了对int型整数的转换 private static String numberToChinese(int number) { String[] numbers = ...
- java中用正则表达式判断中文字符串中是否含有英文或者数字
public static boolean includingNUM(String str)throws Exception{ Pattern p = Pattern.compile(" ...
- AJPFX总结关于Java中过滤出字母、数字和中文的正则表达式
1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A-Za-z)] (2) 过滤出 数字 的正则表达式 [^(0-9)] (3) 过滤出 中文 的正则 ...
- Java正则表达式过滤出字母、数字和中文
原文:http://blog.csdn.net/k21325/article/details/54090066 1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式 [^(A ...
- java实现数字转中文大写
package cn.aikang.ChineseC; import java.util.Scanner; /** * @Description: TODO(这里用一句话描述这个类的作用) * @Au ...
- 使用Java将阿拉伯数字转换为中文数字(适配小数转换)
Java数字转换工具类 简介 该工具类可以将整数.小数.负数转换为中文的数字,如: 0 --> 零 1 --> 一 2.1 --> 二点一 -2.1 --> 负二点一 具体代码 ...
- java判断字符串是否为数字或中文或字母
个人认为最好的方法 *各种字符的unicode编码的范围: * 汉字:[0x4e00,0x9fa5](或十进制[19968,40869]) * 数字:[0x30,0x39](或十进制 ...
- textbox只能输入数字或中文的常用正则表达式和验证方法
验证数字的正则表达式集 验证数字:^[0-9]*$ 验证n位的数字:^\d{n}$ 验证至少n位数字:^\d{n,}$ 验证m-n位的数字:^\d{m,n}$ 验证零和非零开头的数字:^(0|[1-9 ...
随机推荐
- MySQL导入utf8编码的CSV文件
首先,作为测试,我们在这里创建一个名为testdb的数据库,和一个名为test_table的表: create database if not exists testdb default charse ...
- Python(1)自动发送邮件
python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用.smtplib模块主要负责发送邮件,email模块主要负责构造邮件. sm ...
- Egret入门学习日记 --- 第十五篇(书中 6.1~6.9节 内容)
第十五篇(书中 6.1~6.9节 内容) 好的,昨天完成了第五章. 今天来看第六章. 总结重点: 1.如何对组件进行分组? 跟着做: 重点1:如何对组件进行分组? 首先,选中你想要组合的组件. 然后点 ...
- 居里先生的猜想 | 皮埃尔·居里诞辰160周年
皮埃尔·居里(Pierre Curie)先生坐在桌前,手里把玩着一块小磁铁.忽然,一道闪念跃入脑海,他为自己这个大胆的想法激动不已,忍不住伏案疾笔书写起来.不远处,一位安静的青年女子温情脉脉地注视着他 ...
- poj1584(判断凸包+求点到线段的距离)
题目链接:https://vjudge.net/problem/POJ-1584 题意:首先要判断凸包,然后判断圆是否在多边形中. 思路: 判断凸包利用叉积,判断圆在多边形首先要判断圆心是否在多边形中 ...
- 基于nginx与zookeeper的API Gateway实现笔记 - 环境搭建
为了简化操作,采用操作系统为CentOS 8. 首先需要编译出libzookeeper,在官网下载最新的zookeeper源码,或者github上clone一个,地址为:https://github. ...
- [转帖]Pivotal Greenplum 6.0 新特性介绍
Pivotal Greenplum 6.0 新特性介绍 https://cloud.tencent.com/developer/news/391063 原来 greenplum 也是基于pg研发的. ...
- DB2输出每隔10分钟的数据
一.输出1-100的数据 此处参考 https://bbs.csdn.net/topics/390516027 with t(id) as ( as id from sysibm.sysdummy1 ...
- 可能是一篇(抄来的)min25学习笔记
可能是一篇(抄来的)min25学习笔记 一个要求很多的积性函数 我们考虑有一个积性函数,这个函数满足可以快速计算质数处的值 且质数可以写成一个多项式的形式--而且这个多项式如果强行套在合数上,满足积性 ...
- HTML 是什么?
HTML 指的是超文本标记语言(英语:HyperText Markup Language),是用来描述网页的一种语言. HTML 不是一种编程语言,而是一种标记语言,它有一套标记标签 . HTML 使 ...