本人是從事互聯(lián)網(wǎng)金融行業(yè)的,所以會(huì)接觸到一些金融類的問題,常見的一種就是數(shù)字轉(zhuǎn)漢字大小寫的問題。所以抽空就寫了一個(gè)小小的工具類,實(shí)現(xiàn)了數(shù)字轉(zhuǎn)漢字、大數(shù)相加、相減、相乘的工具類,希望能幫助有需求的同行們。本篇就分享一下數(shù)字轉(zhuǎn)化為漢字的思路吧。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供烏拉特前網(wǎng)站建設(shè)、烏拉特前做網(wǎng)站、烏拉特前網(wǎng)站設(shè)計(jì)、烏拉特前網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、烏拉特前企業(yè)網(wǎng)站模板建站服務(wù),十載烏拉特前做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
數(shù)字轉(zhuǎ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 = {"","萬", "億","兆","京","垓","秭","穰","溝","澗","正","載"};
//允許的格式
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+"]格式不正確!");
}
}通過這種分而治之的思路,處理起來就簡(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)換成“一億零一”而非“一億零萬零一”。
這里只分享了一個(gè)轉(zhuǎn)換漢字的功能,下篇將分享一下大數(shù)相乘、相加、相減的方法。支持小數(shù)和負(fù)數(shù)的運(yùn)算,敬請(qǐng)期待。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
網(wǎng)站題目:Java常用數(shù)字工具類數(shù)字轉(zhuǎn)漢字(1)
標(biāo)題網(wǎng)址:http://chinadenli.net/article2/isgeoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、網(wǎng)站建設(shè)、建站公司、軟件開發(fā)、云服務(wù)器、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)