package org.howsun.util; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; /** * <h1>功能描述:</h1> * * @author howsun(howsun.zhang@google.com) * @version 1.0.0 */ public abstract class Numbers { private static final int DEF_DIV_SCALE = 10; /** * 判断是否为数字组成的字串 * @param validString 要判断的字符串 * @return boolen值,true或false */ public static boolean isNumber(String validString){ if(!Strings.hasLengthAfterTrimWhiteSpace(validString)){ return false; } byte[] tempbyte = validString.getBytes(); for(int i = 0; i < validString.length(); i++){ if( ( tempbyte[i] == 45 ) && ( i == 0 ) ){ continue; } if((tempbyte[i] < 48) || (tempbyte[i] > 57)){ return false; } } return true; } /** * 判断是否为数字及最多一个小数点组成的实型数 * @param validString 要判断的字符串 * @return boolen值,true或false */ public static boolean isReal(String validString){ byte[] tempbyte = validString.getBytes(); int a = 0; //0-9的个数 int b = 0; //小数点的个数 int c = 0; //其他字符 int d = 0; //符号 for(int i=0;i<validString.length();i++){ if((tempbyte[i] == 45)&&(i==0)){ d++; continue; } if((tempbyte[i]>=48)&&(tempbyte[i]<=57)){ a++; continue; } if(tempbyte[i] == 46){//这是小数点 b++; continue; } c++; } if(c>0||b>1){ return false; } return true; } /** * 判断是否为数字组成的费款所属期 * @param validString 要判断的字符串 * @return boolen值,true或false */ public static boolean isFkssq(String validString){ if(!isNumber(validString)){ //如果费款所属期内不全是数字则有误 return false; } if(validString.length() != 6){ //如果费款所属期内不是六位数则有误 return false; } int i_year = new Integer(validString.substring(0,4)).intValue(); int i_month = new Integer(validString.substring(4,6)).intValue(); if(i_year > 0 && i_year < 9999 && i_month > 0 && i_month < 13){ return true; } return false; } /** * 判断是否符合定长条件 * @param validString 要判断的字符串 * @long1 最小长度 * @long2 最大长度 * @return boolen值,true或false */ public static boolean isLong(String validString,int long1,int long2){ if(validString.length()>long2||validString.length()<long1){ //字符串的长度有误 return false; } return true; } /** * 提供精确的加法运算。 * @param v1 被加数 * @param v2 加数 * @return 两个参数的和 */ public static double add(double v1,double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } /** * 提供精确的减法运算。 * @param v1 被减数 * @param v2 减数 * @return 两个参数的差 */ public static double sub(double v1,double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2).doubleValue(); } /** * 提供精确的乘法运算。 * @param v1 被乘数 * @param v2 乘数 * @return 两个参数的积 */ public static double mul(double v1,double v2){ BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2).doubleValue(); } /** * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 * 小数点以后10位,以后的数字四舍五入。 * @param v1 被除数 * @param v2 除数 * @return 两个参数的商 */ public static double div(double v1,double v2){ return div(v1,v2,DEF_DIV_SCALE); } /** * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 * 定精度,以后的数字四舍五入。 * @param v1 被除数 * @param v2 除数 * @param scale 表示表示需要精确到小数点以后几位。 * @return 两个参数的商 */ public static double div(double v1,double v2,int scale){ if(scale<0){ throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 提供精确的小数位四舍五入处理。 * @param v 需要四舍五入的数字 * @param scale 小数点后保留几位 * @return 四舍五入后的结果 */ public static double round(double v,int scale){ if(scale<0){ throw new IllegalArgumentException("The scale must be a positive integer or zero"); } BigDecimal b = new BigDecimal(Double.toString(v)); BigDecimal one = new BigDecimal("1"); return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * 求出整数的位数,例如1000是四位数 * @param number * @return */ public static int getIntegerDigit(Integer number){ int digit = 1; while(number > 9){ number = number/10; digit++; } return digit; } /** * 填充数 * @param source * @return */ public static List<Integer> fillNumber(List<Integer> source){ List<Integer> s = new ArrayList<Integer>(); Integer[] ss = new Integer[source.size()]; ss = source.toArray(ss); int start = 0, end = 0; for (int i = 0; i < ss.length; i++) { s.add(start); end = ss[i]; for (int j = start+1; j < end; j ++) { s.add(j); } start = ss[i]; } return s; } /** * * @param src * @param defaultValue * @return */ public static Long parseLong(String src, Long defaultValue){ try { return Long.parseLong(src); } catch (Exception e) { return defaultValue; } } public static Integer parseInt(String src, Integer defaultValue){ try { return Integer.parseInt(src); } catch (Exception e) { return defaultValue; } } /** * 求百分比, * @param a * @param b * @return 返回带%号的字符串 */ public static String scaleForDisplay(double a, double b){ java.text.NumberFormat nf = java.text.NumberFormat.getPercentInstance(); nf.setMinimumFractionDigits(0);// 小数点后保留几位 return nf.format(a/b); } /** * 求百分比, * @param a * @param b * @return 返回参数相除后商的100倍值 */ public static int scale(double a, double b){ if(b == 0){ return 0; } BigDecimal start = new BigDecimal(String.valueOf(a)), end = new BigDecimal(String.valueOf(b)) ; return (int)(start.divide(end, 2, RoundingMode.HALF_UP).doubleValue() * 100); } public static boolean thanZero(Long longNumber){ return longNumber != null && longNumber > 0; } public static boolean thanZero(Integer intNumber){ return intNumber != null && intNumber > 0; } public static boolean thanZero(BigDecimal bigDecimalNumber){ return bigDecimalNumber != null && bigDecimalNumber.signum() > 0; } public static boolean minOfBigDecimal(BigDecimal min, BigDecimal max){ return min != null && max != null && min.min(max).equals(min); } public static boolean maxOfBigDecimal(BigDecimal max, BigDecimal min){ return min != null && max != null && max.max(min).equals(max); } public static void main(String[] args) { System.out.println(scale(1, 0)); System.out.println(scaleForDisplay(1, 0)); } }