格式化写法跟基本的写法一致,支持无参数
<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位小数,看了源码没看懂,测试了才知道的
<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);
}