标签: messageformat

如何在Java中将长整数格式化为不带分隔符的字符串?

简单的问题,但我敢打赌,在这里询问可能比试图理解文档更直接MessageFormat:

long foo = 12345;
String s = MessageFormat.format("{0}", foo);
Run Code Online (Sandbox Code Playgroud)

观察值为"12,345".

期望值是"12345".

java messageformat

115
推荐指数
2
解决办法
5万
查看次数

我可以在java MessageFormat中转义大括号吗?

我想在java MessageFormat中输出一些大括号.例如,我知道以下不起作用:

MessageFormat.format("  public {0} get{1}() {return {2};}\n\n", type, upperCamel, lowerCamel);
Run Code Online (Sandbox Code Playgroud)

有没有办法逃避围绕"返回{2}"的大括号?

java escaping messageformat

61
推荐指数
3
解决办法
3万
查看次数

60
推荐指数
2
解决办法
3万
查看次数

具有适当复数的Java国际化(i18n)

我打算使用Java的标准i18n系统和复数形式的ChoiceFormat类,但后来意识到它不能处理某些语言的复杂多元规则(例如波兰语).如果它只处理类似英语的语言,那么它似乎有点无意义.

有什么选择来实现正确的复数形式?使用它们的利弊是什么?

java internationalization messageformat plural

33
推荐指数
1
解决办法
9002
查看次数

我应该将java.text.MessageFormat用于没有占位符的本地化消息吗?

我们正在为在Java 5上运行的Web应用程序本地化用户界面文本,并且我们如何输出在属性文件中定义的消息(java.util.Properties使用的类型)的困境.

某些消息包含将使用java.text.MessageFormat填充的占位符.例如:

search.summary = Your search for {0} found {1} items.
Run Code Online (Sandbox Code Playgroud)

MessageFormat很烦人,因为单引号是一个特殊字符,尽管在英文文本中很常见.您必须输入两个文字单引号:

warning.item = This item''s {0} is not valid.
Run Code Online (Sandbox Code Playgroud)

但是,应用程序1000个左右的消息中有四分之三不包含占位符.这意味着我们可以直接输出它们,避免使用MessageFormat,并保留单引号:

help.url = The web page's URL
Run Code Online (Sandbox Code Playgroud)

问题:我们应该为所有消息使用MessageFormat,以获得一致的语法,还是尽可能避免使用MessageFormat,因此大多数消息都不需要转义?

无论哪种方式都有明显的优点和缺点.

请注意,MessageFormat的API文档确认了该问题,并提出了一个非解决方案:

遗憾的是,在消息格式模式中使用引号的规则显示有些令人困惑.特别是,对于本地化者来说,单引号是否需要加倍并不总是显而易见的.确保通知本地化程序有关规则,并告诉他们(例如,通过使用资源包源文件中的注释)MessageFormat将处理哪些字符串.

java localization messageformat

11
推荐指数
1
解决办法
5997
查看次数

Java MessageFormat类线程是否安全?(与SimpleDateFormat相对)

我知道SimpleDateFormat和NumberFormat不是线程安全的.
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4101500

但是像MessageFormat这样的其他Format类呢?

Fortify 360将"MessageFormat.format(String,Object ...)"静态方法的使用标记为"Race Condition - Format Flaw"问题,但是当我分析MessageFormat的源代码时,我在那个方法中看到了,它创建一个MessageFormat本身的新本地实例.

Java MessageFormat类线程是否安全?

java thread-safety messageformat

8
推荐指数
2
解决办法
4885
查看次数

转义Java MessageFormat的单引号

关于MessagingFormat一般有几个问题,但我还没有发现任何可以解答我问题的问题.我知道,单引号会破坏模式.如果您使用MessageFormat或Log4j,"不"可能会破坏可能的占位符.

请参阅字符串中的一对单引号可用于引用除单引号之外的任何任意字符.例如,模式字符串"'{0}'"表示字符串"{0}",而不是FormatElement.单引号本身必须在整个String中用双引号引用''.

简单的例子:

@Test
public void test() {
    String pattern = "{0} doesn't show values ( {1}, {2}, {3}, {4} )";
    final Object[] args = { "Testpattern", 100, 200, 300, 400 };
    System.out.println(MessageFormat.format(pattern, args));
    pattern = pattern.replaceAll("(?<!')'(?!')", "''");
    System.out.println("Replaced singlequotes: " + MessageFormat.format(pattern, args));
}
Run Code Online (Sandbox Code Playgroud)

输出:

Testpattern doesnt show values ( {1}, {2}, {3}, {4} )
Replaced singlequotes: Testpattern doesn't show values ( 100, 200, 300, 400 )
Run Code Online (Sandbox Code Playgroud)

因此,如果我使用正则表达式替换所有单引号,它将起作用.我只是编写了正则表达式,试图仅使用正则表达式lookahead/lookbehind替换"single singlequotes".

正则表达式替换示例:

    doesn't -> doesn''t
    doesn''t -> …
Run Code Online (Sandbox Code Playgroud)

java messageformat

8
推荐指数
4
解决办法
1万
查看次数

MessageFormat中的嵌套选择子句?

我正在尝试用java.text.MessageFormat做一个简单的逻辑:

MessageFormat cf = new MessageFormat(
"{0,choice, 1<hello|5<{1,choice,1<more than one|4<more than four}}");

 Object[] array = {3, 1};
 System.out.println(cf.format(array));
Run Code Online (Sandbox Code Playgroud)

使用单词:如果第一个参数大于1,则打印"hello",如果大于5则比第二个参数大于1打印"多于一个"如果第二个参数大于4打印"超过4个" ".

我发现没有人说这是不可能的,但我得到一个IllegalArgumentException:

Choice Pattern incorrect: 1<hello|5<{1,choice,1<more than one|4<more than four}

有没有办法可以做到这一点?谢谢!

整个堆栈跟踪:

Exception in thread "main" java.lang.IllegalArgumentException: Choice Pattern incorrect:  1<hello|5<{1,choice,1<more than one|4<more than four}
at java.text.MessageFormat.makeFormat(Unknown Source)
at java.text.MessageFormat.applyPattern(Unknown Source)
at java.text.MessageFormat.<init>(Unknown Source)
at test.Test5.main(Test5.java:18)
Caused by: java.lang.IllegalArgumentException
    at java.text.ChoiceFormat.applyPattern(Unknown Source)
    at java.text.ChoiceFormat.<init>(Unknown Source)
    ... 4 more
Run Code Online (Sandbox Code Playgroud)

java messageformat

7
推荐指数
1
解决办法
1677
查看次数

Java MessageFormat Null值

在Java MessageFormat中处理空值的最佳方法是什么

MessageFormat.format("Value: {0}",null);

=> Value: null
Run Code Online (Sandbox Code Playgroud)

但实际上"价值:"会很好.

与日期相同

MessageFormat.format("Value: {0,date,medium}",null);

=> Value: null
Run Code Online (Sandbox Code Playgroud)

一个"价值:"会更加受到重视.

有没有办法做到这一点?我尝试过选择

{0,choice,null#|notnull#{0,date,dd.MM.yyyy – HH:mm:ss}}
Run Code Online (Sandbox Code Playgroud)

这会导致选择格式无效,检查"null"或"not null"是正确的吗?

java messageformat

7
推荐指数
1
解决办法
5695
查看次数

如何使用JTable使用MessageFormat打印多个标题行

我有一个表调用table并填充了数据,我还有一个MessageFormat标题我想用作标题来打印JTable这个是MessageFormat:

MessageFormat header = new  MessageFormat("Product: "
                    + task.getProductName() + "  Job: "
                    + task.getJobNumber() + "  Task: " + task.getTaskID()
                    );
Run Code Online (Sandbox Code Playgroud)

我想在标题中打印3行,一行用于Product,Job和Task

我打印的方式table是这样的:

table.print(JTable.PrintMode.FIT_WIDTH, header, null);
Run Code Online (Sandbox Code Playgroud)

我似乎无法弄清楚如何在3个单独的行中打印标题,我尝试使用它\n来创建一个新行,但这似乎不起作用.

java printing swing jtable messageformat

6
推荐指数
1
解决办法
1万
查看次数