java - 有什么方法可以分析传递给 String.format(...) 的模式

标签 java string format formatter

我想分析最终传递给的模式

String.format(String pattern, Object... args)

让我们考虑一下模式

"Integer is %d, String is %s"

有没有一种方法可以解析这个模式来确定

  1. arg0 将被格式化为数字
  2. arg1 将被格式化为字符串

显然,我可以使用正则表达式来做到这一点,但是当在模式中指定索引等时,这会变得更加困难。例如,让我们考虑另一种模式

"String is %2$s, Integer is %1$d"

这里 arg1 在 arg0 之前指定,但是这两个模式对于相同的参数具有相同的格式化程序。

我真的很想使用核心java类来解析模式并分析它,但似乎所有方法都是私有(private)的。在底层,String.format() 使用 Formatter .

最终,我尝试编写一个测试用例来验证我的各种语言翻译文件并发现冲突(例如,一种语言指定日期格式,另一种语言指定同一参数的数字格式)。

最佳答案

对于开源项目,您可以基于 Formatter (source) 的源代码构建自己的 TestFormatter 。然后,在 format() 方法的 switch case 中,记住参数类型如下:

代码:

argument = args[argumentIndex];

switch (conversion) {
    case 'b':
        argumentHashMap.put(new Integer(argumentIndex), Boolean.class);
        booleanFormat(argument, flags, width, precision, origConversion);
        break;
    case 's':
        argumentHashMap.put(new Integer(argumentIndex), String.class);              
        stringFormat(argument, flags, width, precision, origConversion);
        break;
    case 'd':
        argumentHashMap.put(new Integer(argumentIndex), Double.class);              
        decimalConversion(argument, flags, width, precision, origConversion);
        break;
    ...

我添加了带有 argumentHashMap 的行。

关于java - 有什么方法可以分析传递给 String.format(...) 的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24410152/

相关文章:

java - Java 的 JITter 如何影响测量代码速度?

c# 将 console.writeline 转换为字符串

angularjs - 如何在AngularJS中格式化日期

JAVA:使用计数器格式化字符串

javascript - 格式化日期?

java - 如何在 Gradle 中创建两个任务

java - 使用javac和java执行其他目录下带有外部类的类文件

java - 使用数组进行冒泡排序 alg

C函数删除所有大写字符

Java String 在 Scanner 中的 Boolean.parseBoolean 之前替换多个字符串?