代码之家  ›  专栏  ›  技术社区  ›  RudziankoÅ­

groovy中的字符串格式

  •  0
  • RudziankoÅ­  · 技术社区  · 8 年前

    %s 有价值的

    <server>
        <id>artifactory</id>
        <username>%s</username>
        <password>%s</password>
    </server>
    

    有吗 myString.format("name", "pass") groovy中的方法?

    3 回复  |  直到 8 年前
        1
  •  11
  •   daggett    8 年前

    groovy基于java,在java中有一个 format 中的方法 String 班

    https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#format(java.lang.String,%20java.lang.Object...)

    所以这应该管用

    def s='''<server>
        <id>artifactory</id>
        <username>%s</username>
        <password>%s</password>
    </server>'''
    println String.format(s, "name", "pass")
    
        2
  •  20
  •   ernest_k Petronella    8 年前

    GString :

    def name = "name"
    def pass = "pass"
    
    String formatted = """
    <server>
        <id>artifactory</id>
        <username>$name</username>
        <password>$pass</password>
    </server>
    """
    

    如果您的值以数组或集合的形式出现,您甚至可以使用 params[n] 而不是命名变量( $name ),如下所示:

    def params = ['name', 'pass']
    
    String formatted = """
    <server>
        <id>artifactory</id>
        <username>${params[0]}</username>
        <password>${params[1]}</password>
    </server>
    """
    

    template engines

    除此之外,您还可以使用普通的Java String.format :

    def formatted = String.format(myString, "name", "pass")
    
        3
  •  3
  •   Mike W    8 年前

    sprintf 来自DefaultGroovyMethods

    def name = "name"
    def pass = "pass"
    
    String formatted = """
    <server>
        <id>artifactory</id>
        <username>$name</username>
        <password>$pass</password>
    </server>
    """
    def f = sprintf( formatted, name, pass )
    
        4
  •  2
  •   Dmitrii Semikin    6 年前

    1. String.format 功能 see above ,它在groovy中被包装成便利函数 sprintf here here
    2. 基于 string interpolation 更具体地说 this case
    3. [编辑]正如ernest泷k在评论中所建议的,模板化的更好解决方案是 template engines . 它比bare String.format强大得多,但当然,需要一些学习。

    在我个人看来,第一个选项更适合最初提出的问题,因为它允许创建“模板”字符串,然后可以在代码中的任意位置使用任意参数任意次数。这似乎是原始问题中的用例。

    一般来说,字符串插值和sprintf有两个主要区别:

    1. 字符串插值不允许格式化值。
    2. {-> expr} ),它仍然没有明确的模板应用行为,而是依赖于外部定义的具有特定名称的变量,这在我看来不太可靠。

    作为模板用例的示例,请考虑:

    // can be defined in the same function, or as static variable in the class or even
    // in other class
    final String URL_TEMPLATE = 'http://fake.weather.com/rest/%s' // arg - country abbreviation
    
    // ...
    
    // Here we want to get weather for different countries.
    def countries = ['US', 'DE', 'GB']
    for (country in countries) {
        def url = URL_TEMPLATE.format(country)
        // send the request, accumulate the results
    }