Java:System.out.format IllegalFormatPrecision异常

时间:2016-02-15 18:48:44

标签: java formatting number-formatting

考虑以下循环来打印图表: 假设数组中的所有元素以及兴趣都有指定的值,为什么for循环(System.out.format,确切地说)会产生IllegalFormatPrecisionException?

   double[] sbalance; 
   double[] fbalance; 
   double[] interest; 
   sbalance = new double[months]; 
   fbalance = new double[months]; 
   interest = new double[months];  
   int deposit; 
    for (int q = 1; q <= months; q++)
   {
       System.out.format ("%18.2d%", sbalance[q-1]); 
       System.out.format ("%18.2d%", interest [q-1]); 
       System.out.format ("%18.2d%", (double)deposit);
       System.out.format ("%18.2d%", fbalance [q-1]); 
    }

即使我返回并重新声明我的数组为Double []而不是double [],程序也会产生相同的错误(我发现java与autoboxing不一致)

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

使用%f代替%d

前者格式化浮点数;后者格式整数。要求打印带有2位小数的整数是没有意义的。

答案 1 :(得分:0)

格式中的d表示十进制整数,而不是双精度。您应该使用f

答案 2 :(得分:0)

有两个问题。

  1. 在格式字符串中,import sys from PyQt5.QtCore import QSize from PyQt5.QtGui import QImage, QPalette, QBrush from PyQt5.QtWidgets import * class MainWindow(QWidget): def __init__(self): QWidget.__init__(self) self.setGeometry(100,100,300,200) oImage = QImage("test.png") sImage = oImage.scaled(QSize(300,200)) # resize Image to widgets size palette = QPalette() palette.setBrush(10, QBrush(sImage)) # 10 = Windowrole self.setPalette(palette) self.label = QLabel('Test', self) # test, if it's really backgroundimage self.label.setGeometry(50,50,200,50) self.show() if __name__ == "__main__": app = QApplication(sys.argv) oMainwindow = MainWindow() sys.exit(app.exec_()) 应为%18.2d
  2. 在格式字符串的末尾,%18.2f应为%。 (在cron文件中,%表示换行符,但在Java中,%表示换行符。)
  3. 这是工作代码:

    %n

    如果您希望在编译时收到IllegalFormatPrecision错误警告而不是遇到运行时崩溃,则可以使用Format String CheckerChecker Framework。如果您已安装并运行

    public class Interest {
    
      public static void main(String[] args) {
        int months = 12;
        int deposit = 1000;
    
        double[] sbalance; 
        double[] fbalance; 
        double[] interest; 
        sbalance = new double[months]; 
        fbalance = new double[months]; 
        interest = new double[months];  
        for (int q = 1; q <= months; q++) {
          System.out.format ("Month %d%n", q); 
          System.out.format ("%18.2f%n", sbalance[q-1]); 
          System.out.format ("%18.2f%n", interest [q-1]); 
          System.out.format ("%18.2f%n", (double)deposit);
          System.out.format ("%18.2f%n", fbalance [q-1]); 
        }
    
      }
    
    }
    

    然后编译器会警告您有关特定错误消息的问题。