Springboot+thymeleaf+IDEA——简单格式化日期和数字

文章目录

  • Springboot+thymeleaf+IDEA——简单格式化日期和数字
        • 1、格式化日期
        • 2、格式化数字

Springboot+thymeleaf+IDEA——简单格式化日期和数字


1、格式化日期

格式化写法跟基本的写法一致,支持无参数

 <dd th:text="${#dates.format(dateStr, 'yyyy-MM-dd')}">dd>

thymeleaf 解析日期处理的源码如下,只留意三个经常用的方法,thymeleaf 的源码真的很干净,没有注释,棒,只能靠看代码

第一个,根据格式化字符进行格式化

    
    public String format(final Date target, final String pattern) {
        if (target == null) {
            return null;
        }
        try {
            return DateUtils.format(target, pattern, this.locale);
        } catch (final Exception e) {
            throw new TemplateProcessingException(
                    "Error formatting date with format pattern \"" + pattern + "\"", e);
        }
    }

第二个,根据系统默认的格式化格式进行格式化

    public String format(final Date target) {
        if (target == null) {
            return null;
        }
        try {
            return DateUtils.format(target, this.locale);
        } catch (final Exception e) {
            throw new TemplateProcessingException(
                    "Error formatting date with standard format for locale " + this.locale, e);
        }
    }

第三个,根据ISO格式化进行格式化

    public String formatISO(final Date target) {
        if (target == null) {
            return null;
        }
        try {
            return DateUtils.formatISO(target);
        } catch (final Exception e) {
            throw new TemplateProcessingException("Error formatting date as ISO8601", e);
        }
    }

具体执行格式化的源码

    private static String formatDate(final Object target, final String pattern, final Locale locale) {

        Validate.notNull(locale, "Locale cannot be null");

        if (target == null) {
            return null;
        }

        final DateFormatKey key = new DateFormatKey(target, pattern, locale);
        
        DateFormat dateFormat = dateFormats.get(key);
        if (dateFormat == null) {
            if (StringUtils.isEmptyOrWhitespace(pattern)) {
                dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
            } else {
                dateFormat = new SimpleDateFormat(pattern, locale);
            }
            if (key.timeZone != null) {
                dateFormat.setTimeZone(key.timeZone);
            }
            dateFormats.put(key, dateFormat);
        }
        
        if (target instanceof Calendar) {
            synchronized (dateFormat) {
                return dateFormat.format(((Calendar) target).getTime());
            }
        } else if (target instanceof java.util.Date) {
            synchronized (dateFormat) {
                return dateFormat.format((java.util.Date)target);
            }
        } else {
            throw new IllegalArgumentException(
                    "Cannot format object of class \"" + target.getClass().getName() + "\" as a date");
        }
        
    }

源码位于:org.thymeleaf.expression 包下,下面的十几个类都是用于支持表达式的

2、格式化数字

下面的代码的意思是,格式化这个价格,数字的整数位最少保留一位数字,数字的小数位最少保留2位小数,看了源码没看懂,测试了才知道的

<dd th:text="${#numbers.formatDecimal(product.price, 1, 2)}">350dd>

数字格式化的源码如下,一个注释都没有,真的很优秀

    public String formatDecimal(final Number target, final Integer minIntegerDigits, final Integer decimalDigits) {
        if (target == null) {
            return null;
        }
        try {
            return NumberUtils.format(target, minIntegerDigits, decimalDigits, this.locale);
        } catch (final Exception e) {
            throw new TemplateProcessingException(
                    "Error formatting decimal with minimum integer digits = " + minIntegerDigits + 
                    " and decimal digits " + decimalDigits, e);
        }
    }

测试代码如下,输出结果为00150.10

    public static void main(String[] args) {
        Numbers numbers = new Numbers(Locale.CHINA);
        String formatDecimal = numbers.formatDecimal(new BigDecimal(150.10), 5, 2);
        System.out.println(formatDecimal);

    }

所以格式化数字的话,一般常用的格式参数是这样的:整数位最少保留1位,小数位保留2位

<dd th:text="${#numbers.formatDecimal(你的数字变量名, 1, 2)}">350dd>

具体格式化数字的源码如下

	/**
	 * 补充翻译一下注释
     * 根据给定值格式化数字。
     * 
     * @param target             将要格式化的数字
     * @param minIntegerDigits   整数位最少返回几位,用0填充
     * @param thousandsPointType 用于分隔数字组的字符。
     * @param fractionDigits     小数位最少返回几位,用0填充
     * @param decimalPointType   用于分隔小数的字符
     * @param locale             要怎么格式化,区域设置,一般选择中国,简体中文:Locale.CHINA 
     * @return 格式化的数字,如果数字是个null 就直接返回null
     */
    private static String formatNumber(final Number target, final Integer minIntegerDigits,
        final NumberPointType thousandsPointType, final Integer fractionDigits,
        final NumberPointType decimalPointType, final Locale locale) {

        Validate.notNull(fractionDigits, "Fraction digits cannot be null");
        Validate.notNull(decimalPointType, "Decimal point type cannot be null");
        Validate.notNull(thousandsPointType, "Thousands point type cannot be null");
        Validate.notNull(locale, "Locale cannot be null");

        if (target == null) {
            return null;
        }

        DecimalFormat format = (DecimalFormat)NumberFormat.getNumberInstance(locale);
        format.setMinimumFractionDigits(fractionDigits.intValue());
        format.setMaximumFractionDigits(fractionDigits.intValue());
        if (minIntegerDigits != null) {
            format.setMinimumIntegerDigits(minIntegerDigits.intValue());
        }
        format.setDecimalSeparatorAlwaysShown(decimalPointType != NumberPointType.NONE && fractionDigits.intValue() > 0);
        format.setGroupingUsed(thousandsPointType != NumberPointType.NONE);
        format.setDecimalFormatSymbols(computeDecimalFormatSymbols(decimalPointType, thousandsPointType, locale));
        
        return format.format(target);
    }

你可能感兴趣的:(#,框架相关,-,SpringBoot体系)