Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用参数名而不是数字格式化消息?_Java_String Formatting - Fatal编程技术网

Java 如何使用参数名而不是数字格式化消息?

Java 如何使用参数名而不是数字格式化消息?,java,string-formatting,Java,String Formatting,我有点像: String text = "The user {0} has email address {1}." // params = { "Robert", "myemailaddr@gmail.com" } String msg = MessageFormat.format(text, params); 这对我来说不太好,因为有时我的翻译人员不确定{0}和{1}中的内容,而且如果能够重新编写消息而不担心参数的顺序,那就太好了 我想用可读的名称而不是数字来替换参数。大概是这样的: Str

我有点像:

String text = "The user {0} has email address {1}."
// params = { "Robert", "myemailaddr@gmail.com" }
String msg = MessageFormat.format(text, params);
这对我来说不太好,因为有时我的翻译人员不确定{0}和{1}中的内容,而且如果能够重新编写消息而不担心参数的顺序,那就太好了

我想用可读的名称而不是数字来替换参数。大概是这样的:

String text = "The user {USERNAME} has email address {EMAILADDRESS}."
// Map map = new HashMap( ... [USERNAME="Robert", EMAILADDRESS="myemailaddr@gmail.com"]
String msg = MessageFormat.format(text, map);
有没有一个简单的方法可以做到这一点

谢谢!
rob很容易自己做一个。这就是我使用的(函数
main()
仅用于测试代码):

import java.util.HashMap;
导入java.util.Map;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共类字符串模板{
最终私有字符串模板;
最终私有匹配器m;
静态最终私有模式keyptern=
模式。编译(\\$\{([a-zA-Z][a-zA-Z0-9\]*(\\.[a-zA-Z][a-zA-Z0-9\]*)*)\});
私有布尔blanknull=false;
公共字符串模板(字符串模板){
this.template=template;
this.m=keyptern.matcher(模板);
}
/**
*@param映射替换映射
*@return替换字符串
*/
公共字符串替换(映射)
{
这个.m.reset();
StringBuffer sb=新的StringBuffer();
while(this.m.find())
{
字符串k0=此.m.组();
字符串k=这个.m.组(1);
对象vobj=map.get(k);
字符串v=(vobj==null)
?(this.blanknull?“:k0)
:vobj.toString();
本m.附录替换(sb,匹配引用替换(v));
}
本·m·佩德泰尔(sb);
使某人返回字符串();
}
公共StringTemplate setBlankNull()
{
this.blanknull=true;
归还这个;
}
静态公共void main(字符串[]args)
{
StringTemplateT1=newStringTemplate(${this}是${foo}bar=${bar}${emergency.broadcasting.system}的${test});
t1.null();
Map m=新的HashMap();
m、 投入(“本”、“本*”);
m、 投入(“测试”,“测试*”);
m、 put(“foo”,“$$$aaa\\\\111”);
m、 put(“紧急广播系统”);
系统输出打印ln(t1.替换(m));
}
}

您可以为此使用
MapFormat
。请在此处查找详细信息:

输出:

1:用户Robert有电子邮件地址rhume55@gmail.com.


你的问题与以下方面密切相关: 您可以使用或其他模板库。但是会有一些痛苦,因为Java没有任何类型的映射文本。

静态最终模式替换\u Pattern=Pattern.compile(\\x24\\x7B([a-zA-Z][\\w\\x2E].*?\\x7D”);
static final Pattern REPLACE_PATTERN = Pattern.compile("\\x24\\x7B([a-zA-Z][\\w\\x2E].*?)\\x7D");

/**
 * Check for unresolved environment
 *
 * @param str
 * @return origin if all substitutions resolved
 */
public static String checkReplacement(String str) {
    Matcher matcher = REPLACE_PATTERN.matcher(str);
    if (matcher.find()) {
        throw LOG.getIllegalArgumentException("Environment variable '" + matcher.group(1) + "' is not defined");
    }
    return str;
}

// replace in str ${key} to value
public static String resolveReplacement(String str, Map<String, String> replacements) {
    Matcher matcher = REPLACE_PATTERN.matcher(str);
    while (matcher.find()) {
        String value = replacements.get(matcher.group(1));
        if (value != null) {
            str = matcher.replaceFirst(replaceWindowsSlash(value));
        }
    }
    return str;
}
/** *检查未解析的环境 * *@param str *@如果解决了所有替换,则返回原点 */ 公共静态字符串检查替换(字符串str){ 匹配器匹配器=替换模式匹配器(str); if(matcher.find()){ 抛出LOG.getIllegalArgumentException(“未定义环境变量'”+matcher.group(1)+“”); } 返回str; } //将str${key}中的替换为值 公共静态字符串替换(字符串str、映射替换){ 匹配器匹配器=替换模式匹配器(str); while(matcher.find()){ 字符串值=replacements.get(matcher.group(1)); if(值!=null){ str=matcher.replaceFirst(replaceWindowsSlash(value)); } } 返回str; }
但是您失去了所有格式选项(如##.##)

请参见
org.apache.commons.lang3

Map valuesMap = HashMap();
valuesMap.put("animal", "quick brown fox");
valuesMap.put("target", "lazy dog");
String templateString = "The ${animal} jumped over the ${target}.";
StrSubstitutor sub = new StrSubstitutor(valuesMap);
String resolvedString = sub.replace(templateString);

// resolvedString: "The quick brown fox jumped over the lazy dog."

我知道我的答案来得有点晚,但如果您仍然需要此功能,而不需要下载成熟的模板引擎,您可以查看(我是作者之一):

或者您可以链接参数:

String result = template("#{x} + #{y} = #{z}")
                    .args("x", 5, "y", 10, "z", 15)
                    .format();
System.out.println(result);

// Output: "5 + 10 = 15"

在内部,它使用StringBuilder通过“解析”表达式来创建结果,没有字符串连接,执行regex/replace。

Commons Lang的StrSubstitutorI可能是错误的,但看起来可以帮助您解决。相关:如果例如target是可选的,然后您希望使用空字符串而不是${target},要在映射中设置空字符串的唯一方法?@poyger没有尝试此方法,但您可能可以覆盖
map
以返回
,而不是
null
,用于未映射的键。截至今天,2018-02,此类已移动到commons text:
Map valuesMap = HashMap();
valuesMap.put("animal", "quick brown fox");
valuesMap.put("target", "lazy dog");
String templateString = "The ${animal} jumped over the ${target}.";
StrSubstitutor sub = new StrSubstitutor(valuesMap);
String resolvedString = sub.replace(templateString);

// resolvedString: "The quick brown fox jumped over the lazy dog."
Student student = new Student("Andrei", 30, "Male");

String studStr = template("#{id}\tName: #{st.getName}, Age: #{st.getAge}, Gender: #{st.getGender}")
                    .arg("id", 10)
                    .arg("st", student)
                    .format();
System.out.println(studStr);
String result = template("#{x} + #{y} = #{z}")
                    .args("x", 5, "y", 10, "z", 15)
                    .format();
System.out.println(result);

// Output: "5 + 10 = 15"