String groovy中的字符串格式
我想用值替换String groovy中的字符串格式,string,groovy,string-formatting,String,Groovy,String Formatting,我想用值替换%s <server> <id>artifactory</id> <username>%s</username> <password>%s</password> </server> 人工制品 % % groovy中是否有myString.format(“name”、“pass”)方法?groovy基于java,java中String类中有format方法 所
%s
<server>
<id>artifactory</id>
<username>%s</username>
<password>%s</password>
</server>
人工制品
%
%
groovy中是否有
myString.format(“name”、“pass”)
方法?groovy基于java,java中String
类中有format
方法
所以这应该行得通
def s='''<server>
<id>artifactory</id>
<username>%s</username>
<password>%s</password>
</server>'''
println String.format(s, "name", "pass")
def s=''
人工制品
%
%
'''
println String.format(s,“name”,“pass”)
Groovy内置了对字符串插值的支持。您只需使用GString
:
def name = "name"
def pass = "pass"
String formatted = """
<server>
<id>artifactory</id>
<username>$name</username>
<password>$pass</password>
</server>
"""
如果字符串需要外部化,可以使用
除此之外,您还可以使用普通的JavaString.format
:
def formatted = String.format(myString, "name", "pass")
您可以使用fromDefaultGroovyMethods
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 )
def name=“name”
def pass=“pass”
字符串格式为“”
人工制品
$name
$pass
"""
def f=sprintf(格式化、名称、过程)
在一个地方收集上述答案和评论,有两种方法:
String.format
功能,该功能在groovy中封装为便利函数sprintf
请参见例如或{->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
}
这个解决方案不容易使用字符串插值。当然,我承认,也可以基于字符串插值构建解决方案,但看起来会有很大不同。作为另一种变体,可以将字符串类用作一个类别:
use(string){println s.format(“name”,“pass”)}
将这样的方法添加到StringGroovyMethods
中可能会很好。这应该是公认的答案。不是因为另一个不工作,而是groovy不是java,如果您要在groovy中键入java。。。那么groovy的用途是什么?(间接费用?)国际海事组织,这不应被接受。尽管字符串插值在大多数情况下都可以完成这项工作,其中字符串格式化已经完成,但它并不是100%替换(特别是这里解释的方法)。不同之处在于,当使用“格式”时,就有一个模板,可以使用不同的参数多次格式化,并且可能发生在完全不同的地方。相反,字符串插值是立即计算的(除非使用${->expr}
来启用延迟计算),但即使在这种情况下,它的使用方式也略有不同。关于字符串插值的另一点是(据我所知),它不支持精确的格式设置(即指定值的格式)。对于当前的问题来说,这并不重要,但如果要插入的值是双精度值,那么它可能更相关。@DmitriiSemikin我认为您的评论是关于一个没有被问到的问题。如果问题是关于模板的,那么我会建议,但仍然不是String.format()
。一个被接受的答案总是OP的选择,这就是为什么在许多好答案中有一个(或没有)被接受的答案是相当普遍的。这从来都不是问题。@ernest_k同意你的观点。我不知道“模板引擎”。从您的链接中,我无法理解它是否已经是Groovy的一部分,或者它是否只是计划包含在Groovy中(或者它是外部库?)。此外,对于简单的使用(如编写快速和肮脏的脚本),如果您不知道模板引擎是如何工作的,那么使用printf仍然更容易:)这里的工作是插值,而不是sprintfdef=formatted
将提供完全相同的结果。实际上,如果你使用def=sprintf(格式化为“hello”,“dude”)
你不会有任何不同的结果这里提到的snprintf
是完全有效的,但是正如@saamorim所提到的,这个例子是错误的:它使用字符串插值,这并不能完全回答这个问题。此外,提供的链接形式上是有效的,并不能真正提供有用的信息。类似这样的东西(谷歌的第一个结果)更相关:[或[。重要的细节是,使用标准Java格式化程序[
// 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
}