Java常用数字工具类 数字转汉字(1)

本人是从事互联网金融行业的,所以会接触到一些金融类的问题,常见的一种就是数字转汉字大小写的问题。所以抽空就写了一个小小的工具类,实现了数字转汉字、大数相加、相减、相乘的工具类,希望能帮助有需求的同行们。本篇就分享一下数字转化为汉字的思路吧。

数字转汉字的原理:

  • 拆分:由于整数部分要加权值,而小数部分直接转换即可,所以首先要将数字拆分成整数+小数;
  • 整数处理:按照我们的中国人的习惯,把数字格式化成4位一组,不足4位前面补0。每次处理4位,按位匹配数组中的汉字+权值。即按照数值找数字数组(num_lower 、num_upper )中对应位置的汉字,按照在4位中的偏移量在单位权值数组(unit_lower 、unit_upper )中找。比如21,转化4位为0021,前面的0不用管,2对应数字“二”,权值是“十”,1对应数字“一”,权值是“(个)”用空字符串代替。即得到“二十一”。每4位处理完后,还要整体对应一个权值,比如“万、亿、兆”等;
  • 小数处理:小数部分直接按位对应汉字数组和权值即可。

废话了这么多,可能云里雾里的,看看具体代码吧:

//num 表示数字,lower表示小写,upper表示大写
private static final String[] num_lower = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
private static final String[] num_upper = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; 

//unit 表示单位权值,lower表示小写,upper表示大写
private static final String[] unit_lower = { "", "十", "百", "千" };
private static final String[] unit_upper = { "", "拾", "佰", "仟"};
private static final String[] unit_common = {"","万", "亿","兆","京","垓","秭","穰","沟","涧","正","载"}; 

//允许的格式
private static final List<String> promissTypes = Arrays.asList("INTEGER","INT","LONG","DECIMAL","FLOAT","DOUBLE","STRING","BYTE","TYPE","SHORT"); 

/**
 * 数字转化为小写的汉字
 *
 * @param num 将要转化的数字
 * @return
 */
public static String toChineseLower(Object num){
 return format(num, num_lower, unit_lower);
} 

/**
 * 数字转化为大写的汉字
 *
 * @param num 将要转化的数字
 * @return
 */
public static String toChineseUpper(Object num){
 return format(num, num_upper, unit_upper);
} 

/**
 * 格式化数字
 *
 * @param num 原数字
 * @param numArray 数字大小写数组
 * @param unit 单位权值
 * @return
 */
private static String format(Object num,String[] numArray,String[] unit){
 if(!promissTypes.contains(num.getClass().getSimpleName().toUpperCase())){
 throw new RuntimeException("不支持的格式类型");
 }
 //获取整数部分
 String intnum = getInt(String.valueOf(num));
 //获取小数部分
 String decimal = getFraction(String.valueOf(num));
 //格式化整数部分
 String result = formatIntPart(intnum,numArray,unit);
 if(!"".equals(decimal)){//小数部分不为空
 //格式化小数
 result += "点"+formatFractionalPart(decimal, numArray);
 }
 return result;
} 

/**
 * 格式化整数部分
 *
 * @param num 整数部分
 * @param numArray 数字大小写数组
 * @return
 */
private static String formatIntPart(String num,String[] numArray,String[] unit){ 

 //按4位分割成不同的组(不足四位的前面补0)
 Integer[] intnums = split2IntArray(num); 

 boolean zero = false;
 StringBuffer sb = new StringBuffer();
 for(int i=0;i<intnums.length;i++){
 //格式化当前4位
 String r = formatInt(intnums[i], numArray,unit);
 if("".equals(r)){//
 if((i+1)==intnums.length){
 sb.append(numArray[0]);//结果中追加“零”
 }else{
 zero=true;
 }
 }else{//当前4位格式化结果不为空(即不为0)
 if(zero || (i>0 && intnums[i]<1000)){//如果前4位为0,当前4位不为0
 sb.append(numArray[0]);//结果中追加“零”
 }
 sb.append(r);
 sb.append(unit_common[intnums.length-1-i]);//在结果中添加权值
 zero=false;
 }
 }
 return sb.toString();
} 

/**
 * 格式化小数部分
 *
 * @param decimal 小数部分
 * @param numArray 数字大小写数组
 * @return
 */
private static String formatFractionalPart(String decimal,String[] numArray) {
 char[] val = String.valueOf(decimal).toCharArray();
 int len = val.length;
 StringBuilder sb = new StringBuilder();
 for (int i = 0; i < len; i++) {
 int n = Integer.valueOf(val[i] + "");
 sb.append(numArray[n]);
 }
 return sb.toString();
}

拆分整数和小数的方法在这里:

/**
 * 获取整数部分
 *
 * @param num
 * @return
 */
private static String getInt(String num){
 //检查格式
 checkNum(num); 

 char[] val = String.valueOf(num).toCharArray();
 StringBuffer sb = new StringBuffer();
 int t , s = 0;
 for (int i = 0; i < val.length; i++) {
 if(val[i]=='.') {
 break;
 }
 t = Integer.parseInt(val[i]+"",16);
 if(s+t==0){
 continue;
 }
 sb.append(t);
 s+=t;
 }
 return (sb.length()==0? "0":sb.toString());
} 

/**
 * 获取小数部分
 *
 * @param num
 * @return
 */
private static String getFraction(String num){
 int i = num.lastIndexOf(".");
 if(num.indexOf(".") != i){
 throw new RuntimeException("数字格式不正确,最多只能有一位小数点!");
 }
 String fraction ="";
 if(i>=0){
 fraction = getInt(new StringBuffer(num).reverse().toString());
 if(fraction.equals("0")){
 return "";
 }
 }
 return new StringBuffer(fraction).reverse().toString();
} 

/**
 * 检查数字格式
 *
 * @param num
 */
private static void checkNum(String num) {
 if(num.indexOf(".") != num.lastIndexOf(".")){
 throw new RuntimeException("数字["+num+"]格式不正确!");
 }
 if(num.indexOf("-") != num.lastIndexOf("-") || num.lastIndexOf("-")>0){
 throw new RuntimeException("数字["+num+"]格式不正确!");
 }
 if(num.indexOf("+") != num.lastIndexOf("+")){
 throw new RuntimeException("数字["+num+"]格式不正确!");
 }
 if(num.indexOf("+") != num.lastIndexOf("+")){
 throw new RuntimeException("数字["+num+"]格式不正确!");
 }
 if(num.replaceAll("[\\d|\\.|\\-|\\+]", "").length()>0){
 throw new RuntimeException("数字["+num+"]格式不正确!");
 }
}

通过这种分而治之的思路,处理起来就简单多了。写个main函数调用一下:

public static void main(String[] args) {
 short s = 10;
 byte b=10;
 char c='A';
 Object[] nums = {s, b, c, 0, 1001, 100100001L, 21., 205.23F, 205.23D, "01000010", "1000000100105.0123", ".142", "20.00", "1..2", true};
 System.out.println("将任意数字转化为汉字(包括整数、小数以及各种类型的数字)");
 System.out.println("--------------------------------------------");
 for(Object num :nums){
 try{
 System.out.print("["+num.getClass().getSimpleName()+"]"+num);
 for(int i=0;i<25-String.valueOf(num+num.getClass().getSimpleName()).length();i+=4){
 System.out.print("\t");
 }
 //调用转化为小写和大写
 System.out.print(" format:"+toChineseLower(num));
 System.out.println("【"+toChineseUpper(num)+"】");
 }catch(Exception e){
 System.out.println(" 错误信息:"+e.getMessage());
 }
 }
} 

看看结果吧:

从上述代码和运行结果中,我们可以看到该功能支持多种数据类型的转换、支持转化为一般汉字和财务专用大写汉字。还可以智能处理非正常逻辑的数字。比如“20”会转化为“二十”而非“二十零”;“1 0000 0001” 转换成“一亿零一”而非“一亿零万零一”。

这里只分享了一个转换汉字的功能,下篇将分享一下大数相乘、相加、相减的方法。支持小数和负数的运算,敬请期待。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java获取汉字拼音的全拼和首拼实现代码分享

    import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; /** * 将汉字转化为全拼 */ public class CnToSpell1 { private static Map<String, Integer> spellMap = null; //存放生僻字和其拼音的Map private static Map<Cha

  • java中把汉字转换成简拼的实现代码

    复制代码 代码如下: public static void main(String[] args) {  String str = null;  str = "顾亮";  System.out.println("Spell=" + toJP(str)); } public static String toJP(String c){ char[] chars = c.toCharArray(); StringBuffer sb = new StringBuffer(&

  • java实现的汉字转五笔功能实例

    本文实例讲述了java实现的汉字转五笔功能.分享给大家供大家参考,具体如下: package com.core.utils; /** * 汉字转五笔 * @author Jacker * @date 2010-12-12 */ public class CnToWB { private static String[] WB = new String[] { "A鞴鞲鞣鞫鞯鞔鞒鞑鞅靼銎跫綦翳蛩颟鹳鹋鸫鸢慝觐觋贳瓯戡檠迓甙忒弋撖摁廾蘼蘖蘩蘅蘧藿藜藁藓薰薷薹薅薜薮蕹薏薇薨薤蕻蕲蕃瞢蕺蕞蕤蕨蕈蕙蓼蓿蔻蕖

  • Java实现将汉字转化为汉语拼音的方法

    本文实例讲述了Java实现将汉字转化为汉语拼音的方法.分享给大家供大家参考,具体如下: 网上乱转,偶然看到一个很有意思的小工具,名字叫pinyin4j,可以把汉字转换为汉语拼音,利用他的话再配合上lucene.中文分词就可以做出类似google那种输入汉语拼音进行全文检索的功能了.实现的代码如下 package pinyin4j; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.forma

  • Java 按照字节来截取字符串的代码(不会出现半个汉字)

    复制代码 代码如下: /* *    Copyright 2012-2013 The Haohui Network Corporation */package com.haohui.common.utils; /** * <pre> * 字符串辅助工具 * </pre> *  * @project baidamei * @author cevencheng <cevencheng@gmail.com> * @create 2012-11-30 下午2:42:56 */p

  • java中将汉字转换成拼音的实现代码

    一:演示:       如在控制台输入:北京欢迎你 打印出来的拼音:bei jing huan ying ni 二:导入要依赖的jar: 汉字转换拼音jar下载 三:代码编写 复制代码 代码如下: public static String getPinYin(String src) {         char[] t1 = null;         t1 = src.toCharArray();          // System.out.println(t1.length);      

  • java中实现汉字按照拼音排序(示例代码)

    最近項目中需要對繁體字按拼音進行排序 复制代码 代码如下: public static void main(String[] args) { Comparator cmp = Collator.getInstance(java.util.Locale.CHINA); String[] arr = { "张三", "李四", "王五", "刘六" ,"周濤","戴笠","戴阿&q

  • Java中汉字转拼音pinyin4j用法实例分析

    本文实例讲述了Java中汉字转拼音pinyin4j用法.分享给大家供大家参考,具体如下: 汉字转换拼音在日常开发中是个很常见的问题.例如我们伟大的12306,在地名中输入"WH",就会出现"武汉""芜湖""威海"等地名,输入"WUHU"就会出现"芜湖". Java获取汉字的拼音,pinyin4j这个库可以很好的解决这个问题. 下载地址:http://sourceforge.net/pro

  • java实现汉字转unicode与汉字转16进制实例

    本文实例讲述了java实现汉字转unicode与汉字转16进制的实现方法.分享给大家供大家参考.具体实现方法如下: 一.汉字转unicode 复制代码 代码如下: public static String toUnicode(String s) {         String as[] = new String[s.length()];         String s1 = "";         for (int i = 0; i < s.length(); i++)   

  • java中url汉字编码互相转换实例

    Java代码如下: 复制代码 代码如下: package com.gjob.common;public class URLtoUTF8 {    //转换为%E4%BD%A0形式    public static String toUtf8String(String s) {        StringBuffer sb = new StringBuffer();        for (int i = 0; i < s.length(); i++) {            char c =

  • Java实现验证码具体代码(图片、汉字)

    本文为大家分享两个实例,相信大家一定会喜欢. 实例1:随机生成验证码图片并将之输出为一个png文件 效果图: import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.Random; import javax.

  • JAVA 中实现整句汉字拆分、转换为ASCII实例详解

    JAVA 中实现整句汉字拆分.转换为ASCII实例详解 大家都知道,一个汉字等于两个byte的大小.二进制数据通过网络传输时,如果两个byte都超过128则会合并成一个Unicode(汉字)字符,本文的代码主要实现的功能是:把这些汉字拆分为byte,然后重新变为ASCII类型的字符串. public static String ChineseToASCII(byte[] rec) { //从字节读取内容 ByteArrayInputStream bais = new ByteArrayInput

随机推荐