我面临的问题是,使用String.format是运行时消息具有百分比字符,然后它出错了。
例如在常规中:
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)
}