日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数字工具类

發布時間:2024/3/13 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数字工具类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package com.arronlong.common.util.num;import java.util.Arrays; import java.util.List;/*** 數字轉漢字工具類* * @author hubi* @date 2095年17月21日 下午29:14:16 * @version 1.0*/ public class NumUtils {//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");//標記為小數點private static final int DOT=-99;//標記為無效數字private static final int INVALID=-100;/*** 數字轉化為小寫的漢字* * @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 a 第一個數* @param b 第二個數* @return 最終結果*/public static String add(String a, String b){//檢查數字格式checkNum(a);checkNum(b);//標記最終結果是否為負值boolean minus=false;//判斷是否有帶著-號if(a.startsWith("-") || b.startsWith("-")){//判斷是否全帶著-號if(a.startsWith("-") && b.startsWith("-")){//2個都帶著-號,結果肯定為負值minus=true;if(a.startsWith("-")){a = a.substring(1);}if(b.startsWith("-")){b = b.substring(1);}}else{//如果只有一個是負值,則調用減法來完成操作if(a.startsWith("-")){//a是負數a = a.substring(1);return subduct(b, a);}else{b = b.substring(1);return subduct(a, b);}}}//獲取a,b的整數和小數部分String a_int = getInt(a);String a_fraction = getFraction(a);String b_int = getInt(b);String b_fraction = getFraction(b);//計算小數部分最大長度int len_fraction = Math.max(a_fraction.length(), b_fraction.length());//計算整數部分最大長度int len_int = Math.max(a_int.length(), b_int.length())+1;//a,b兩個數整數最大長度和小數最大長度之和+小數點(1位)int len = len_fraction + len_int+1;//創建結果數組int[] result = new int[len];//默認全為0//為了方便計算,去掉小數點(最后在結果中加上小數點)//將【整數部分】高低位對調(反轉是為了低位對齊),最終轉化為char數組//小數部分不用調整char[] s_a_int = reverseStr(a_int);char[] s_b_int = reverseStr(b_int);char[] s_a_fraction = a_fraction.toCharArray();char[] s_b_fraction = b_fraction.toCharArray();//采用整數+整數,小數+小數的方式運算add(s_a_int, s_b_int, len_fraction, result);add(s_a_fraction, s_b_fraction, 1-len_fraction, result);// 處理結果集合,如果是大于10的就向前一位進位,本身進行除10取余accumulateResultArrays(result);//標記小數點位置markDot(len_fraction, result);//切掉無用的0cutUnusedZero(len_fraction, result);//然后將數據反轉return (minus ? "-" : "")+reverseResult(result);}/*** 大數減法* * @param a 第一個數* @param b 第二個數* @return 最終結果*/public static String subduct(String a, String b){//檢查數字格式checkNum(a);checkNum(b);//標記最終結果是否為負值boolean minus=false;//判斷是否有帶著-號if(a.startsWith("-") || b.startsWith("-")){//判斷是否全帶著-號if(a.startsWith("-") && b.startsWith("-")){//2個都帶著-號if(a.startsWith("-")){a = a.substring(1);}if(b.startsWith("-")){b = b.substring(1);}return subduct(b, a);}else{//如果只有一個是負值,則調用加法來完成操作if(a.startsWith("-")){//a是負值,b是非負值return add(a, "-"+b);//2個負值的加法運算}else{//b是負值b = b.substring(1);return add(a, b);//2個正值的加法運算}}}//獲取a,b的整數和小數部分String a_int = getInt(a);String a_fraction = getFraction(a);String b_int = getInt(b);String b_fraction = getFraction(b);boolean isSame = false;//判斷大小if(b_int.length()>a_int.length()){//如果b>areturn "-"+subduct(b, a);}else if(b_int.length()==a_int.length()){char[] s_a = a_int.toCharArray();char[] s_b = b_int.toCharArray();for (int i = 0; i < s_a.length; i++) {if(s_b[i]>s_a[i]){minus=true;isSame=false;break;}else if(s_b[i]<s_a[i]){isSame=false;break;}else{isSame = true;}}if(isSame){//整數部分全部相同,對比小數部分s_a = a_fraction.toCharArray();s_b = b_fraction.toCharArray();for (int i = 0; i < Math.min(s_a.length, s_b.length); i++) {if(s_b[i]>s_a[i]){minus=true;isSame=false;break;}else if(s_b[i]<s_a[i]){isSame=false;break;}else{isSame = true;}}if(isSame){//前部分全相同if(s_b.length>s_a.length){//前部分全相同,b小數位數多,則 b>areturn "-"+subduct(b, a);}else if(s_b.length == s_a.length){return "0";}}else if(minus){//如果b>areturn "-"+subduct(b, a);}}}//計算小數部分最大長度int len_fraction = Math.max(a_fraction.length(), b_fraction.length());//計算整數部分最大長度int len_int = Math.max(a_int.length(), b_int.length());//a,b兩個數整數最大長度和小數最大長度之和+小數點(1位)int len = len_fraction + len_int+1;//創建結果數組int[] result = new int[len];//默認全為0//為了方便計算,去掉小數點(最后在結果中加上小數點)//將【整數部分】高低位對調(反轉是為了低位對齊),最終轉化為char數組//小數部分不用調整char[] s_a_int = reverseStr(a_int);char[] s_b_int = reverseStr(b_int);char[] s_a_fraction = a_fraction.toCharArray();char[] s_b_fraction = b_fraction.toCharArray();//采用整數+整數,小數+小數的方式運算subduct(s_a_int, s_b_int, len_fraction, result);subduct(s_a_fraction, s_b_fraction, 1-len_fraction, result);// 處理結果集合,如果是大于10的就向前一位進位,本身進行除10取余subductResultArrays(result);//標記小數點位置markDot(len_fraction, result);//切掉無用的0cutUnusedZero(len_fraction, result);//然后將數據反轉return (minus ? "-" : "")+reverseResult(result);}/*** 大數乘法* * @param a 第一個數* @param b 第二個數* @return 最終結果*/public static String multiply(String a, String b){//檢查數字格式checkNum(a);checkNum(b);//標記最終結果是否為負值boolean minus=false;//判斷是否有帶著-號if(a.startsWith("-") || b.startsWith("-")){//判斷是否全帶著-號if(a.startsWith("-") && b.startsWith("-")){}else{//只有1個帶著-號,則結果為負值minus=true;}if(a.startsWith("-")){a = a.substring(1);}if(b.startsWith("-")){b = b.substring(1);}}//獲取a,b的整數和小數部分String a_int = getInt(a);String a_fraction = getFraction(a);String b_int = getInt(b);String b_fraction = getFraction(b);//計算小數部分的總長度int len_fraction = a_fraction.length() +b_fraction.length() ;//a,b兩個數乘積的最大位數不會超過總位數之和+小數點(1位)int len = len_fraction +a_int.length()+b_int.length()+1;//創建結果數組int[] result = new int[len];//默認全為0//為了方便計算,去掉小數點(最后在結果中加上小數點)//并將高低位對調(反轉是為了低位對齊),最終轉化為char數組char[] s_a_int = reverseStr(a_int);char[] s_a_fraction = reverseStr(a_fraction);char[] s_b_int = reverseStr(b_int);char[] s_b_fraction = reverseStr(b_fraction);//將a、b都拆分成整數+小數,然后//采用(x1+x2)(y1+y2)=x1y1+x1y2+x2y1+x2y2公式,分別計算乘積multiply(s_a_int, s_b_int, len_fraction, result);multiply(s_a_int, s_b_fraction, (len_fraction-s_b_fraction.length), result);multiply(s_b_int, s_a_fraction, (len_fraction-s_a_fraction.length), result);multiply(s_a_fraction, s_b_fraction, 0, result);// 處理結果集合,如果是大于10的就向前一位進位,本身進行除10取余accumulateResultArrays(result);//標記小數點位置markDot(len_fraction, result);//切掉無用的0cutUnusedZero(len_fraction, result);//然后將數據反轉return (minus?"-":"") + reverseResult(result);}/*** 反轉字符串,并轉化為數組* * @param s 原字符串* @return*/private static char[] reverseStr(String s) {return new StringBuffer(s).reverse().toString().toCharArray();}/*** 累加每一位,超過10則然后進位* * @param result 結果數組*/private static void accumulateResultArrays(int[] result) {for (int i = 0; i < result.length; i++) {if (result[i] >= 10) {result[i + 1] += result[i] / 10;result[i] %= 10;}}}/*** 檢查每一位,小于0(不含標記的小數點未和無效的0)則然后向高位借位。* * @param result 結果數組*/private static void subductResultArrays(int[] result) {for (int i = 0; i < result.length-1; i++) {if (result[i] < 0 && result[i]>DOT) {result[i + 1]--;result[i] += 10;}}}/*** 去掉不必要的0(包括整數最前面的和小數最后面的0)* * @param len_fraction 小數長度* @param result 結果數組*/private static void cutUnusedZero(int len_fraction, int[] result) {//去掉小數部分不必要的0boolean flag_0_fraction = true;//標記一直是0for (int i =0; i< len_fraction; i++) {if(flag_0_fraction && result[i]==0){result[i]=INVALID;//為0時標記為無效}else{flag_0_fraction=false;break;}}//去掉整數部分的0boolean flag_0_int=true;for (int i =result.length-1; i > len_fraction || (len_fraction==0 && i==0); i--) {if(flag_0_int && result[i]==0){result[i]=INVALID;//為0時標記為無效}else{flag_0_int=false;//遇到不為0時,停止。break;}}if(flag_0_int){//整數部分全為0result[len_fraction+1]=0;if(flag_0_fraction){//同時,小數部分也全為0result[len_fraction]=INVALID;//不需要小數點了,所以置為無效}}else{//整數部分不為0if(flag_0_fraction && len_fraction>0){//小數部分全為0result[len_fraction]=INVALID;//不需要小數點了,所以置為無效}}}/*** 反轉結果,替換小數點,跳過無效的0* * @param result 結果數組* @return*/private static String reverseResult(int[] result) {//反轉StringBuffer sb = new StringBuffer();for (int i = result.length - 1; i >= 0; i--) {if(result[i]>INVALID){sb.append(result[i]==DOT ? "." : result[i]);}}return sb.toString();}/*** 標記小數點位置* * @param len_fraction 小數長度* @param result 結果數組(反轉的)*/private static void markDot(int len_fraction, int[] result) {if(len_fraction>0){//標記小數點位置for (int i = result.length-1 ; i > len_fraction; i--) {result[i] = result[i-1];}result[len_fraction]=DOT;//標記小數點位置}}/*** 計算2個數的每一位的乘積,放入到對應的結果數組中(未進位)* * @param a 第一個數* @param b 第二個數* @param start 開始放入的偏移位置* @param result 結果數組*/private static void multiply(char[] a, char[] b, int start , int[] result){// 計算結果集合for (int i = 0; i < a.length; i++) {for (int j = 0; j < b.length; j++) {result[i + j + start] += (int) (a[i] - '0') * (int) (b[j] - '0');}}}/*** 計算2個數的每一位的和,放入到對應的結果數組中(未進位)* * @param a 第一個數* @param b 第二個數* @param start 開始放入的偏移位置* @param result 結果數組*/private static void add(char[] a, char[] b, int start , int[] result){char[] c=null;//保證a是位數多的,如果b長度大于a,則交換a,bif(b.length>a.length){c=a;a=b;b=c;}// 計算結果集合,a的位數>=b的位數int i = 0, j=0;for (; i < a.length && j< b.length; i++,j++) {result[Math.abs(i + start)] += (int) (a[i] - '0') + (int) (b[j] - '0');}//如果a沒有處理完畢,直接把a剩下的值賦值給結果數組即可for (; i < a.length; i++) {result[Math.abs(i + start)] += (int) (a[i] - '0');}if(c!=null){//如果交換過,則再交換回來c=a;a=b;b=c;}c=null;}/*** 計算2個數的每一位的差,放入到對應的結果數組中(未進位)* * @param a 第一個數* @param b 第二個數* @param start 開始放入的偏移位置* @param result 結果數組*/private static void subduct(char[] a, char[] b, int start , int[] result){// 計算結果集合,a的位數>=b的位數int i = 0, j=0;for (; i < a.length && j< b.length; i++,j++) {result[Math.abs(i + start)] +=((int) (a[i] - '0') - (int) (b[j] - '0'));}//如果a沒有處理完畢,直接把a剩下的值賦值給結果數組即可for (; i < a.length; i++) {result[Math.abs(i + start)] +=((int) (a[i] - '0'));}//如果a沒有處理完畢,直接把a剩下的值賦值給結果數組即可for (; i < b.length; i++) {result[Math.abs(i + start)] +=-((int) (b[i] - '0'));}}/*** 格式化數字* * @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* @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*/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+"]格式不正確!");}}/*** 獲取小數部分* * @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();}/*** 分割數字,每4位一組* * @param num* @return*/private static Integer[] split2IntArray(String num){String prev = num.substring(0,num.length() % 4);String stuff = num.substring(num.length() % 4);if(!"".equals(prev)){num = String.format("%04d",Integer.valueOf(prev))+stuff;}Integer[] ints = new Integer[num.length()/4];int idx=0;for(int i=0;i<num.length();i+=4){String n = num.substring(i,i+4);ints[idx++]=Integer.valueOf(n);}return ints;}/*** 格式化整數部分* * @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位不為0sb.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();}/*** 格式化4位整數* * @param num* @param numArray* @return*/private static String formatInt(int num,String[] numArray,String[] unit){char[] val = String.valueOf(num).toCharArray();int len = val.length;StringBuilder sb = new StringBuilder();boolean isZero = false;for (int i = 0; i < len; i++) {int n = Integer.valueOf(val[i] + "");//獲取當前位的數值if (n==0) {isZero = true;} else {if (isZero) {sb.append(numArray[Integer.valueOf(val[i-1] + "")]);}sb.append(numArray[n]);sb.append(unit[(len - 1) - i]);isZero=false;}}return sb.toString();}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()); // } // }String a = "9213213210.4508";String b = "12323245512512100.4500081";String r = multiply(a, b);System.out.println(a+"*"+b+"="+r);String r1 = add(a, b);System.out.println(a+"+"+b+"="+r1);String r2 = subduct(a, b);System.out.println(a+"-"+b+"="+r2);} }

總結

以上是生活随笔為你收集整理的数字工具类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。