You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

String.format提示BigDecimal与%d格式符类型不匹配如何解决

错误原因

String.format的%d占位符仅支持byte/short/int/long等整数基本类型及对应包装类,你代码中getQuantity()返回值为BigDecimal类型,和占位符要求的类型不匹配,因此抛出类型不匹配错误。

解决方案

基础修复(快速满足打印需求)

直接把对应位置的%d换成%s即可。%s是通用字符串占位符,会自动调用入参的toString()方法做转换,BigDecimal原生的toString()实现可以正确输出数值内容,不会丢失精度。
另外循环中用+=拼接字符串会产生大量无用的中间字符串对象,性能很差,推荐替换为StringBuilder做拼接,修复后的完整代码如下:

StringBuilder stockStrBuilder = new StringBuilder();
for (StockRecordDTO stockNumber : stockID) {
    stockStrBuilder.append(String.format("the stock %s for Date %s with Quantity %s ",
            stockNumber.getStock(),
            stockNumber.getBusinessDate(),
            stockNumber.getQuantity()
    ));
}
String stockStr = stockStrBuilder.toString();

自定义数值格式(有格式要求时使用)

如果需要控制Quantity的输出格式,比如固定保留N位小数、去掉无意义尾零、关闭千分位分隔符,可以先对BigDecimal做单独格式化,再把生成的字符串传入String.format,示例代码:

// 配置数值格式:固定保留2位小数,不使用千分位分隔符
NumberFormat quantityFormat = NumberFormat.getInstance();
quantityFormat.setMaximumFractionDigits(2);
quantityFormat.setMinimumFractionDigits(2);
quantityFormat.setGroupingUsed(false);

StringBuilder stockStrBuilder = new StringBuilder();
for (StockRecordDTO stockNumber : stockID) {
    String formattedQuantity = quantityFormat.format(stockNumber.getQuantity());
    stockStrBuilder.append(String.format("the stock %s for Date %s with Quantity %s ",
            stockNumber.getStock(),
            stockNumber.getBusinessDate(),
            formattedQuantity
    ));
}
String stockStr = stockStrBuilder.toString();

注意事项

不要尝试直接把BigDecimal强转为int类型,会抛出类型转换异常;如果确实需要输出整数值,要调用BigDecimal的intValue()/longValue()方法做转换,但如果字段值存在小数位,这种转换会直接丢失小数精度,非必要不要使用。

内容的提问来源于stack exchange,提问作者ShiBui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 13:06:25