Java / Groovy String.Format Как обрабатывать% времени выполнения в строке для форматирования - PullRequest
0 голосов
/ 10 января 2020

Проблема, с которой я сталкиваюсь, заключается в том, что в String.format сообщение во время выполнения имеет символ процента, а затем выдает ошибку.

Например, в groovy:

def q = "What are your %age?" 
def percent = 91
println formatMessage("Question: ${q} \n Answer: %d", percent)


String formatMessage(String message, Object... messageParams) {
return String.format(message, messageParams)
}

Теперь при вызове formatMessage, если аргумент сообщения подготавливается во время выполнения из интерполяции строки из переменной, имеющей допустимый символ%, это приводит к UnknownFormatConversionException

Теперь, когда метод formatMessage вызывается в нескольких местах, мы не хотим, чтобы вызывающая сторона очищала сообщение перед его вызовом.

Есть ли способ идентифицировать и экранировать% в методе formatMessage перед вызовом String.format?

1 Ответ

1 голос
/ 10 января 2020
def q = "What are your %age?" 
def percent = 91
println formatMessage("Question: ${q} \n Answer: %d", percent)

@groovy.transform.CompileStatic
String formatMessage(CharSequence message, Object... messageParams) {
    if(message instanceof GString){
        //if message is a GString then build a new one with replaced values
        message=new org.codehaus.groovy.runtime.GStringImpl(
                message.getValues().collect{ it instanceof CharSequence ? it.replaceAll('%','%%') : it } as Object[], 
                message.getStrings()
            )

    }
    return String.format(message as String, messageParams)
}

...