Java/Groovy String.Format 如何处理要格式化的字符串中的运行时%

Java/Groovy String.Format How to handle runtime % in the string to be formatted

我面临的问题是 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 方法,我们不希望调用者在调用它之前清理消息。

有没有办法在调用 String.format 之前在 formatMessage 方法中识别和转义 %?

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)
}