package com.base.core.utiles;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;

/**
 * <p>
 * Description:数据工具类，提供时间和字符串之间的互相转换
 * </p>
 * <p>
 * Copyright: Copyright (c) 2012
 * </p>
 * <p>
 * Company:航天恒星科技有限公司系统遥感事业部
 * </p>
 * 
 * @author 齐昕浒
 */
public class NumberUtils {
	/**
	 * 将number 4舍5入，保留decimal位小数，但double值大于7位时处理不了，返回0
	 * 
	 * @param number
	 *            需要处理的数字
	 * @param decimal
	 *            要保留的小数位
	 * @return
	 */
	public static double getRoundHalfUp(double number, int decimal) {
//		if (number > 9999999) {// number大于7位会自动转成科学计数发
//			return 0;// 处理不了，返回0
//		}
		long num = 0;// 临时变量
		int offset = 1;// 小数点偏移量
		offset = (int) Math.pow(10, decimal);
		number = number * offset;
		num = new BigDecimal(number).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
		number = (double) num / offset;
		return number;
	}
	
	/**
	 * 将number 4舍5入，保留decimal位小数，处理大于7位的情况
	 * 
	 * @param number
	 *            需要处理的数字
	 * @param decimal
	 *            要保留的小数位
	 * @return
	 */
	public static String getRoundHalfUp4Big(double number, int decimal) {
		long num = 0;// 临时变量
		int offset = 1;// 小数点偏移量
		offset = (int) Math.pow(10, decimal);
		number = number * offset;
		num = new BigDecimal(number).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
		number = (double) num / offset;
		//
		NumberFormat nf = NumberFormat.getInstance();
		nf.setGroupingUsed(false);
		return nf.format(number);
	}
	
	/**
	 * 返回DecimalFormat处理过的number值，默认不要小数位，但是小数位不为0，保留小数位
	 * 
	 * @param number
	 *            需要处理的数字
	 * @return
	 */
	public static String getFormatNum4Int(double number) {
		NumberFormat nf = NumberFormat.getInstance();
		nf.setParseIntegerOnly(true);// 小数位不为0，保留小数位
		return nf.format(number).replace(",", "");// 整数大于3位会有逗号
	}
	
//	/**
//	 * 返回DecimalFormat处理过的number值，默认4位小数
//	 * 
//	 * @param number
//	 *            需要处理的数字
//	 * @return
//	 */
//	public static String getFormatNum(double number) {
//		DecimalFormat df = new DecimalFormat(getRegex(4));
//		return df.format(number);
//	}
	
	/**
	 * 返回DecimalFormat处理过的number值，自动处理，存在整数和小数过大时存在问题
	 * 
	 * @param number
	 *            需要处理的数字
	 * @return
	 */
	public static String getFormatNum(double number) {
		String num = String.valueOf(number);
		if (num.contains("E-")) {
			int len = 0;
			String s[] = num.split("[.]");
			if (s.length > 1) {
				String e[] = s[1].split("E-");
				if (e.length > 1) {
					int len1 = e[0].length();
					int len2 = Integer.parseInt(e[1]);
					len = len1 + len2;
				}
			}
			DecimalFormat df = new DecimalFormat(getRegex(len));
			return df.format(number);
		} else {
			String s[] = num.split("[.]");
			if (s.length > 1) {
				//TODO 存在整数和小数过大时存在问题 ，如12345678.8765432112345678
				DecimalFormat df = new DecimalFormat(getRegex(s[1].length()));
				return df.format(number);
			} else {
				DecimalFormat df = new DecimalFormat(getRegex(4));
				return df.format(number);
			}
		}
	}
	
	/**
	 *返回DecimalFormat处理过的number值
	 * 
	 * @param number
	 *            需要处理的数字
	 * @param decimal
	 *            要保留的小数位
	 * @return
	 */
	public static String getFormatNum(double number, int decimal) {
		DecimalFormat df = new DecimalFormat(getRegex(decimal));
		return df.format(number);
	}
	
	/**
	 * 返回DecimalFormat处理过的number值
	 * 
	 * @param number
	 *            需要处理的数字
	 * @param regex
	 *            需要的表达式如"0.00"
	 * @return
	 */
	public static String getFormatNum(double number, String regex) {
		DecimalFormat df = new DecimalFormat(regex);
		return df.format(number);
	}
	
	/**
	 * 返回DecimalFormat需要的表达式，如"0.00"
	 * 
	 * @param decimal
	 * @return
	 */
	public static String getRegex(int decimal) {
		if (decimal == 0) {
			return "0";
		}
		String regex = "0.";
		final String ZERO = "0";
		for (int i = 0; i < decimal; i++) {
			regex = regex + ZERO;
		}
		return regex;
	}
	
	/**
	 * 返回不用科学计数法的double值
	 * 
	 * @param number
	 * @return
	 */
	public static String getNotGroupingUsed(double number) {
		NumberFormat nf = NumberFormat.getInstance();
		nf.setGroupingUsed(false);
		return nf.format(number);
	}
}
