需求如下:用json读取后台工时信息,比如23.5小时,需要通过编码将其转换为贰拾叁点伍
比如23.23之前有对Stringl类型强转为Double在转为整型,发生了精度丢失,后来想想对小数点进行分割是个办法
编码实现如下:
package day1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.regex.Pattern; public class test_5 { /**
* 单位进位,中文默认为4位即(万、亿)
*/
public static int UNIT_STEP = 4; /**
* 单位
*/
public static String[] CN_UNITS = new String[] { "个", "十", "百", "千", "万", "十",
"百", "千", "亿", "十", "百", "千", "万" }; /**
* 汉字
*/
public static String[] CN_CHARS = new String[] { "零", "一", "二", "三", "四",
"五", "六", "七", "八", "九" }; /**
* 将阿拉伯数字转换为中文数字123=》一二三
*
* @param srcNum
* @return
*/
public static String getCNNum(int srcNum) {
String desCNNum = ""; if (srcNum <= 0)
desCNNum = "零";
else {
int singleDigit;
while (srcNum > 0) {
singleDigit = srcNum % 10;
desCNNum = String.valueOf(CN_CHARS[singleDigit]) + desCNNum;
srcNum /= 10;
}
} return desCNNum;
} /**
* 数值转换为中文字符串 如2转化为贰
*/
public String cvt(long num) {
return this.cvt(num, false);
} /**
* 数值转换为中文字符串(口语化)
*
* @param num
* 需要转换的数值
* @param isColloquial
* 是否口语化。例如12转换为'十二'而不是'一十二'。
* @return
*/
public String cvt(String num, boolean isColloquial) {
int integer, decimal;
StringBuffer strs = new StringBuffer(32);
String[] splitNum = num.split("\\.");
integer = Integer.parseInt(splitNum[0]); //整数部分
decimal = Integer.parseInt(splitNum[1]); //小数部分
String[] result_1 =convert(integer, isColloquial);
for (String str1 : result_1)
strs.append(str1);
if(decimal==0){//小数部分为0时
return strs.toString();
}else{
String result_2 =getCNNum(decimal); //例如5.32,小数部分展示三二,而不是三十二
strs.append("点");
strs.append(result_2);
return strs.toString();
}
} /*
* 对于int,long类型的数据处理
*/
public String cvt(long num, boolean isColloquial) {
String[] result = this.convert(num, isColloquial);
StringBuffer strs = new StringBuffer(32);
for (String str : result) {
strs.append(str);
}
return strs.toString();
} /**
* 将数值转换为中文
*
* @param num
* 需要转换的数值
* @param isColloquial
* 是否口语化。例如12转换为'十二'而不是'一十二'。
* @return
*/
public String[] convert(long num, boolean isColloquial) {
if (num < 10) {// 10以下直接返回对应汉字
return new String[] { CN_CHARS[(int) num] };// ASCII2int
} char[] chars = String.valueOf(num).toCharArray();
if (chars.length > CN_UNITS.length) {// 超过单位表示范围的返回空
return new String[] {};
} boolean isLastUnitStep = false;// 记录上次单位进位
ArrayList<String> cnchars = new ArrayList<String>(chars.length * 2);// 创建数组,将数字填入单位对应的位置
for (int pos = chars.length - 1; pos >= 0; pos--) {// 从低位向高位循环
char ch = chars[pos];
String cnChar = CN_CHARS[ch - '0'];// ascii2int 汉字
int unitPos = chars.length - pos - 1;// 对应的单位坐标
String cnUnit = CN_UNITS[unitPos];// 单位
boolean isZero = (ch == '0');// 是否为0
boolean isZeroLow = (pos + 1 < chars.length && chars[pos + 1] == '0');// 是否低位为0 boolean isUnitStep = (unitPos >= UNIT_STEP && (unitPos % UNIT_STEP == 0));// 当前位是否需要单位进位 if (isUnitStep && isLastUnitStep) {// 去除相邻的上一个单位进位
int size = cnchars.size();
cnchars.remove(size - 1);
if (!CN_CHARS[0].equals(cnchars.get(size - 2))) {// 补0
cnchars.add(CN_CHARS[0]);
}
} if (isUnitStep || !isZero) {// 单位进位(万、亿),或者非0时加上单位
cnchars.add(cnUnit);
isLastUnitStep = isUnitStep;
}
if (isZero && (isZeroLow || isUnitStep)) {// 当前位为0低位为0,或者当前位为0并且为单位进位时进行省略
continue;
}
cnchars.add(cnChar);
isLastUnitStep = false;
} Collections.reverse(cnchars);
// 清除最后一位的0
int chSize = cnchars.size();
String chEnd = cnchars.get(chSize - 1);
if (CN_CHARS[0].equals(chEnd) || CN_UNITS[0].equals(chEnd)) {
cnchars.remove(chSize - 1);
} // 口语化处理
if (isColloquial) {
String chFirst = cnchars.get(0);
String chSecond = cnchars.get(1);
if (chFirst.equals(CN_CHARS[1]) && chSecond.startsWith(CN_UNITS[1])) {// 是否以'一'开头,紧跟'十'
cnchars.remove(0);
}
}
return cnchars.toArray(new String[] {});
} public static void main(String[] args) {
test_5 temp = new test_5();
String i ="40.3";
int t = 2234;
double j = 221.23;
System.out.println(temp.cvt(i,true));//四十点三
System.out.println(temp.cvt(t,true));//二千二百三十四
System.out.println(temp.cvt(""+j,true));//二百二十一点二三
} }

Java实现数字大写转换的更多相关文章

  1. Java版 数字金额大写转换

    需求:读入一个浮点数值,将其转化为中文金额的大写形式.如123.45,转化为:壹佰贰拾叁元肆角伍分. 以下是各种情况要完善: 1. 当金额为整数,只表示整数部分,省略小数部分,并添加“整”字.如123 ...

  2. Kettle-User Defined Java Class使用-大写转换

    一.大写转换 (1)步骤(表输入-Java脚本-表输出) (2)配置 1)表输入 2)java脚本 public boolean processRow(StepMetaInterface smi, S ...

  3. js完美转换阿拉伯数字为数字大写(原创)

    啥都不说,直接上代码: //阿拉伯数字转换为简写汉字 function Arabia_To_SimplifiedChinese(Num) { for (i = Num.length - 1; i &g ...

  4. java实现数字转中文大写

    package cn.aikang.ChineseC; import java.util.Scanner; /** * @Description: TODO(这里用一句话描述这个类的作用) * @Au ...

  5. C#小写数字金额转换成大写人民币金额的算法

    C#小写数字金额转换成大写人民币金额的算法 第一种方法: using System.Text.RegularExpressions;//首先引入命名空间 private string DaXie(st ...

  6. JS把数字金额转换成中文大写数字的函数

    //把数字金额转换成中文大写数字的函数 function num2rmb ($num){ $c1="零壹贰叁肆伍陆柒捌玖"; $c2="分角元拾佰仟万拾佰仟亿" ...

  7. JAVA基本数据类型及其转换

    Java语言是一种强类型语言.这意味着每个变量都必须有一个声明好的类型.Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型.Java另外还提供大数字对 ...

  8. PHP算法--将数字金额转换成大写金额

    最近在看一些PHP算法题,遇到一个将数字金额转换成大写金额的小算法题,这里贴出自己的一个例子. 注:这个小算法适用于10万以内的金额. <?php //$num = 12345.67; func ...

  9. Java实现人民币大写精讲

    想要实现人民币大写,在发票等场景中使用?? 1234.56显示为:壹仟贰佰叁拾肆元伍角陆分,那就往下看看吧! 本程序可以实现 0 到 9999 9999 9999.994 以内的人民币大写转换,精确到 ...

随机推荐

  1. 携程的 Dubbo 之路

    本篇文章整理自董艺荃在 Dubbo 社区开发者日上海站的演讲. 缘起 携程当初为什么要引入 Dubbo 呢?实际上从 2013 年底起,携程内主要使用的就是基于 HTTP 协议的 SOA 微服务框架. ...

  2. STM32硬件错误HardFault_Handler的处理方法

    https://blog.csdn.net/electrocrazy/article/details/78173558

  3. python相关软件安装流程图解——linux 安装python3——Python-3.7.1

    请先确保已经安装了虚拟机 python相关软件安装流程图解——虚拟机安装——CentOS-7-x86_64-DVD-1810——CentOS-01下载 https://www.cnblogs.com/ ...

  4. 20175323《Java程序设计》第二周学习总结

    一.教材学习内容总结 标识符第一个字符不能是数字且区分大小写数据类型转换时只允许把精度低的给精度高的,否则必须强制转换输入数据语法 Scanner reader = new Scanner(Syste ...

  5. error C2220: warning treated as error - no object file generated的处理方法

    WDK/DDK中掉 error C2220: warning treated as error - no 'object' file generated 2009-04-01 15:54 网上搜索而来 ...

  6. VS2010-MFC(菜单:菜单及CMenu类的使用)

    转自:http://www.jizhuomi.com/software/212.html 上一节讲的是VS2010的菜单资源,本节主要讲菜单及CMenu类的使用. CMenu类的主要成员函数 MFC为 ...

  7. HttpURLConnection与HttpClient浅析AAAA

    . GET请求与POST请求 HTTP协议是现在Internet上使用得最多.最重要的协议了,越来越多的Java应用程序需要直接通过HTTP协议来访问网络资源. 在介绍HttpURLConnectio ...

  8. map 与 lambda 的用法

    # 列表中的每个元素进行*2lis = [10, 30, 70]f = map(lambda li: li*2, lis) # 操作lis中的每个元素.print(list(f)) # 返回来一个新的 ...

  9. 关于vlfeat做vlad编码问题

    这里是官方文档,可以自己查看 在这里,只是想记录一下,我这几天学习vlfeat 做vlad编码的过程,便于以后整理 网上涉及到vlfeat做vlad编码资料较少,而官网上例子又相对简单,主要是那几个参 ...

  10. 【转载】Kafka介绍及升级经验分享

    http://blog.talkingdata.net/?p=3165 背景 当时的现状:开始使用Kafka的时候,使用的版本是0.7.2,当时的目的是为了替代kestrel,主要是使用Kafka来做 ...