前提・実現したいこと
現在学校の課題で入力された金額から紙幣、硬貨の枚数をカウントするプログラムをHCPから作りjavaでプログラミングしているのですが、先生からprintfの書式""の文字列型なので名前付き定数にし、また通貨の最大表示は3桁(1~10000までの通貨のカウント最大桁数が2枚、1枚の時はそれぞれ%,桁数dで合わせる)にしてほしいという問題を出されました。前置きが長くなりましたが分からないのはprintfの書式に変数(定数)を使う方法です。いくつか調べてみて試したのですがうまくいきませんでした。
他にいくつか制約がありますがprintfの質問には関係ないので省きます。
初めての質問でソースの書きすぎ、補足不足などあると思いますがお願いします。
発生している問題・エラーメッセージ
書式部分のダブルクォーテーションの変数名がそのまま繰り返し回数だけ標準出力される。
該当のソースコード
Java
1 2import java.io.BufferedReader; 3import java.io.IOException; 4import java.io.InputStreamReader; 5import java.util.HashMap; 6import java.util.Map; 7 8public class MoneyCount { 9 public static final int NUM0 = 0; 10 public static final int NUM1 = 1; 11 public static final int UPPER = 10000000; 12 public static final int[] BASICAMOUNT = {1,5,10,50,100,500,1000,5000,10000}; 13 public static final String FORMAT1 = "%,"; 14 public static final String FORMAT2 = "d円:"; 15 public static final String FORMAT3 = "d枚%n"; 16 public static final String E001 = "入出力エラーが発生しました。"; 17 public static final String W001 = "数値以外の値が入力されました。"; 18 public static final String W002 = "計算不可能な金額が入力されました。"; 19 public static final String I001 = "異常終了しました。"; 20 public static final String I002 = "再入力してください。"; 21 public static final String I003 = "金額を入力してください。"; 22 public static final boolean FALSE = false; 23 public static final boolean TRUE = true; 24 public static final Map<Integer , Integer> data = new HashMap<>(); 25 public static void main(String[] args) throws IOException { 26 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 27 int numCheck = NUM0; 28 int Len1 = BASICAMOUNT[BASICAMOUNT.length - NUM1]; 29 int Len2; 30 int num = NUM0; 31 String str; 32 String middle; 33 boolean flg = FALSE; 34 System.out.println(I003); 35 while(flg == FALSE) { 36 try{ 37 str = in.readLine(); 38 numCheck = Integer.parseInt(str); 39 while(numCheck >= UPPER || numCheck < NUM0) { 40 System.out.println(W002 + I002); 41 str = in.readLine(); 42 numCheck = Integer.parseInt(str); 43 } 44 flg = TRUE; 45 }catch(IOException e) { 46 System.out.println(E001 + I001); 47 e.printStackTrace(); 48 }catch(NumberFormatException e) { 49 System.out.println(W001 + I002); 50 } 51 } 52 for(int i = BASICAMOUNT.length - NUM1 ; i >= NUM0 ; i--)numCheck = CountCalc(BASICAMOUNT[i] , numCheck); 53 for(int i = BASICAMOUNT.length - NUM1 ; i >= NUM0 ; i--) { 54 if(data.get(BASICAMOUNT[i]) >= num)num = BASICAMOUNT[i]; 55 } 56 middle = String.valueOf(num); 57 Len2 = middle.length(); 58 for(int i = BASICAMOUNT.length - NUM1 ; i >= NUM0 ; i--)System.out.printf("FORMAT1+Len1+FORMAT2+Len2+FORMAT3" , BASICAMOUNT[i] , data.get(BASICAMOUNT[i])); 59 } 60 61 static int CountCalc(int amount , int money) { 62 int cnt = NUM0; 63 while(money >= amount) { 64 money -= amount; 65 cnt++; 66 } 67 data.put(amount , cnt); 68 return money; 69 } 70} 71
試したこと
書式部分のダブルクォーテーションを外す、Len1,Len2だけダブルクォーテーションを外すなど。
調べた内容 printf 書式 変数 java printf 使い方 など
補足情報(FW/ツールのバージョンなど)
IDE13
書式を定数にせず、桁数を変数化していなければ表示することはできました。
回答2件
あなたの回答
tips
プレビュー