UnknownFormatConversionException:转换 =“”

UnknownFormatConversionException: Conversion = ' '

首先,感谢您花时间解决这个问题。我根据自己的知识尝试过,但找不到修改的地方。我做了一个游戏,最后,我必须 return 格式化字符串到终端。

当我将基本字符串连接更改为格式化字符串时出现异常。我不知道如何解决它。

  1. players是播放器数组。
  2. WinRatioscore(int) 除以 gamePlayed(int),四舍五入为整数。

这是我的部分代码。

public static void searchAndPrintRankingDataDesc() {
    NimPlayer [] players = NimPlayer.getPlayer();
    Arrays.sort(players, Comparator.comparing((NimPlayer::getWinRatio)).reversed().thenComparing(NimPlayer::getUserName));
    Arrays.stream(players).forEach(System.out::println);

还有我的 toString 方法:

public String getWinRatio() {
    return Integer.toString(Math.round(Float.valueOf(getScore())/ (getGamePlayed())*100));
}

public String toString() {
    return String.format( "%02d" +"% | "+ "%02d" +" games | "+ "%s " + "%s", getWinRatio(), gamePlayed, givenName, familyName);
}

在格式化字符串中使用 % 时,必须使用另一个 % 进行转义。并且在格式化整数值时,如果已经有 toString 方法,它将得到 IllegalFormatConversionException

此处的代码将整数格式化为字符串。

public String getWinRatio() {
return Integer.toString(Math.round(Float.valueOf(getScore())/ (getGamePlayed())*100));

}

下面的代码再次格式化,导致IllegalFormatConversionException

public String toString() {
return String.format( "%02d" +"% | "+ "%02d" +" games | "+ "%s " + "%s", getWinRatio(), gamePlayed, givenName, familyName);

}

所以,答案将是:

public int getWinRatio() {
    return Math.round(Float.valueOf(getScore())/ (getGamePlayed())*100);
}
public String toString() {
    return String.format( "%02d" +"%%" + " | "+ "%02d" +" games | "+ "%s " + "%s", getWinRatio(), gamePlayed, givenName, familyName);
}

% 是 String.format 的特殊字符,要转义 %,您必须将其替换为 %%。所以你的陈述变成了-

String.format( "%02d" +"%% | "+ "%02d" +" games | "+ "%s " + "%s", getWinRatio(), gamePlayed, givenName, familyName);