有没有一种方法可以在变量中声明Groovy字符串格式?

4

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

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

将生成类似于以下代码:

ITN120AHKXNMUHKL

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

OCP${departmentNumber}XI${randomString}

PAN-${randomString}

它将输出:

OCP125XIBQHNKLAPICH

PAN-XJKLBPPJKLXHNJ

Groovy将解释并替换为相应的变量值。这是可能的吗,还是我必须手动解析占位符并手动执行string.replace?


也许我没有理解清楚你的问题,但是你所要求的可以用Groovy完成。你能否尝试使用一个样本脚本?我认为通过在样本上工作,你会得到你的答案。 - dmahapatro
我认为他希望“用户”输入一个GString,然后进行评估。 - cfrick
为什么不使用String.format()MessageFormat.format(),让用户选择模式呢? - JB Nizet
4个回答

6

我相信 GString 惰性求值 可以胜任:

deptNum = "C001"
randomStr = "wot"

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

assert code == "ITNC001wot"

randomStr = "qwop"

assert code == "ITNC001qwop"

0

我相信在这种情况下,您不需要使用GString的惰性求值,Java的普通String.format()就可以解决问题:

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'

希望这有帮助。

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

-1

对于三重双引号字符串

def password = "30+"

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接