public class NumberHelper { private static Log logger = LogFactory.getLog(NumberHelper.class); /** * 将源数字格式化为指定的长度,不足的位数在前面补零,如果长度小于源数字的长度返回原始数字 * 适用于在产生指定长度的流水号时使用 * * @param source * @return */ public static String number2char(int source, int length) { try{ String module = new String(); for (int i=0; i<length; i++){ module += "0"; } DecimalFormat format = new DecimalFormat(module); return format.format(source); } catch (Exception e){ logger.error("源数字或指定长度非法", e); e.printStackTrace(); return null; } } /** * 将百分比格式化为数字表示,默认使用四舍五入的算法不舍去小数位数 * * @param source 百分比格式的数字 * @return */ public static Double percent2number(double source){ try{ BigDecimal big = new BigDecimal(source); return big.divide(new BigDecimal(100)).doubleValue(); } catch (Exception e){ logger.error("将百分比格式化为数字表示出现错误", e); e.printStackTrace(); return null; } } /** * 将百分比格式化为数字表示,默认使用四舍五入的算法并保留指定位数的小数 * * @param source 百分比格式的数字 * @param length 小数位数 * @return */ public static double percent2number(double source, int length){ try{ BigDecimal big = new BigDecimal(source); return big.divide(new BigDecimal(100), length, RoundingMode.HALF_UP).doubleValue(); } catch (Exception e){ logger.error("将百分比格式化为数字表示出现错误", e); e.printStackTrace(); return 0; } } /** * 将两个数字相除并返回百分格式 * * @param dividend 被除数 * @param divisor 除数 * @return 带%号的字符串 */ public static String divide2Percent(int dividend, int divisor){ return number2percent(divide(dividend, divisor)); } /** * 将数字格式化为百分比表示 * * @param source * @return */ public static String number2percent(double source){ try{ DecimalFormat format = new DecimalFormat("#.##%"); return format.format(source); } catch (Exception e){ logger.error("将数字格式化为百分比表示出现错误", e); e.printStackTrace(); return null; } } /** * 两个整数相除保留两位小数 * * @param dividend 被除数 * @param divisor 除数 * @return */ public static Double divide(int dividend, int divisor){ return divide(dividend, divisor, 2); } /** * 两个整数相除保留指定位数的小数 * * @param dividend 被除数 * @param divisor 除数 * @param length 保留小数位数的长度 * @return */ public static Double divide(int dividend, int divisor, int length){ try{ if (dividend == 0){ return 0D; } BigDecimal big = new BigDecimal(divisor); double d = big.divide(new BigDecimal(dividend), length, RoundingMode.HALF_UP).doubleValue(); return d; } catch (Exception e){ logger.error("数字相除发生错误", e); e.printStackTrace(); return null; } } /** * 将double数据保留指定位数的小数 * @param length 保留小数位数的长度 * @return */ public static Double divide(double source, int length){ try{ if (source == 0){ return 0D; } BigDecimal big = new BigDecimal(source); double d = big.setScale(length, RoundingMode.HALF_UP).doubleValue(); return d; } catch (Exception e){ logger.error("保留指定位数的小数发生错误", e); e.printStackTrace(); return null; } } /** * 将double数据保留指定位数的小数 * @param length 保留小数位数的长度,小数位数不够,以0补全。 * 支持科学计算法 * @return */ public static String divideToString(double source, int length){ BigDecimal big = new BigDecimal(source); return big.setScale(length, RoundingMode.HALF_UP).toString(); } /** * 将String数据保留指定位数的小数 * @param length 保留小数位数的长度,小数位数不够,以0补全。 * 支持科学计算法 * @return */ public static String divideToString(String source, int length){ BigDecimal big = new BigDecimal(source); return big.setScale(length, RoundingMode.HALF_UP).toString(); } public static void main(String[] args){ System.out.print(divideToString("1.23E4",5)); } }