Java generating Strings with placeholders
JavaStringJava Problem Overview
I'm looking for something to achieve the following:
String s = "hello {}!";
s = generate(s, new Object[]{ "world" });
assertEquals(s, "hello world!"); // should be true
I could write it myself, but It seems to me that I saw a library once which did this, probably it was the slf4j logger, but i don't want to write log messages. I just want to generate strings.
Do you know about a library which does this?
Java Solutions
Solution 1 - Java
See String.format
method.
String s = "hello %s!";
s = String.format(s, "world");
assertEquals(s, "hello world!"); // should be true
Solution 2 - Java
StrSubstitutor
from Apache Commons Lang may be used for string formatting with named placeholders:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.1</version>
</dependency>
> Substitutes variables within a string by values. > > This class takes a piece of text and substitutes all the variables > within it. The default definition of a variable is ${variableName}. > The prefix and suffix can be changed via constructors and set methods. > > Variable values are typically resolved from a map, but could also be > resolved from system properties, or by supplying a custom variable > resolver.
Example:
String template = "Hi ${name}! Your number is ${number}";
Map<String, String> data = new HashMap<String, String>();
data.put("name", "John");
data.put("number", "1");
String formattedString = StrSubstitutor.replace(template, data);
Solution 3 - Java
This can be done in a single line without the use of library. Please check java.text.MessageFormat
class.
Example
String stringWithPlaceHolder = "test String with placeholders {0} {1} {2} {3}";
String formattedStrin = java.text.MessageFormat.format(stringWithPlaceHolder, "place-holder-1", "place-holder-2", "place-holder-3", "place-holder-4");
Output will be
test String with placeholders place-holder-1 place-holder-2 place-holder-3 place-holder-4
Solution 4 - Java
If you can change the format of your placeholder, you could use String.format()
. If not, you could also replace it as pre-processing.
String.format("hello %s!", "world");
More information in this other thread.
Solution 5 - Java
There are two solutions:
Formatter
is more recent even though it takes over printf()
which is 40 years old...
Your placeholder as you currently define it is one MessageFormat
can use, but why use an antique technique? ;) Use Formatter
.
There is all the more reason to use Formatter
that you don't need to escape single quotes! MessageFormat
requires you to do so. Also, Formatter
has a shortcut via String.format()
to generate strings, and PrintWriter
s have .printf()
(that includes System.out
and System.err
which are both PrintWriter
s by default)
Solution 6 - Java
You won't need a library; if you are using a recent version of Java, have a look at String.format
:
String.format("Hello %s!", "world");
Solution 7 - Java
If you can tolerate a different kind of placeholder (i.e. %s
in place of {}
) you can use String.format
method for that:
String s = "hello %s!";
s = String.format(s, "world" );
assertEquals(s, "hello world!"); // true
Solution 8 - Java
If you want to use some string to different placeholders, you could use pointers like this:
String.format("%1$s %2$s %1$s", "startAndEndText", "middleText");
Solution 9 - Java
Justas answer is outdated so I'm posting up to date answer with apache text commons.
StringSubstitutor
from Apache Commons Text may be used for string formatting with named placeholders:
https://commons.apache.org/proper/commons-text/javadocs/api-release/org/apache/commons/text/StringSubstitutor.html
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>1.9</version>
</dependency>
> This class takes a piece of text and substitutes all the variables > within it. The default definition of a variable is ${variableName}. > The prefix and suffix can be changed via constructors and set methods. > Variable values are typically resolved from a map, but could also be > resolved from system properties, or by supplying a custom variable > resolver.
Example:
// Build map
Map<String, String> valuesMap = new HashMap<>();
valuesMap.put("animal", "quick brown fox");
valuesMap.put("target", "lazy dog");
String templateString = "The ${animal} jumped over the ${target}.";
// Build StringSubstitutor
StringSubstitutor sub = new StringSubstitutor(valuesMap);
// Replace
String resolvedString = sub.replace(templateString);
Solution 10 - Java
The suggestion by https://stackoverflow.com/users/4290127/himanshu-chaudhary works quite well:
String str = "Hello this is {} string {}";
str = MessageFormatter.format(str, "hello", "world").getMessage();
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.8.0-beta4</version>
</dependency>