目录

java.util.UnknownFormatConversionException: Conversion = '%'

问题现象

最近在做一个java项目使用String.format进行控制台打印,结果出现如下错误:

./1.jpg

最关键的是这个问题是偶现的,通过google定位到问题还是格式化输出过程中%之间冲突了

别人类似的问题

百度搜搜发现别人的都是因为System.out.printf引起的。

Java从1.5版本开始才具体格式化输出的功能,才有了printf这个方法,可以通过指定不同的格式来控制输出样式,其中%表示格式说明的起始符号,不可缺少。而我的问题就是因为接口响应的日志中包含了%,导致printf打印时出现异常。

别人解决办法

使用 “%%” 去替换掉字符串中的 “%",例如: String str = “hello world! % w”; System.out.printf(str.replaceAll("%”, “%%"));

别人结果如下:

hello world! % w

我的解决办法

同样是替换

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class PrintPencentSignalStringError {
    public static void main(String[] args) {
        NumberFormat nf = NumberFormat.getPercentInstance();
        nf.setMinimumFractionDigits(2);//设置保留小数位,小数点后保留几位
        nf.setRoundingMode(RoundingMode.HALF_UP); //设置舍入模式
//        System.out.println(String.format(nf.format(0.67)));
        System.out.println(String.format(nf.format(0.67).replace("%","%%")));
        String str = "hello world! % w";
//        System.out.printf(str);
        System.out.printf(str.replace("%","%%"));
    }
}

别人总结

只要出现了这个错误,不管Conversion = ‘任意字符’ 中是哪个值,那肯定是你使用了printf打印内容,但是其中包括了%这个关键字符,可以使用多加一个百分号来进行转义(%%)就可以正常输出了。

我的想法

这两种输出格式化应该都是因为百分号的冲突问题才报的错,故附上格式化输出的对应表格,看到百分号我才恍然大悟

格式化输出对应表

转换符 详细说明 示例
%s 字符串类型 “喜欢请收藏”
%c 字符类型 ‘m’
%b 布尔类型 true
%d 整数类型(十进制) 88
%x 整数类型(十六进制) FF
%o 整数类型(八进制) 77
%f 浮点类型 8.888
%a 十六进制浮点类型 FF.35AE
%e 指数类型 9.38e+5
%g 通用浮点类型(f和e类型中较短的) 不举例(基本用不到)
%h 散列码 不举例(基本用不到)
%% 百分比类型 %(%特殊字符%%才能显示%)
%n 换行符 不举例(基本用不到)
%tx 日期与时间类型(x代表不同的日期与时间转换符) 不举例(基本用不到)