Java MessageFormat - 替换索引处的值

时间:2013-01-09 14:44:13

标签: java messageformat

我有这样的字符串:

{0}/suhdp run -command "suhilb" -input /sufiles/{1} -output /seismicdata/mr_files/{2}/ -cwproot {3}

第0和第3个索引的值需要先替换。稍后,第一个和第二个索引将被替换(在已经部分格式化的字符串上)并最终使用。

我使用ChoiceFormat玩了一下但是无法用MessageFormat类来管它以实现我想要的目标。

欢迎任何指示!

3 个答案:

答案 0 :(得分:2)

由于您没有一次填写所有值,我建议您使用构建器:

public class MessageBuilder
{
    private final String fmt;
    private final Object[] args;

    public MessageBuilder(final String fmt, final int nrArgs)
    {
        this.fmt = fmt;
        args = new Object[nrArgs];
    }

    public MessageBuilder addArgument(final Object arg, final int index)
    {
        if (index < 0 || index >= args.length)
            throw new IllegalArgumentException("illegal index " + index);
        args[index] = arg;
        return this;
    }

    public String build()
    {
        return MessageFormat.format(fmt, args);
    }
}

这样你就可以:

final MessageBuilder msgBuilder = new MessageBuilder("{0}/suhdp run -command \"suhilb\" -input /sufiles/{1} -output /seismicdata/mr_files/{2}/ -cwproot {3}", 4)
    .addArgument(arg0, 0).addArgument(arg3, 3);

// later on:
msgBuilder.addArgument(arg1, 1).addArgument(arg2, 2);
// print result
System.out.println(msgBuilder.build());

这段代码可能缺少一些错误检查等,但它远非最佳,但你明白了。

答案 1 :(得分:0)

如果您确定字符串中没有使用特定字符串{somethinig}(因为它似乎是这种情况),为什么不将字符串保持原样并使用String.replace将其更改为你以后有什么价值?

答案 2 :(得分:0)

这有用吗?

最初应引用第二阶段应替换的占位符。

public static void main(String[] args) {
    final String partialResult = MessageFormat.format("{0} '{0}' '{1}' {1}", "zero", "three");
    System.out.println(partialResult);
    final String finalResult = MessageFormat.format(partialResult, "one", "two");
    System.out.println(finalResult);
}

然后您的格式字符串变为:

{0}/suhdp run -command "suhilb" -input /sufiles/'{0}' -output /seismicdata/mr_files/'{1}'/ -cwproot {1}