数值助手类

package com.chinaeducloud.common.helper;

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

/**
* 数值助手类
*
* @author wlz
*
*/
public class NumberHelper {

//数字位
private static String[] chnNumChar = {"零","一","二","三","四","五","六","七","八","九"};
//节权位
private static String[] chnUnitSection = {"","万","亿","万亿"};
//权位
private static String[] chnUnitChar = {"","十","百","千"};

/**
* 转为中文金额 如9847337 转换为 玖佰捌拾肆万柒仟叁佰叁拾柒元
*
* @param d
* @return
*/
public static String toChineseAmount(int d) {
String[] str = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
String ss[] = new String[] { "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿" };
String s = String.valueOf(d);
System.out.println(s);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
String index = String.valueOf(s.charAt(i));
sb = sb.append(str[Integer.parseInt(index)]);
}
String sss = String.valueOf(sb);
int i = 0;
for (int j = sss.length(); j > 0; j--) {
sb = sb.insert(j, ss[i++]);
}
return sb.toString();
}

/**
* 转为中文数字 如 6078 转换为 六零七八
*
* @param d
* @return
*/
public static String toChineseNumber(int d) {
String[] str = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
String src = String.valueOf(d);
StringBuilder sb = new StringBuilder();
for (char c : src.toCharArray()) {
sb.append(str[c - 48]);
}
return sb.toString();
}

/**
* 判断字符是否数字
*
* @param c
* @return
*/
public static boolean isNumber(char c) {
return c >= 0x30 && c <= 0x39;
}

/**
* 判断是否double
*
* @param text
* @return
*/
public static boolean isDouble(String text) {
try {
Double.valueOf(text);// 把字符串强制转换为数字
return true;// 如果是数字,返回True
} catch (Exception e) {
return false;// 如果抛出异常,返回False
}
}

/**
* 判断是否Integer
*
* @param text
* @return
*/
public static boolean isInteger(String text) {
try {
Integer.valueOf(text);// 把字符串强制转换为整数
return true;// 如果是数字,返回True
} catch (Exception e) {
return false;// 如果抛出异常,返回False
}
}

/**
* 根据小数位数把Double类型的数据格式化为字符串 规则:1、四舍五入;2、去掉小数点后无意义的尾数0
*
* @author wy
* @param digit
* 小数位数
* @param dValue
* 需要格式化的数值
* @return
*/
public static String formatDoubleValue(int digit, Double dValue) {
DecimalFormat df = null;
if (digit == 0) {
df = new DecimalFormat("#");
} else {
StringBuilder sbFormat = new StringBuilder("#.");
for (int i = 0; i < digit; i++) {
sbFormat.append("#");
}
df = new DecimalFormat(sbFormat.toString());
}
return df.format(dValue.doubleValue());
}

/**
* 根据小数位数把Double类型的数据格式化为货币字符串 规则:1、四舍五入;2、去掉小数点后无意义的尾数0
*
* @param dValue
* 需要格式化的数值
* @return
*/
public static String formatCurrencyValue(Double dValue) {
DecimalFormat df = new DecimalFormat("0.00");
return df.format(dValue);
}

/**
* @param type 1:四舍五入 2:向上舍入 3:向下舍入
* @param digit 保留小数点的个数
* @param value 需要格式化的数值
* @return
*/
public static double formatByType(Integer type, int digit, double value) {
double result = 0;
BigDecimal bdec = new BigDecimal(value);
switch (type) {
case 1:
result = bdec.setScale(digit, BigDecimal.ROUND_HALF_UP).doubleValue();
break;
case 2:
result = bdec.setScale(digit, BigDecimal.ROUND_UP).doubleValue();
break;
case 3:
result = bdec.setScale(digit, BigDecimal.ROUND_DOWN).doubleValue();
break;
default:
result = bdec.setScale(digit, BigDecimal.ROUND_DOWN).doubleValue();
}
return result;
}

/**
* @param type 1:四舍五入 2:向上舍入 3:向下舍入
* @param value 需要格式化的数值
* @return
*/
public static int formatByType(Integer type, double value) {
double result = 0;
result = formatByType(type,0,value);
return (int)result;
}

/**两整数相除,返回百分比,小数点四舍五入后保留两位小数
* @param a 除数分子
* @param b 被除数分母
* @return
*/
public static String integerDiv(int a , int b){
if(a==0 || b==0)
return "0";
float r = (float)a/b;
double r_1 = Double.valueOf(formatDoubleValue(4,Double.valueOf(r))).doubleValue();
return String.valueOf(r_1);
}

/**
* 转为完整中文数字 如 123 转换为 一百二十三,11转换为一十一
*
* @param d
* @return
*/
public static String toChineseNumberFull(int num){
if(num == 0){
return "零";
}
int sourceNum = num;
int unitPos = 0;//节权位标识
String All = new String();
String chineseNum = new String();//中文数字字符串
boolean needZero = false;//下一小结是否需要补零
String strIns = new String();
while(num>0){
int section = num%10000;//取最后面的那一个小节
if(needZero){//判断上一小节千位是否为零,为零就要加上零
All = chnNumChar[0] + All;
}
chineseNum = sectionTOChinese(section,chineseNum);//处理当前小节的数字,然后用chineseNum记录当前小节数字
if( section!=0 ){//此处用if else 选择语句来执行加节权位
strIns = chnUnitSection[unitPos];//当小节不为0,就加上节权位
chineseNum = chineseNum + strIns;
}else{
strIns = chnUnitSection[0];//否则不用加
chineseNum = strIns + chineseNum;
}
All = chineseNum+All;
chineseNum = "";
needZero = (section<1000) && (section>0);
num = num/10000;
unitPos++;
}
if(sourceNum > 9 && sourceNum < 20){
All=All.replace("一十", "十");
}
return All;
}

private static String sectionTOChinese(int section,String chineseNum){
String setionChinese = new String();//小节部分用独立函数操作
int unitPos = 0;//小节内部的权值计数器
boolean zero = true;//小节内部的制零判断,每个小节内只能出现一个零
while(section>0){
int v = section%10;//取当前最末位的值
if(v == 0){
if( !zero ){
zero = true;//需要补零的操作,确保对连续多个零只是输出一个
chineseNum = chnNumChar[0] + chineseNum;
}
}else{
zero = false;//有非零的数字,就把制零开关打开
setionChinese = chnNumChar[v];//对应中文数字位
setionChinese = setionChinese + chnUnitChar[unitPos];//对应中文权位
chineseNum = setionChinese + chineseNum;
}
unitPos++;
section = section/10;
}

return chineseNum;
}

}

猜你喜欢

转载自www.cnblogs.com/fiveElements/p/9188186.html
今日推荐