Skip to content

Commit 6d61dae

Browse files
authored
Named Placeholders in String Formatting (eugenp#12576)
* Named Placeholders in String Formatting * assert notEqualTo
1 parent 2f48abf commit 6d61dae

2 files changed

Lines changed: 78 additions & 0 deletions

File tree

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.baeldung.namedformatting;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Map;
6+
import java.util.regex.Matcher;
7+
import java.util.regex.Pattern;
8+
9+
public class NamedFormatter {
10+
private NamedFormatter() {}
11+
12+
public static String format(String template, Map<String, Object> parameters) {
13+
StringBuilder newTemplate = new StringBuilder(template);
14+
List<Object> valueList = new ArrayList<>();
15+
16+
Matcher matcher = Pattern.compile("[$][{](\\w+)}").matcher(template);
17+
18+
while (matcher.find()) {
19+
String key = matcher.group(1);
20+
21+
String paramName = "${" + key + "}";
22+
int index = newTemplate.indexOf(paramName);
23+
if (index != -1) {
24+
newTemplate.replace(index, index + paramName.length(), "%s");
25+
valueList.add(parameters.get(key));
26+
}
27+
}
28+
29+
return String.format(newTemplate.toString(), valueList.toArray());
30+
}
31+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.baeldung.namedformatting;
2+
3+
import org.apache.commons.text.StrSubstitutor;
4+
import org.junit.jupiter.api.Test;
5+
6+
import java.util.HashMap;
7+
import java.util.Map;
8+
9+
import static org.assertj.core.api.Assertions.assertThat;
10+
11+
class NamedFormatterUnitTest {
12+
private static final String TEMPLATE = "Text: [${text}] Number: [${number}] Text again: [${text}]";
13+
14+
@Test
15+
void givenTemplateWithNamedParam_whenCallingCommonsTextStrSubstitutor_shouldGetExpectedResult() {
16+
Map<String, Object> params = new HashMap<>();
17+
params.put("text", "It's awesome!");
18+
params.put("number", 42);
19+
String result = StrSubstitutor.replace(TEMPLATE, params, "${", "}");
20+
assertThat(result).isEqualTo("Text: [It's awesome!] Number: [42] Text again: [It's awesome!]");
21+
}
22+
23+
@Test
24+
void givenTemplateWithNamedParam_whenCallingCommonsTextStrSubstitutorWithParameterNames_shouldNotWorkAsExpected() {
25+
Map<String, Object> params = new HashMap<>();
26+
params.put("text", "'${number}' is a placeholder.");
27+
params.put("number", 42);
28+
String result = StrSubstitutor.replace(TEMPLATE, params, "${", "}");
29+
30+
assertThat(result).isNotEqualTo("Text: ['${number}' is a placeholder.] Number: [42] Text again: ['${number}' is a placeholder.]");
31+
32+
assertThat(result).isEqualTo("Text: ['42' is a placeholder.] Number: [42] Text again: ['42' is a placeholder.]");
33+
}
34+
35+
@Test
36+
void givenTemplateWithNamedParam_whenCallingNamedFormatter_shouldGetExpectedResult() {
37+
Map<String, Object> params = new HashMap<>();
38+
params.put("text", "It's awesome!");
39+
params.put("number", 42);
40+
String result = NamedFormatter.format(TEMPLATE, params);
41+
assertThat(result).isEqualTo("Text: [It's awesome!] Number: [42] Text again: [It's awesome!]");
42+
43+
params.put("text", "'${number}' is a placeholder.");
44+
result = NamedFormatter.format(TEMPLATE, params);
45+
assertThat(result).isEqualTo("Text: ['${number}' is a placeholder.] Number: [42] Text again: ['${number}' is a placeholder.]");
46+
}
47+
}

0 commit comments

Comments
 (0)