有没有办法在变量中声明Groovy字符串格式?

时间:2014-09-24 21:18:10

标签: groovy

我目前有一个资产管理代码的固定格式,它使用美元符号使用Groovy字符串格式:

def code = "ITN${departmentNumber}${randomString}"

这将生成如下代码:

  

ITN120AHKXNMUHKL

但是,我有一个新的要求,即代码格式必须是可自定义的。我想通过允许用户设置自定义格式字符串来公开此功能,例如:

  

OCP $ {departmentNumber} XI $ {randomString}

     

PAN - $ {randomString}

将输出:

  

OCP125XIBQHNKLAPICH

     

PAN-XJKLBPPJKLXHNJ

然后,哪个Groovy将使用适当的变量值进行解释和替换。这是可能的,还是我必须手动解析占位符并手动执行string.replace?

4 个答案:

答案 0 :(得分:5)

我相信GString lazy evaluation符合条款:

deptNum = "C001"
randomStr = "wot"

def code = "ITN${deptNum}${->randomStr}"

assert code == "ITNC001wot"

randomStr = "qwop"

assert code == "ITNC001qwop"

答案 1 :(得分:0)

我认为原始张贴者想使用变量作为格式字符串。答案是字符串插补仅在格式为字符串文字时才有效。似乎必须在编译时将其转换为更底层的String.format代码。我最终使用了sprintf

baseUrl是一个包含从属性文件加载的http://example.com/foo/%s/%s的字符串

def operation = "tickle"
def target = "dog"
def url = sprintf(baseUrl, operation, target)

url
===> http://example.com/foo/tickle/dog

答案 2 :(得分:0)

我相信在这种情况下,您不需要使用GString的惰性求值,Java的常规def format = 'ITN%sX%s' def code = { def departmentNumber, def randomString -> String.format(format, departmentNumber, randomString) } assert code('120AHK', 'NMUHKL') == 'ITN120AHKXNMUHKL' format = 'OCP%sXI%s' assert code('120AHK', 'NMUHKL') == 'OCP120AHKXINMUHKL' 可以解决问题:

 java.lang.OutOfMemoryError

希望这会有所帮助。

答案 3 :(得分:-1)

for Triple double quoted string

def password = "30+"

def authRequestBody = """
<dto:authTokenRequestDto xmlns:dto="dto.client.auth.soft.com">
   <login>support@soft.com</login>
   <password>${password}</password>
</dto:authTokenRequestDto>
"""