-5

スポーツ ゲームのシミュレーションをコーディングしていますが、ほとんどの場合問題なく動作します。コンパイルして実行します。指示では、私が printf と %.2f を使用することになっていることを前提としていますが、それをコードに取り込もうとすると、正しく実行されなくなります。助けていただければ幸いです。

import java.util.Scanner;

public class Team {

public String name;

public String location;

public double offense;

public double defense;

public Team winner;

public Team(String name, String location) {
  this.name = name;
  this.location = location;
  this.offense = luck();
  this.defense = luck();
}     

public double luck() {
    return Math.random();
}

Team play(Team visitor) {
    Team winner;
    double home;
    double away;
    home = (this.offense + this.defense + 0.2) * this.luck();
    away = (visitor.offense + visitor.defense) * visitor.luck();
    if (home > away)
      winner = this;
    else if (home < away)
      winner = visitor;
    else
      winner = this;
    return winner;
}

public static void main(String[] args) {
  Scanner s = new Scanner(System.in);
    System.out.println("Enter name and location for home team (on separate lines)");
                         String homeName = s.next();
                         String homeLocation = s.next();
                         Team homeTeam = new Team(homeName, homeLocation);
    System.out.println("Enter name and location for home team (on separate lines)");
                         String awayName = s.next();
                         String awayLocation = s.next();
                         Team awayTeam = new Team(awayName, awayLocation);
    Team winnerTeam = homeTeam.play(awayTeam);
    System.out.printf("Home team is:" + homeName + " from" + homeLocation + " rated" + homeTeam.offense + " (offense) +" + homeTeam.defense + " (defense)" + "\n");
    System.out.printf("Away team is:" + awayName + " from" + awayLocation + " rated" + awayTeam.offense + " (offense) +" + awayTeam.defense + " (defense)" + "\n");
    System.out.printf("Winner is:" + winnerTeam.name + " from" + winnerTeam.location + " rated" + winnerTeam.offense + " (offense) +" + winnerTeam.defense + " (defense)" + "\n");
}
4

2 に答える 2

2

あなたは方法を誤解していprintfます。この行とその後続行で行っている方法で文字列を連結しません (幅の理由で再フォーマットされています)。

 System.out.printf("Home team is:" + homeName +
                   " from" + homeLocation +
                   " rated" +  homeTeam.offense +
                   " (offense) +" + homeTeam.defense +
                   " (defense)" + "\n");

これは、古い同僚がPreparedStatementsSQL インジェクション攻撃を防ぐために使用しようとした方法に似ていますが、とにかく連結によってクエリ文字列を構築し、その試みを無効にしました。代わりに、次の署名を見てくださいprintf

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

最初の引数はフォーマット文字列で、 で始まる静的テキストとフォーマット ディレクティブを含みます%。通常の使用では、各フォーマット ディレクティブはメソッドの 1 つの引数に対応します。補間された変数をディレクティブに置き換えます。

文字列は通常%s、文字列の : でフォーマットされます。doubleは通常%f、 float (または double) の場合は : f でフォーマットされます。と文字の間の%文字はオプションです。それでは、補間した文字列をディレクティブに置き換えましょう。

"Home team is: "  + "%s" +             // Inserted a space.
" from"           + "%s" +
" rated"          + "%6.2f" +          // Six characters, 2 after the decimal.
" (offense)    +" + "%6.2f" +
" (defense)"      + "%n"               // %n means the appropriate way to get a new line
                                       // for the encoding.

今、私たちはそれをすべてまとめます:

System.out.format("Home team is: %s from %s rated %6.2f (offense) + %6.2f (defense)%n",
                   homeName, homeLocation, homeTeam.offense, homeTeam.defense);

これははるかに簡単です。さらに、フォーマット文字列で文字列を補間しないようにするもう 1 つの理由は、補間する文字列にパーセント記号自体が含まれている可能性があることです。これを無防備に書くとどうなるか見てみましょう:

String salesTax = "5%";
System.out.format("The sales tax is " + salesTax);

それは同等です

System.out.format("The sales tax is 5%");

残念ながら、パーセント記号はフォーマット ディレクティブとして扱われ、フォーマット ステートメントは例外をスローします。正しいのは次のいずれかです。

System.out.format("The sales tax is 5%%");

また

String salesTax = "5%";
System.out.format("The sales tax is %s", salesTax);

homeNameしかし、ここで、なぜとhomeLocationからを取らなかったのかを尋ねなければなりませんTeam。確かに、それらはTeamお互いよりも関連性があります。実際、Formattableインターフェイスを調べる必要があり、適切なコーディングを使用して次のように記述できます。

System.out.format("%s%, homeTeam); 
于 2013-09-17T02:07:24.087 に答える
1

これを試して:

public class A {
  public static void main(String[] args) {
    System.out.println(String.format("%.2f", 12.34123123));
  }
}
于 2013-09-17T01:56:23.450 に答える