【Bug记录】记录MessageFormat.format格式化数字问题

1.背景

使用MessageFormat.format格式化来记录日志,操作
例如如下代码:

log.error(MessageFormat.format("Bilibili回调参数缺失,channel:{0},param:{1},detail:{2}", channel, param, detail));

通过占位符将 channel, param, detail赋值给{0},{1},{2},避免使用%s做占位符

[10:19:42.958] ERROR [xxx] Bilibili回调参数缺失,channel:xxx,param:xxx,detail:xxx

2.问题

当在格式化中包含Long类型时,会出现,号分割现象

public static void main(String[] args) {
    long currentTime = System.currentTimeMillis();
    log.info(MessageFormat.format("Current Time {0}", currentTime));
}

在这里插入图片描述

3.原因分析

  • 格式化输出:
    当MessageFormat格式化数字时,默认情况下会根据当前的默认区域设置(locale)来决定是否添加千分位分隔符。
    如果当前的默认区域设置是美国英语(en_US),那么MessageFormat会自动在输出的数字中添加千分位逗号。

  • 区域设置的影响:
    Java中的Locale类定义了语言环境的具体设置,包括语言、国家和地区等信息。
    不同的Locale可能有不同的数字格式化规则,例如是否使用千分位分隔符以及使用的分隔符是什么。

4.解决办法

  1. 最简单的方法是先将long转换成String类型,再格式化
  2. 使用DecimalFormat df = new DecimalFormat("#");
    • "#":表示只显示数字,不强制显示小数点后的 0。例如,如果你将 12345 传递给这个DecimalFormat对象,它会格式化为 “12345”。
public static void main(String[] args) {
    long currentTime = System.currentTimeMillis();
    DecimalFormat df = new DecimalFormat("#");
    String formatted = df.format(currentTime);
    log.info(MessageFormat.format("Current Time {0}", currentTime));
    log.info(MessageFormat.format("Current Time {0}", String.valueOf(currentTime)));
    log.info(MessageFormat.format("Current Time {0}", formatted));
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值