数据格式化工具

统一数据格式化转换
支持类型 : 常规类型,数值类型,百分比,货币,千分位,日期格式转换
 
本工具类依赖 guava ,lombox和 joda
Maven 引入相应jar包
 
<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.14</version>
</dependency>
 
<!--joda-->
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.9.9</version>
</dependency>
 
<!--guava-->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>23.0</version>
</dependency>
 
 
package com.input4hua.xxx.utils;


import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.Currency;
import java.util.Date;
import java.util.Locale;
import java.util.function.Function;
import com.input4hua.xxx.model.FieldFormatModel;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import static com.google.common.base.Preconditions.checkArgument;

/**
 * 数据格式化工具.
 *
 * @author Jiahua.hu
 * @since 21 十二月 2017
 */
public class DataFormaterUtils {

    private final static Currency currency_china = Currency.getInstance(Locale.CHINA);

    @FunctionalInterface
    private interface FormatFun extends Function<FieldFormatModel, String> {
    }

    private enum FormatEnum{
        NORMAL(DataFormaterUtils::normal),
        NUMBER(DataFormaterUtils::number),
        PERCENTAGE(DataFormaterUtils::percentage),
        CURRENCY(DataFormaterUtils::currency),
        THOUSANDS_SEPARATED(DataFormaterUtils::thousandsSeparated),
        THOUSANDS_COUNT(DataFormaterUtils::thousandsCount),
        SHORT_DATE(DataFormaterUtils::shortDate),
        LONG_DATE(DataFormaterUtils::longDate);

        private final FormatFun formatFun;

        FormatEnum(FormatFun formatFun) {
            this.formatFun = formatFun;
        }

        public String format(FieldFormatModel data) {
            return formatFun.apply(data);
        }
    }


    /**
     * 格式转换器
     *
     * @param data
     * @return
     */
    public static String parse(FieldFormatModel data){
        String type = data.getType().toUpperCase();
        FormatEnum formatEnum = FormatEnum.valueOf(type);
        return formatEnum.format(data);
    }

//常规数字格式转换
private static String normal(FieldFormatModel data){
    preString2Number(data,"常规格式转换错误,非数值类型");
    String value = data.getValue().toString();
    int decimalPointDigits = data.getDigits();
    boolean hasDecimalPoint = value.contains(".");
    if(hasDecimalPoint){
        BigDecimal bigDecimal = new BigDecimal(value);
        StringBuilder pointPatternBuf = buildBuilder("###0.",decimalPointDigits,'#');
        DecimalFormat NORMAL = new DecimalFormat(pointPatternBuf.toString());
        NORMAL.setRoundingMode(RoundingMode.HALF_UP);
        value = NORMAL.format(bigDecimal.doubleValue());
    }
    return value;
}

//数值格式转换
private static String number(FieldFormatModel data){
    preString2Number(data,"数值格式转换错误,非数值类型");
    String value = data.getValue().toString();
    int decimalPointDigits = data.getDigits();
    BigDecimal bigDecimal = new BigDecimal(value);
    StringBuilder pointPatternBuf = buildBuilder("###0.",decimalPointDigits,'0');
    DecimalFormat decimalFormat = new DecimalFormat(pointPatternBuf.toString());
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    value = decimalFormat.format(bigDecimal.doubleValue());
    return value;
}


//百分比
private static String percentage(FieldFormatModel data){
    preString2Number(data,"百分比格式转换错误,非数值类型");
    String value = data.getValue().toString();
    int decimalPointDigits = data.getDigits();
    BigDecimal bigDecimal = new BigDecimal(value);
    StringBuilder pointPatternBuf = buildBuilder("0.",decimalPointDigits,'0');
    DecimalFormat decimalFormat = new DecimalFormat(pointPatternBuf.append("%").toString());
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    value = decimalFormat.format(bigDecimal.doubleValue());
    return value;
}

//货币
private static String currency(FieldFormatModel data){
    preString2Number(data,"货币格式转换错误,非数值类型");
    return currency_china.getSymbol()+thousandsSeparated(data);
}

//千位分隔
private static String thousandsSeparated(FieldFormatModel data){
    preString2Number(data,"千位分隔格式转换错误,非数值类型");
    String value = data.getValue().toString();
    int decimalPointDigits = data.getDigits();
    BigDecimal bigDecimal = new BigDecimal(value);
    StringBuilder pointPatternBuf = buildBuilder(",##0.",decimalPointDigits,'0');
    DecimalFormat decimalFormat = new DecimalFormat(pointPatternBuf.toString());
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    value = decimalFormat.format(bigDecimal.doubleValue());
    return value;
}

//千位计数
private static String thousandsCount(FieldFormatModel data){
    preString2Number(data,"千位计数格式转换错误,非数值类型");
    String value = data.getValue().toString();
    double v = Double.parseDouble(value) / 1000;
    value = String.valueOf(v);
    int decimalPointDigits = data.getDigits();
    BigDecimal bigDecimal = new BigDecimal(value);
    StringBuilder pointPatternBuf = buildBuilder("0.",decimalPointDigits,'0');
    DecimalFormat decimalFormat = new DecimalFormat(pointPatternBuf.append("K").toString());
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    value = decimalFormat.format(bigDecimal.doubleValue());
    return value;
}

//短日期格式化转换
private static String shortDate(FieldFormatModel data){
    DateTime dateTime = buildDateTime(data.getValue());
    return dateTime.toString(DateUtil.SHORT_DATE_PATTERN);
}

//长日期格式化转换
private static String longDate(FieldFormatModel data){
    DateTime dateTime = buildDateTime(data.getValue());
    return dateTime.toString(DateUtil.LONG_DATE_PATTERN);
}

//统一字符转Number预处理
private static void preString2Number(FieldFormatModel data, String errorMessage) {
    if(data.getValue() instanceof String){
        String value = (String) data.getValue();
        NumberFormat nf = NumberFormat.getInstance();
        try {
            Number number = nf.parse(value);
            data.setValue(number);
        }
        catch (ParseException e) {
            throw new RuntimeException(data.getType()+"数值格式预处理转换错误,非数值类型["+data.getValue()+"]");
        }
    }
    checkArgument(data.getValue() instanceof Number, errorMessage+"["+data.getValue()+"]");
}

//格式化模板统一转换
private static StringBuilder buildBuilder(String satrtChars, int n, Character c){
    StringBuilder builder = new StringBuilder(satrtChars);
    if(n <= 0){
        builder.deleteCharAt(builder.length()-1);
    }else{
        for(int i=0;i<n;i++) {
            builder.append(c);
        }
    }
    return builder;
}


// 日期格式统一转换
    private static DateTime buildDateTime(Object value) {
        DateTime dateTime = null;
        if(value instanceof Date){
            dateTime = new DateTime(value);
        }else{
            String valStr = value.toString();
            DateTimeFormatter format = null;
            if(valStr.contains("-")){
                if(valStr.contains(":")){
                    format = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
                }else{
                    format = DateTimeFormat.forPattern("yyyy-MM-dd");
                }
            }else if(valStr.contains("/")){
                if(valStr.contains(":")){
                    format = DateTimeFormat.forPattern("yyyy/MM/dd HH:mm:ss");
                }else{
                    format = DateTimeFormat.forPattern("yyyy/MM/dd");
                }
            }else{
                throw new RuntimeException("时间格式转换错误,暂不支持相应日期格式转换");
            }
            dateTime = DateTime.parse(valStr, format);
        }
        return dateTime;
    }

}

 

 

package com.input4hua.xxx.model;
 
import java.io.Serializable;
import lombok.Data;
 
/**
* 格式化model
*
* @author Jinput
* @since 21 十二月 2017
*/
@Data
public class FieldFormatModel implements Serializable {
 
    private static final long serialVersionUID = -7409395670956855205L;
 
    private String name;
 
    private Object value;
 
    private String type;
 
    private int digits;
}
 

Use case
public static void main(String[] args) {
    //常规
    FieldFormatModel data = new FieldFormatModel();
    data.setType("NORMAL");
    data.setValue(123.125);
    data.setDigits(4);
    String parse = DataFormaterUtils.parse(data);
    System.out.println(parse);
    //数值
    FieldFormatModel data = new FieldFormatModel();
    data.setType("NUMBER");
    data.setValue(123);
    data.setDigits(2);
    String parse = DataFormaterUtils.parse(data);
    System.out.println(parse);
    //日期
    FieldFormatModel data = new FieldFormatModel();
    data.setType("LONG_DATE");
    data.setValue(new Date());
    String parse = DataFormaterUtils.parse(data);
    System.out.println(parse);
    //百分比
    FieldFormatModel data = new FieldFormatModel();
    data.setType("PERCENTAGE");
    data.setValue(0.12345);
    data.setDigits(3);
    String parse = DataFormaterUtils.parse(data);
    System.out.println(parse);
    //货币
    FieldFormatModel data = new FieldFormatModel();
    data.setType("CURRENCY");
    data.setValue(123.45);
    data.setDigits(3);
    String parse = DataFormaterUtils.parse(data);
    System.out.println(parse);
    //千位分隔
    FieldFormatModel data = new FieldFormatModel();
    data.setType("THOUSANDS_SEPARATED");
    data.setValue(111111222.013);
    data.setDigits(3);
    String parse = DataFormaterUtils.parse(data);
    System.out.println(parse);
    //千位计数
    FieldFormatModel data = new FieldFormatModel();
    data.setType("THOUSANDS_COUNT");
    data.setValue(4567889.123);
    data.setDigits(2);
    String parse = DataFormaterUtils.parse(data);
    System.out.println(parse);
}
 
 

posted on 2017-12-23 17:49  听风tingfeng  阅读(933)  评论(0)    收藏  举报

导航