如何在Java中正确格式化字符串?

时间:2016-04-20 20:23:42

标签: java string

我在Java中格式化String时遇到了困难。我目前正在尝试做的是创建一个toString方法,它将以时钟格式打印出整数,如:12:09:05,其中12是小时,9是分钟,5是秒。 / p>

这是我的Clock类中的代码,我一直在尝试设置格式化String:

//toString Method
public String toString(){
   String result = String.format("%02d:%02d:%02d"), hour, minute, second;
   return result;
}//End toString

我遇到的问题是,当我运行驱动程序时,一切正常,直到我尝试打印出时钟对象。

System.out.println(clock1);

我得到了这个例外:

  

线程中的异常" main" java.util.MissingFormatArgumentException:   格式说明符'%02d'在   java.util.Formatter.format(Formatter.java:2519)at   java.util.Formatter.format(Formatter.java:2455)at   java.lang.String.format(String.java:2940)at   Clock.toString(Clock.java:62)at   java.lang.String.valueOf(String.java:2994)at   java.io.PrintStream.println(PrintStream.java:821)at   TestClock.main(TestClock.java:69)

我已经阅读过字符串格式,我从中得到的是它与printf几乎相同。如果我在printf语句中使用它,我的代码工作正常。我查看了互联网上的示例,但它们都使用整数而不是变量来显示格式。

我希望有人可以通过正确的方式执行字符串格式化来启发我吗?我见过人们使用Formatter.format而不是String.format。我还想知道是否需要调用我的访问器而不是尝试直接使用String中的变量?

4 个答案:

答案 0 :(得分:7)

您需要将值作为参数传递给String.format()

String.format("%02d:%02d:%02d", hour, minute, second)

答案 1 :(得分:1)

@ shmosel的回答告诉你该怎么做;我认为解释你编写的内容但在运行时失败会很有用(尤其是因为我花了一些时间来理解它):

String result = String.format("%02d:%02d:%02d"), hour, minute, second;

您实际上是在这里声明了4个String变量:

  • result,其值为String.format("%02d:%02d:%02d");此方法调用失败,因为另外需要传递3个整数参数;
  • hourminutesecond,未初始化且未使用。

假设你有三个名为hourminutesecond的整数成员变量,你放错了括号:hour, minute, second需要进入括号:

String result = String.format("%02d:%02d:%02d", hour, minute, second);

答案 2 :(得分:1)

来自javadocs:

public static String format(String format, Object... args)
  

使用指定的格式字符串和返回格式化字符串   参数。

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

在内部调用Formatter#format(Locale l, String format, Object ... args),其中使用了Local.getDefault()

返回的Locale(如果未指定)

Formatter#format(Locale l, String format, Object ... args)具有此代码块,在您的情况下会产生异常。

                case 0:  // ordinary index
                    lasto++;
                    last = lasto;
                    if (args != null && lasto > args.length - 1)
                        throw new MissingFormatArgumentException(fs.toString());
                    fs.print((args == null ? null : args[lasto]), l);
                    break;

因为,您的案例中的args为null,因此您在MissingFormatArgumentException上获得了%02d

请注意,这是您在FormatString[]

中提取格式的方式
  

[0] - > %02D

     

[1] - > :

     

[2] - > %02D

     

[3] - > :

     

[4] - > %02D

因此,在索引0处,它会失败并抛出异常,你看。为了修复异常,您需要指定String#format(String, Object ...)的参数,在您的情况下,这些参数在外部指定,因为您忘记在format中传递它们。我可能会把它称为一个糟糕的设计,因为不应该允许null个参数,并且函数应该抛出NullPointerException消息Atleast one argument needs to be specified to format,但这就是它。希望,作为我对社区的第一个回答,我已经提供了很多细节。

答案 3 :(得分:0)

您需要移动小时分钟第二个变量 INSIDE {{1}的参数}}

像:

String.format