package com.hx.util;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.text.DecimalFormat;
|
import java.util.regex.Matcher;
|
import java.util.regex.Pattern;
|
|
/**
|
* 数字工具
|
*
|
* @author mgchen
|
*
|
*/
|
public class NumberUtil {
|
|
private static DecimalFormat fmt = new DecimalFormat("0.00");
|
|
private static DecimalFormat fmtOne = new DecimalFormat("0.0");
|
|
private static DecimalFormat fmtThree = new DecimalFormat("0.000");
|
|
/**
|
* 获取指定格式的Double 类型数据
|
* @param e
|
* 要转换的数据源
|
**/
|
public static Double getTypeDouble(Double e) {
|
fmt.setRoundingMode(RoundingMode.HALF_UP); // 保留小数点后两位并四舍五入,确保价钱准确
|
Double d = Double.valueOf(fmt.format(e));
|
return d;
|
}
|
|
/**
|
* 获取指定格式的Double 类型数据
|
*
|
* @param e
|
* 要转换的数据源
|
**/
|
public static Double getTypeDouble1(Double e) {
|
fmtOne.setRoundingMode(RoundingMode.HALF_UP); // 保留小数点后两位并四舍五入,确保价钱准确
|
Double d = Double.valueOf(fmtOne.format(e));
|
return d;
|
}
|
|
public static Double getTypeDouble2(Double e) {
|
fmtThree.setRoundingMode(RoundingMode.HALF_UP); // 保留小数点后两位并四舍五入,确保价钱准确
|
Double d = Double.valueOf(fmtThree.format(e));
|
return d;
|
}
|
|
/**
|
* 把存储的分字符串转成元的浮点数 例如100到1.0
|
*/
|
public static Double getYunFromFenStr(String fenStr) {
|
return getTypeDouble(Integer.parseInt(fenStr) * 1.0 / 100);
|
}
|
|
/**
|
* 把存储的分转成元的浮点数 例如100到1.0
|
*/
|
public static Double getYunFromFen(Integer fen) {
|
if (fen == null) {
|
return 0D;
|
}
|
return getTypeDouble(fen * 1.0 / 100);
|
}
|
|
/**
|
* 把存储的厘转成元的浮点数 例如1000到1.0
|
*/
|
public static Double getYunFromLi(int li) {
|
return getTypeDouble2(li * 1.0 / 1000);
|
}
|
|
/**
|
* 把存储的数值转为百分比
|
*
|
* @param rate
|
* @return
|
*/
|
public static Double getRateFromInt(int rate) {
|
return getTypeDouble(rate * 1.0 / 100);
|
}
|
|
/** 浮点数四舍五入取整 */
|
public static int getRoundHalfUp(double tar) {
|
return new BigDecimal(tar).setScale(0, BigDecimal.ROUND_HALF_UP).intValue();
|
}
|
|
/** 浮点数四舍五入取整 */
|
public static int getRoundHalfDown(double tar) {
|
Double d = Math.floor(tar);
|
return d.intValue();
|
}
|
|
/**
|
* 把一个double的字符串乘100 返回整数
|
*
|
* @return int 整数
|
*/
|
public static int getYunFromFen(String str) {
|
// BigDecimal b1 = new BigDecimal(str);
|
// BigDecimal b2 = new BigDecimal("100");
|
// return b1.multiply(b2).intValue();
|
return multiply(str, "100").intValue();
|
}
|
|
/** 获取两位小数的整数 */
|
public static int getTwoDecimalInt(Double d) {
|
return Double.valueOf(fmt.format(d)).intValue();
|
}
|
|
/**
|
* num1 除以num2 得到百分百 保留一位小数
|
*
|
* @param num1
|
* @param num2
|
* @return
|
*/
|
public static Double getPercentage(Integer num1, Integer num2) {
|
Double reNum = 0d;
|
if (num1 == null || num2 == null || num1 == 0 || num2 == 0) {
|
return reNum;
|
}
|
BigDecimal b1 = new BigDecimal(num1 * 100);
|
BigDecimal b2 = new BigDecimal(num2);
|
reNum = b1.divide(b2, 1, BigDecimal.ROUND_HALF_UP).doubleValue();
|
return reNum;
|
}
|
|
/**
|
* 将一个数除以100
|
*
|
* @param fen
|
* @return Double
|
*/
|
public static Double fenForYuan(int fen) {
|
// BigDecimal b1 = new BigDecimal(fen);
|
// BigDecimal b2 = new BigDecimal(100);
|
// return b1.divide(b2).doubleValue();
|
return divide(fen, 100);
|
}
|
|
/**
|
* 将一个数除以100
|
*
|
* @param fen
|
* @return Double
|
*/
|
public static Double fenForYuan(String fen) {
|
// BigDecimal b1 = new BigDecimal(fen);
|
// BigDecimal b2 = new BigDecimal(100);
|
// return b1.divide(b2).doubleValue();
|
return divide(fen, "100");
|
}
|
|
public static void main(String[] args) {
|
double d = 299999d;
|
System.out.println(getTwoOfDouble(d));
|
}
|
|
/**
|
* 两个数相除
|
*
|
* @param num1
|
* 数字1
|
* @param num2
|
* 数字2
|
* @return
|
*/
|
public static Double divide(int num1, int num2) {
|
return divide(num1 * 1D, num2 * 1D);
|
}
|
|
/**
|
* 两个数相除- 保留两位小数点
|
*
|
* @param num1
|
* 数字1
|
* @param num2
|
* 数字2
|
* @return
|
*/
|
public static Double divide(String num1, String num2) {
|
return divide(Double.parseDouble(num1), Double.parseDouble(num1), 2);
|
}
|
|
/**
|
* 两个数相除- 保留两位小数点
|
*
|
* @param num1
|
* 数字1
|
* @param num2
|
* 数字2
|
* @return
|
*/
|
public static Double divide(Double num1, Double num2) {
|
return divide(num1, num2, 2);
|
}
|
|
/**
|
* 两个数相除
|
*
|
* @param num1
|
* 数字1
|
* @param num2
|
* 数字2
|
* @param scale
|
* 小数位数, 默认保留2位
|
* @return
|
*/
|
public static Double divide(Double num1, Double num2, Integer scale) {
|
if (scale == null || scale < 0) {
|
scale = 2;
|
}
|
BigDecimal b1 = new BigDecimal(num1);
|
BigDecimal b2 = new BigDecimal(num2);
|
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
|
}
|
|
/**
|
*
|
* 两个数相除
|
*
|
* @param num1
|
* 数字1
|
* @param num2
|
* 数字2
|
* @param scale
|
* 小数位数, 默认保留2位
|
* @return
|
*/
|
public static Double divideDown(Double num1, Double num2, Integer scale) {
|
if (scale == null || scale < 0) {
|
scale = 2;
|
}
|
BigDecimal b1 = new BigDecimal(num1);
|
BigDecimal b2 = new BigDecimal(num2);
|
|
return b1.divide(b2, scale, BigDecimal.ROUND_DOWN).doubleValue();
|
}
|
|
/**
|
* 两个Double数相乘
|
*
|
* @param num1
|
* @param num2
|
* @return Double
|
*
|
*/
|
public static Double multiply(Double num1, Double num2) {
|
return multiply(num1.toString(), num2.toString());
|
}
|
|
/**
|
* 两个Double数相乘
|
*
|
* @param num1
|
* @param num2
|
* @return Double
|
*
|
*/
|
public static Double multiply(String num1, String num2) {
|
BigDecimal b1 = new BigDecimal(num1);
|
BigDecimal b2 = new BigDecimal(num2);
|
return b1.multiply(b2).doubleValue();
|
}
|
|
/**
|
* 两个Double数相减
|
*
|
* @param v1
|
* @param v2
|
* @return Double
|
*/
|
public static Double subtract(Double v1, Double v2) {
|
return subtract(v2.toString(), v2.toString());
|
}
|
|
/**
|
* 两个Double数相减
|
*
|
* @param v1
|
* @param v2
|
* @return Double
|
*/
|
public static Double subtract(String v1, String v2) {
|
BigDecimal b1 = new BigDecimal(v1);
|
BigDecimal b2 = new BigDecimal(v2);
|
return b1.subtract(b2).doubleValue();
|
}
|
|
/**
|
* 两个Double数相加
|
*
|
* @param v1
|
* @param v2
|
* @return Double
|
*/
|
public static Double add(Double v1, Double v2) {
|
return add(v1.toString(), v2.toString());
|
}
|
|
/**
|
* 两个Double数相加
|
*
|
* @param v1
|
* @param v2
|
* @return Double
|
*/
|
public static Double add(String v1, String v2) {
|
BigDecimal b1 = new BigDecimal(v1);
|
BigDecimal b2 = new BigDecimal(v2);
|
return b1.add(b2).doubleValue();
|
}
|
|
/** 从元转化为分,元为2位小数 */
|
public static int getFenFromYun(String doubleStr) {
|
return getRoundHalfUp(Double.parseDouble(doubleStr) * 100);
|
}
|
|
/**获取两位小数的字符串*/
|
public static String getTwoOfDouble(double value)
|
{
|
String str = value + "";
|
|
//如果有小数点,则两位小数
|
int pointIndex = str.indexOf(".");
|
if(pointIndex != -1)
|
{
|
int len = str.length();
|
if(len - (pointIndex + 1) > 2)
|
{
|
return str.substring(0, pointIndex + 3);
|
}
|
}
|
|
return str;
|
}
|
|
/**Double类型转化
|
* @param data 数据
|
* @param digitNumber 保留多少位小数
|
* @return
|
*/
|
public static Double getTypeDouble(Double data,Integer digitNumber) {
|
//利用BigDecimal来实现四舍五入.保留一位小数
|
double result2 = new BigDecimal(data).setScale(digitNumber, BigDecimal.ROUND_HALF_UP).doubleValue();
|
//1代表保留1位小数,保留两位小数就是2
|
//BigDecimal.ROUND_HALF_UP 代表使用四舍五入的方式
|
|
return result2;
|
}
|
|
/**
|
* 从字符串中提取小数
|
* @param str
|
* @return
|
*/
|
public static String getNumber(String str){
|
// 控制正则表达式的匹配行为的参数(小数)
|
Pattern p = Pattern.compile("(\\d+\\.\\d+)");
|
//Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例.
|
Matcher m = p.matcher(str);
|
//m.find用来判断该字符串中是否含有与"(\\d+\\.\\d+)"相匹配的子串
|
if (m.find()) {
|
//如果有相匹配的,则判断是否为null操作
|
//group()中的参数:0表示匹配整个正则,1表示匹配第一个括号的正则,2表示匹配第二个正则,在这只有一个括号,即1和0是一样的
|
str = m.group(1) == null ? "" : m.group(1);
|
} else {
|
//如果匹配不到小数,就进行整数匹配
|
p = Pattern.compile("(\\d+)");
|
m = p.matcher(str);
|
if (m.find()) {
|
//如果有整数相匹配
|
str = m.group(1) == null ? "" : m.group(1);
|
} else {
|
//如果没有小数和整数相匹配,即字符串中没有整数和小数,就设为空
|
str = "";
|
}
|
}
|
return str;
|
}
|
|
}
|