1. 程式人生 > >數字格式化 金額格式化 解決格式化丟失精度問題

數字格式化 金額格式化 解決格式化丟失精度問題

數字格式化工具
金額格式化工具
使用到的類 BigDecimal、DecimalFormat、StringUtils

  1. 解決在 java6 中,使用 DecimalFormat 格式化超過13位數字丟失精度問題(在 java8 中沒有發現丟失精度問題)。
  2. 引數支援科學計數法。
  3. 可以自定義保留小數個數,整數位以逗號分隔。
  4. 下面是我寫的一個工具類,直接拿來使用即可。
package com.jin.demo.numberFormat;

import org.apache.commons.lang3.StringUtils;

import
java.math.BigDecimal; import java.text.DecimalFormat; /** * 金額格式化工具,不支援負數 * @date 2018-10-13 09:49 */ public class NumberUtils { /** * 金額格式化,沒有長度限制 * @param number 金額 * @param len 保留小數位 * @return 以逗號分隔 */ public static String bigAmountFormat(String number, int len)
{ // 判空 if (StringUtils.isBlank(number)) { return ""; } // 科學計數法顯示出全部數字 String num = (new BigDecimal(number)).toPlainString(); // 切割 String[] sp = num.split("\\."); String prefix = sp[0]; //整數部分 String suffix = ""; //小數部分 // 處理小數部分
String[] sp2 = null; String temp = "0"; if (sp.length > 1) { temp += "." + sp[1]; } String s = amountFormat(temp, len); sp2 = s.split("\\."); if (sp2 != null && sp2.length > 1) { suffix = "." + sp2[1]; } if (sp2 != null && "1".equals(sp2[0])) { prefix = (new BigDecimal(prefix)).add(new BigDecimal(1)).toString(); } // 處理整數部分 char[] chars = (new StringBuffer(prefix)).reverse().toString().toCharArray(); temp = ""; for (int i = 0; i < chars.length; i++) { if (i % 3 == 0 && i != 0) { temp += ","; } temp += chars[i]; } prefix = (new StringBuffer(temp)).reverse().toString(); return prefix + suffix; } /** * 金額格式化,整數位長度小於13位,如果大於13位,結果可能失精 * @param number 金額 * @param len 保留小數位 * @return 以逗號分隔 */ public static String amountFormat(String number, int len) { // 判空 if (StringUtils.isBlank(number)) { return ""; } StringBuilder sb = new StringBuilder(); // 判小數位 if (len > 0) { sb.append("."); for (int i = 0; i < len; i++) { sb.append("0"); } } // 模板 String format = "###,###,###,###,##0" + sb.toString(); DecimalFormat df = new DecimalFormat(format); try { return df.format(new BigDecimal(number)); } catch (Exception e) { e.printStackTrace(); return ""; } } /** * 測試方法 * @param args */ public static void main(String[] args) { System.out.println(bigAmountFormat("1.03219E+14", 2)); // 103,219,000,000,000.00 System.out.println(bigAmountFormat("9999999999999999.99", 2)); // 9,999,999,999,999,999.99 System.out.println(bigAmountFormat("0.1", 0)); // 0 System.out.println(bigAmountFormat("0.8", 0)); // 1 System.out.println("============"); System.out.println(amountFormat("9999999999999.99", 2)); // 9,999,999,999,999.99 System.out.println(amountFormat("0.397", 0)); // 0 System.out.println(amountFormat("1.03219E14", 2)); // 103,219,000,000,000.00 } }