Daniel T.
Daniel T.

Reputation: 38430

Is there a way to declare a Groovy string format in a variable?

I currently have a fixed format for an asset management code, which uses the Groovy string format using the dollar sign:

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

Which will generate a code that looks like:

ITN120AHKXNMUHKL

However, I have a new requirement that the code format must be customizable. I'd like to expose this functionality by allowing the user to set a custom format string such as:

OCP${departmentNumber}XI${randomString}

PAN-${randomString}

Which will output:

OCP125XIBQHNKLAPICH

PAN-XJKLBPPJKLXHNJ

Which Groovy will then interpret and replace with the appropriate variable value. Is this possible, or do I have to manually parse the placeholders and manually do the string.replace?

Upvotes: 4

Views: 15438

Answers (4)

Will
Will

Reputation: 14559

I believe that GString lazy evaluation fits the bill:

deptNum = "C001"
randomStr = "wot"

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

assert code == "ITNC001wot"

randomStr = "qwop"

assert code == "ITNC001qwop"

Upvotes: 6

Ibrahim.H
Ibrahim.H

Reputation: 1195

I believe in this case you do not need to use lazy evaluation of GString, the normal String.format() of java would do the trick:

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'

Hope this helps.

Upvotes: 0

Mzzl
Mzzl

Reputation: 4136

I think the original poster wants to use a variable as the format string. The answer to this is that string interpolation only works if the format is a string literal. It seems it has to be translated to more low level String.format code at compile time. I ended up using sprintf

baseUrl is a String containing http://example.com/foo/%s/%s loaded from property file

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

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

Upvotes: 0

452
452

Reputation: 442

for Triple double quoted string

def password = "30+"

def authRequestBody = """
<dto:authTokenRequestDto xmlns:dto="dto.client.auth.soft.com">
   <login>[email protected]</login>
   <password>${password}</password>
</dto:authTokenRequestDto>
"""

Upvotes: -1

Related Questions