Escape % символ в строке Java для применения String.format

В моем проекте (среда Java/Play) у меня есть маршрутизация обработки ошибок, которая проверяет ответ от веб-службы, если ответ является кодом ошибки, мы отображаем соответствующее сообщение об ошибке, в котором говорится, что было проблемой с пользовательским вводом, служба проверяет допустимость ввода пользователя.

Когда пользователь вводит символ%, эта логика ломается, потому что логика отображения ошибок использует

String.format(message, messageArgs);

Который интерполирует messageArgs вводит строку сообщения, где он находит%, и если messageArgs также содержит%, я получаю исключение.

Мне нужно очистить, удалить или иным образом удалить% из пользовательского ввода, прежде чем отображать сообщение.

сообщение: запрошенный адрес электронной почты% s является недействительным messageArgs: orlybg%@gmail.com

Любой совет о том, как сделать это в Java самым простым и кратким способом?

вот часть журнала ошибок

 java.util.UnknownFormatConversionException: Conversion = 'i'
   at java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2646)
   at java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2675)
   at java.util.Formatter.parse(Formatter.java:2528)
   at java.util.Formatter.format(Formatter.java:2469)
   at java.util.Formatter.format(Formatter.java:2423)
   at java.lang.String.format(String.java:2797)
   at controllers.api.PublicAPI.renderAPIError(PublicAPI.java:176)
   at controllers.api.DeviceAPI.setEmailAddress(DeviceAPI.java:736)
   at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:557)
   at play.mvc.ActionInvoker.invoke(ActionInvoker.java:508)
   at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:484)
   at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:479)
   at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
   at Invocation.HTTP Request(Play!)

Спасибо!

3 ответа

Использование %% в строке форматера, когда вам нужно напечатать строку %:

String.format("sendOneSuccessCountRate: %7.2f%%"
              ,sendOneSuccessCountRate //0.95
             );

даст вам 95,00%

В строке сообщения знак% экранируется с другим%. Так что вам нужно будет удвоить его: %%
Например: "Бла бла% я бла" -> "Бла бла %% я бла"
В messageArgs String нет проблем со знаком%, и вам не нужно его экранировать

Если вы получаете java.util.UnknownFormatConversionException: Conversion = 'i' скорее всего вы используете %i в вашем message пытаться отформатировать целое число, это не правильно. Вы должны использовать %d отформатировать десятичное целое число. Полная поддерживаемая спецификация преобразования может быть найдена здесь.

Другие вопросы по тегам