尝试将变量Int实现到System.out.format中

时间:2014-02-12 22:08:39

标签: java system.out

我正在关注这些代码行:

System.out.println() ;
System.out.println("Item\tQuantity\tPrice\t    Total") ;

for (int i = 0; i < s_nextGame; i++) {
    result = s_quantity[i]*s_price[i] ;

    System.out.format("%11d\t%9.3f\t%11f\n", s_quantity[i],
        s_price[i], result) ;

我需要实现一个我声明为“s_name”的int变量,但是当我将它添加到format输出语句时,我得到了这个:

Item    Quantity        Price       Total
Exception in thread "main" java.util.IllegalFormatConversionException: d != [I
    at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4045)
    at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2748)
    at java.util.Formatter$FormatSpecifier.print(Formatter.java:2702)
    at java.util.Formatter.format(Formatter.java:2488)
    at java.io.PrintStream.format(PrintStream.java:970)
    at Inventory.printInventory(Inventory.java:85)
    at Inventory.main(Inventory.java:111)

当我没有它有点工作,而是打印这个:

Item    Quantity        Price       Total
      1        29.990         29.990000
      1        39.990         39.990000
      1        19.990         19.990000
      2        14.990         29.980000
Total = 119.950

正如您所看到的,没有任何内容弹出“items”部分。所以,我的问题是,如何将s_name添加到输出语句?

提前致谢。

我在代码的顶部声明了s_name: private static int [] s_name = new int [s_maxGames];

我也试过%s字符串格式,这是输出:

Item    Quantity        Price       Total
[I@71881149               1        29.990         29.990000
[I@71881149               1        39.990         39.990000
[I@71881149               1        19.990         19.990000
[I@71881149               2        14.990         29.980000
Total = 119.950

请原谅其正在进行中的工作

这是我的代码:

import java.io.File ;
import java.io.FileNotFoundException ;
import java.util.Scanner ;

public class Inventory {

  private static int s_maxGames = 10 ;

  private static int[] s_name = new int[s_maxGames] ;

  private static int[] s_quantity = new int[s_maxGames] ;

  private static double[] s_price = new double[s_maxGames] ;

  private static int s_nextGame = 0 ;

  public static void loadInventory(String fileName)
    throws FileNotFoundException
  {
    if ( (fileName != null) && (!fileName.equals("")) ) {
      Scanner input = new Scanner(new File(fileName)) ;
      String newLine = null ;

  while (input.hasNextLine() && s_nextGame < s_maxGames) {


    if (input.hasNext()) {
        String name = input.next() ;
    } else {
        System.err.println("ERROR: Expected a name in column 1 of line "
            + (s_nextGame+1) + " (not \"" + input.next() + "\").");
        System.exit(2);
    }


    if (input.hasNextInt()) {
        s_quantity[s_nextGame] = input.nextInt() ;
    } else {
        System.err.println("ERROR: Expected a int in column 2 of line "
            + (s_nextGame+1) + " (not \"" + input.next() + "\").");
        System.exit(2);
    }
    if (input.hasNextDouble()) {
        s_price[s_nextGame] = input.nextDouble() ;
    } else {
        System.err.println("ERROR: Expected a double in column 3 of line "
            + (s_nextGame+1) + " (not \"" + input.next() + "\").");
        System.exit(2);
    }
    newLine = input.nextLine() ;

    s_nextGame += 1 ;
  }
}

if (s_nextGame == 0) {
  System.out.println("WARNING: There are NO items on the list.") ;
}

return ;
  }



  public static void printInventory()
  {
    double result ;

System.out.println() ;
System.out.println("Item\tQuantity\tPrice\t    Total") ;

for (int i = 0; i < s_nextGame; i++) {
    result = s_quantity[i]*s_price[i] ;

    System.out.format("%s\t%11d\t%9.2f\t%11.2f\n", s_name[i], s_quantity[i],
        s_price[i], result) ;
}

return ;
}

public static double calculateTotalValue()
{
double total = 0.0 ;

for (int i = 0; i < s_nextGame; i++) {
  total = s_quantity[i]*s_price[i] + total ;
}

return total ;
}

public static void main(String[] args) throws FileNotFoundException {
{
if (args.length != 1) {
  System.err.println("Usage: java Inventory <input file name>") ;
  System.exit(1) ;
}

loadInventory(args[0]) ;
printInventory() ;
System.out.format("Total = %6.3f\n", calculateTotalValue()) ;

return ;
}
}}

当我跑

 System.out.format("%s\t%11d\t%9.3f\t%11f\n", s_name[i], s_quantity[i],
    s_price[i], result) ;

我明白了:

 Item    Quantity        Price       Total
 0                 1         29.99             29.99
 0                 1         39.99             39.99
 0                 1         19.99             19.99
 0                 2         14.99             29.98
 Total = 119.950

并用%d替换%s我得到完全相同的输出

我正在使用的txt文件,games.txt看起来像这样

 SuperKaup 1 29.99
 Survivor 1 39.99
 RyansMaze 1 19.99
 TeacherSimulator 2 14.99

4 个答案:

答案 0 :(得分:3)

此错误消息:

Exception in thread "main" java.util.IllegalFormatConversionException: d != [I

建议您似乎尝试将int [I数组转换为int,这是不合法的。您使用的s_name是否应该使用s_name[i]?如需更多帮助,请显示无效的实际代码并告知更多详细信息。

另外,我还猜测名称变量会包含一个String,因此需要使用%s格式说明符。


关于您的最新代码:

System.out.format("%s\t%11d\t%9.2f\t%11.2f\n", 
       s_name[i], s_quantity[i], s_price[i], result);

运行时会发生什么?

当你运行它时怎么样?

System.out.format("%d\t%11d\t%9.2f\t%11.2f\n", 
       s_name[i], s_quantity[i], s_price[i], result);

修改2

确定您的文本文件显示String作为每行的第一个标记。因此,您应该有一个String数组,而不是名称的int。你需要重新思考你的逻辑。


编辑3
建议:

  • 如果这是我的项目,我会创建一个使用File初始化的Scanner对象,称为fileScanner,并使用它来读取文件的每一行,只要while (fileScanner.hasNextLine())为真。我将该行存储在一个String变量中。
  • 在while循环中,我创建了另一个Scanner对象,比如名为lineScanner,用刚刚创建的String,line初始化。
  • 我使用lineScanner从行中提取我的标记。
  • 我会用数据填充数组。稍后你可能会创建一个类来将数据保存在一个对象中,但是现在,请填充并行数组。
  • 然后在while循环结束时,我将关闭我的lineScanner对象,以便释放系统资源。
  • 这里的关键是简化代码和逻辑,以便更容易理解和调试。
  • 你的名字数组(我称之为名字)将是一个String数组。我很确定你知道如何声明和初始化一个String数组,因为你已经完成了它的整数。

答案 1 :(得分:1)

s_name被定义为int数组。您应该使用%d而不是%s。

 int[] s_name = new int[s_maxGames];
 System.out.format("%d\t%11d\t%9.2f\t%11.2f\n", s_name[i], s_quantity[i],
    s_price[i], result) ;

所有项目都显示为0,因为代码中从不设置s_name。 0是整数的默认值。你应该这样做。

if (input.hasNextInt()) {
    // String name = input.next() ;
    s_name[s_nextGame] = input.nextInt();
} else {
    System.err.println("ERROR: Expected a name in column 1 of line "
        + (s_nextGame+1) + " (not \"" + input.next() + "\").");
    System.exit(2);
}

答案 2 :(得分:1)

就像@Hovercraft Full Of Eels解释的那样,你的逻辑存在一些问题。您似乎对s_name应该是int还是String的数组感到困惑,所以我认为这无关紧要。 String会更有意义。

由于您是Java的新手,您应该知道有一个List对象更适合这种事情(执行明显任务(如迭代)所需的编程较少)。我建议将所有数组更改为List,除非您尝试以某种方式优化代码(我怀疑您现在是这样)。

s_name作为List的{​​{1}}可以这样声明:

String

您可以在此处阅读List<String> s_name = new ArrayList<String>(); 的API文档:

http://docs.oracle.com/javase/7/docs/api/java/util/List.html

答案 3 :(得分:0)

我不确定你的其他一些代码是什么样的,但我想你可能希望你的System.out行看起来像:

    System.out.format("%s %11d\t%9.2f\t%11.2f\n", s_name[i], s_quantity[i], s_price[i], result)

我还为你的两个浮点格式说明符(%f)添加了.2,因为你正在处理钱,可能只想舍入到2位小数...

看起来您的s_name数组应该声明为字符串数组,而不是整数。但是,正如另一张海报所暗示的那样,你没有向我们展示这部分代码。