【问题标题】:Java/Groovy String.Format How to handle runtime % in the string to be formattedJava/Groovy String.Format 如何处理要格式化的字符串中的运行时百分比
【发布时间】:2020-01-10 15:57:32
【问题描述】:

我面临的问题是,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 方法中识别和转义 %?

【问题讨论】:

  • 使用%s而不是${q}并且也通过它?
  • 使用 %%age 代替 %age

标签: java string groovy format string.format


【解决方案1】:
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)
}

【讨论】:

  • 这真的很棒。不知道我们可以迭代插值字符串中的值。这绝对解决了使用 groovy 字符串插值的问题,但是当使用普通字符串连接时(参见下面的示例),问题仍然存在。关于如何解决的任何想法。 println formatMessage("问题:" + q + "\n 答案:%d", 百分比)
  • 所以,将q 放入参数中,就像为percent 所做的那样:formatMessage("Question: %s \n Answer: %d", q, percent)
  • 问题是我们无法控制人们会放什么。因此问题。
  • 格式化是一种元编程。如果您让用户能够使用占位符 %d,然后教他们使用 %% 转义每个 %
  • 这正是我的看法,但我们希望尽可能避免出现极端情况。在这种情况下,GString 解决方案很有帮助。谢谢@daggett。
猜你喜欢
  • 2017-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
相关资源
最近更新 更多