欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java常用數(shù)字工具類 數(shù)字轉(zhuǎn)漢字(1)

 更新時(shí)間:2017年05月09日 16:25:09   作者:龍軒  
這篇文章主要為大家詳細(xì)介紹了Java常用數(shù)字工具類,數(shù)字轉(zhuǎn)漢字,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本人是從事互聯(lián)網(wǎng)金融行業(yè)的,所以會(huì)接觸到一些金融類的問(wèn)題,常見(jiàn)的一種就是數(shù)字轉(zhuǎn)漢字大小寫的問(wèn)題。所以抽空就寫了一個(gè)小小的工具類,實(shí)現(xiàn)了數(shù)字轉(zhuǎn)漢字、大數(shù)相加、相減、相乘的工具類,希望能幫助有需求的同行們。本篇就分享一下數(shù)字轉(zhuǎn)化為漢字的思路吧。

數(shù)字轉(zhuǎn)漢字的原理:

  • 拆分:由于整數(shù)部分要加權(quán)值,而小數(shù)部分直接轉(zhuǎn)換即可,所以首先要將數(shù)字拆分成整數(shù)+小數(shù);
  • 整數(shù)處理:按照我們的中國(guó)人的習(xí)慣,把數(shù)字格式化成4位一組,不足4位前面補(bǔ)0。每次處理4位,按位匹配數(shù)組中的漢字+權(quán)值。即按照數(shù)值找數(shù)字?jǐn)?shù)組(num_lower 、num_upper )中對(duì)應(yīng)位置的漢字,按照在4位中的偏移量在單位權(quán)值數(shù)組(unit_lower 、unit_upper )中找。比如21,轉(zhuǎn)化4位為0021,前面的0不用管,2對(duì)應(yīng)數(shù)字“二”,權(quán)值是“十”,1對(duì)應(yīng)數(shù)字“一”,權(quán)值是“(個(gè))”用空字符串代替。即得到“二十一”。每4位處理完后,還要整體對(duì)應(yīng)一個(gè)權(quán)值,比如“萬(wàn)、億、兆”等;
  • 小數(shù)處理:小數(shù)部分直接按位對(duì)應(yīng)漢字?jǐn)?shù)組和權(quán)值即可。

廢話了這么多,可能云里霧里的,看看具體代碼吧:

//num 表示數(shù)字,lower表示小寫,upper表示大寫 
private static final String[] num_lower = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" }; 
private static final String[] num_upper = { "零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖" }; 
 
//unit 表示單位權(quán)值,lower表示小寫,upper表示大寫 
private static final String[] unit_lower = { "", "十", "百", "千" }; 
private static final String[] unit_upper = { "", "拾", "佰", "仟"}; 
private static final String[] unit_common = {"","萬(wàn)", "億","兆","京","垓","秭","穰","溝","澗","正","載"}; 
 
//允許的格式 
private static final List<String> promissTypes = Arrays.asList("INTEGER","INT","LONG","DECIMAL","FLOAT","DOUBLE","STRING","BYTE","TYPE","SHORT"); 
 
/** 
 * 數(shù)字轉(zhuǎn)化為小寫的漢字 
 * 
 * @param num 將要轉(zhuǎn)化的數(shù)字 
 * @return 
 */ 
public static String toChineseLower(Object num){ 
 return format(num, num_lower, unit_lower); 
} 
 
/** 
 * 數(shù)字轉(zhuǎn)化為大寫的漢字 
 * 
 * @param num 將要轉(zhuǎn)化的數(shù)字 
 * @return 
 */ 
public static String toChineseUpper(Object num){ 
 return format(num, num_upper, unit_upper); 
} 
 
/** 
 * 格式化數(shù)字 
 * 
 * @param num 原數(shù)字 
 * @param numArray 數(shù)字大小寫數(shù)組 
 * @param unit 單位權(quán)值 
 * @return 
 */ 
private static String format(Object num,String[] numArray,String[] unit){ 
 if(!promissTypes.contains(num.getClass().getSimpleName().toUpperCase())){ 
 throw new RuntimeException("不支持的格式類型"); 
 } 
 //獲取整數(shù)部分 
 String intnum = getInt(String.valueOf(num)); 
 //獲取小數(shù)部分 
 String decimal = getFraction(String.valueOf(num)); 
 //格式化整數(shù)部分 
 String result = formatIntPart(intnum,numArray,unit); 
 if(!"".equals(decimal)){//小數(shù)部分不為空 
 //格式化小數(shù) 
 result += "點(diǎn)"+formatFractionalPart(decimal, numArray); 
 } 
 return result; 
} 
 
/** 
 * 格式化整數(shù)部分 
 * 
 * @param num 整數(shù)部分 
 * @param numArray 數(shù)字大小寫數(shù)組 
 * @return 
 */ 
private static String formatIntPart(String num,String[] numArray,String[] unit){ 
 
 //按4位分割成不同的組(不足四位的前面補(bǔ)0) 
 Integer[] intnums = split2IntArray(num); 
 
 boolean zero = false; 
 StringBuffer sb = new StringBuffer(); 
 for(int i=0;i<intnums.length;i++){ 
 //格式化當(dāng)前4位 
 String r = formatInt(intnums[i], numArray,unit); 
 if("".equals(r)){// 
 if((i+1)==intnums.length){ 
 sb.append(numArray[0]);//結(jié)果中追加“零” 
 }else{ 
 zero=true; 
 } 
 }else{//當(dāng)前4位格式化結(jié)果不為空(即不為0) 
 if(zero || (i>0 && intnums[i]<1000)){//如果前4位為0,當(dāng)前4位不為0 
 sb.append(numArray[0]);//結(jié)果中追加“零” 
 } 
 sb.append(r); 
 sb.append(unit_common[intnums.length-1-i]);//在結(jié)果中添加權(quán)值 
 zero=false; 
 } 
 } 
 return sb.toString(); 
} 
 
/** 
 * 格式化小數(shù)部分 
 * 
 * @param decimal 小數(shù)部分 
 * @param numArray 數(shù)字大小寫數(shù)組 
 * @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(); 
} 
 

拆分整數(shù)和小數(shù)的方法在這里:

/** 
 * 獲取整數(shù)部分 
 * 
 * @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()); 
} 
 
/** 
 * 獲取小數(shù)部分 
 * 
 * @param num 
 * @return 
 */ 
private static String getFraction(String num){ 
 int i = num.lastIndexOf("."); 
 if(num.indexOf(".") != i){ 
 throw new RuntimeException("數(shù)字格式不正確,最多只能有一位小數(shù)點(diǎn)!"); 
 } 
 String fraction =""; 
 if(i>=0){ 
 fraction = getInt(new StringBuffer(num).reverse().toString()); 
 if(fraction.equals("0")){ 
 return ""; 
 } 
 } 
 return new StringBuffer(fraction).reverse().toString(); 
} 
 
/** 
 * 檢查數(shù)字格式 
 * 
 * @param num 
 */ 
private static void checkNum(String num) { 
 if(num.indexOf(".") != num.lastIndexOf(".")){ 
 throw new RuntimeException("數(shù)字["+num+"]格式不正確!"); 
 } 
 if(num.indexOf("-") != num.lastIndexOf("-") || num.lastIndexOf("-")>0){ 
 throw new RuntimeException("數(shù)字["+num+"]格式不正確!"); 
 } 
 if(num.indexOf("+") != num.lastIndexOf("+")){ 
 throw new RuntimeException("數(shù)字["+num+"]格式不正確!"); 
 } 
 if(num.indexOf("+") != num.lastIndexOf("+")){ 
 throw new RuntimeException("數(shù)字["+num+"]格式不正確!"); 
 } 
 if(num.replaceAll("[\\d|\\.|\\-|\\+]", "").length()>0){ 
 throw new RuntimeException("數(shù)字["+num+"]格式不正確!"); 
 } 
}

通過(guò)這種分而治之的思路,處理起來(lái)就簡(jiǎn)單多了。寫個(gè)main函數(shù)調(diào)用一下:

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("將任意數(shù)字轉(zhuǎn)化為漢字(包括整數(shù)、小數(shù)以及各種類型的數(shù)字)"); 
 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"); 
 } 
 //調(diào)用轉(zhuǎn)化為小寫和大寫 
 System.out.print(" format:"+toChineseLower(num)); 
 System.out.println("【"+toChineseUpper(num)+"】"); 
 }catch(Exception e){ 
 System.out.println(" 錯(cuò)誤信息:"+e.getMessage()); 
 } 
 } 
} 

看看結(jié)果吧:


從上述代碼和運(yùn)行結(jié)果中,我們可以看到該功能支持多種數(shù)據(jù)類型的轉(zhuǎn)換、支持轉(zhuǎn)化為一般漢字和財(cái)務(wù)專用大寫漢字。還可以智能處理非正常邏輯的數(shù)字。比如“20”會(huì)轉(zhuǎn)化為“二十”而非“二十零”;“1 0000 0001” 轉(zhuǎn)換成“一億零一”而非“一億零萬(wàn)零一”。

這里只分享了一個(gè)轉(zhuǎn)換漢字的功能,下篇將分享一下大數(shù)相乘、相加、相減的方法。支持小數(shù)和負(fù)數(shù)的運(yùn)算,敬請(qǐng)期待。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringMVC中參數(shù)綁定問(wèn)題實(shí)例詳解

    SpringMVC中參數(shù)綁定問(wèn)題實(shí)例詳解

    springmvc是用來(lái)處理頁(yè)面的一些請(qǐng)求,然后將數(shù)據(jù)再通過(guò)視圖返回給用戶的,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中參數(shù)綁定問(wèn)題的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • ElasticSearch學(xué)習(xí)之文檔API相關(guān)操作

    ElasticSearch學(xué)習(xí)之文檔API相關(guān)操作

    這篇文章主要為大家介紹了ElasticSearch學(xué)習(xí)之文檔API相關(guān)操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • My eclipse 端口占用(9360)問(wèn)題解決辦法

    My eclipse 端口占用(9360)問(wèn)題解決辦法

    這篇文章主要介紹了My eclipse 工程發(fā)布時(shí)出現(xiàn)端口占用問(wèn)題解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • JDBC SQL語(yǔ)法

    JDBC SQL語(yǔ)法

    結(jié)構(gòu)化查詢語(yǔ)言(SQL)是一種標(biāo)準(zhǔn)化的語(yǔ)言,它允許你在數(shù)據(jù)庫(kù)上執(zhí)行操作,如創(chuàng)建項(xiàng)目,讀取內(nèi)容,內(nèi)容更新和刪除條目
    2014-03-03
  • 多個(gè)版本JAVA切換的簡(jiǎn)單步驟記錄

    多個(gè)版本JAVA切換的簡(jiǎn)單步驟記錄

    在工作中或者學(xué)習(xí)過(guò)程中,有一些特殊情況我們需要來(lái)切換java版本來(lái)做比較,比如一些新特性等等的相關(guān)資料,這篇文章主要介紹了多個(gè)版本JAVA切換的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • 使用logback實(shí)現(xiàn)按自己的需求打印日志到自定義的文件里

    使用logback實(shí)現(xiàn)按自己的需求打印日志到自定義的文件里

    這篇文章主要介紹了使用logback實(shí)現(xiàn)按自己的需求打印日志到自定義的文件里,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • spring解決循環(huán)依賴

    spring解決循環(huán)依賴

    這篇文章主要介紹了spring如何解決循環(huán)依賴,幫助大家更好的理解和使用spring框架,感興趣的朋友可以了解下
    2020-09-09
  • 一個(gè)Java配置文件加密解密工具類分享

    一個(gè)Java配置文件加密解密工具類分享

    在 JavaEE 配置文件中,例如 XML 或者 properties 文件,由于某些敏感信息不希望普通人員看見(jiàn),則可以采用加密的方式存儲(chǔ),程序讀取后進(jìn)行解密
    2014-04-04
  • Mybatis之動(dòng)態(tài)sql標(biāo)簽的使用

    Mybatis之動(dòng)態(tài)sql標(biāo)簽的使用

    這篇文章主要介紹了Mybatis之動(dòng)態(tài)sql標(biāo)簽的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SpringBoot使用Shiro實(shí)現(xiàn)動(dòng)態(tài)加載權(quán)限詳解流程

    SpringBoot使用Shiro實(shí)現(xiàn)動(dòng)態(tài)加載權(quán)限詳解流程

    本文小編將基于?SpringBoot?集成?Shiro?實(shí)現(xiàn)動(dòng)態(tài)uri權(quán)限,由前端vue在頁(yè)面配置uri,Java后端動(dòng)態(tài)刷新權(quán)限,不用重啟項(xiàng)目,以及在頁(yè)面分配給用戶?角色?、?按鈕?、uri?權(quán)限后,后端動(dòng)態(tài)分配權(quán)限,用戶無(wú)需在頁(yè)面重新登錄才能獲取最新權(quán)限,一切權(quán)限動(dòng)態(tài)加載,靈活配置
    2022-07-07

最新評(píng)論