質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1905閲覧

javaのprintfの書式に変数を使う方法

Kehlani

総合スコア3

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/07/27 21:19

編集2020/07/27 21:57

前提・実現したいこと
現在学校の課題で入力された金額から紙幣、硬貨の枚数をカウントするプログラムを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
書式を定数にせず、桁数を変数化していなければ表示することはできました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/07/27 21:54

コードはマークダウンのcode機能を利用してご提示ください。
Kehlani

2020/07/27 22:02

申し訳ありません! おそらく修正できたとおもいますが、同時に自己解決もしました。 ありがとうございました!
m.ts10806

2020/07/27 22:14

ベストアンサーにした回答はどう見ても解決したものに見えませんが
Kehlani

2020/07/27 22:24

申し訳ありません。 眠かったせいか描いてる途中に事故解決を投稿してました。
m.ts10806

2020/07/27 22:44 編集

のようですね。事故になってますし。 回答も編集できますし、コードはマークダウンで。 「あとから見た人のために」も意識してもらえると。 https://teratail.com/help#resolve-myself
Kehlani

2020/07/28 00:14

お手数をお掛けしました。
guest

回答2

0

自己解決

ダブルクォーテーションを全て外し、書式にしたい変数と定数(String型)を+演算子で連結し、,区切りの後に代入したい変数を持ってくることで解決しました。
実際の解決文章
System.out.printf(FORMAT1+Len1+FORMAT2+Len2+FORMAT3 , BASICAMOUNT[i] , data.get(BASICAMOUNT[i]))

投稿2020/07/27 21:59

編集2020/07/27 22:22
Kehlani

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

書式部分の変数を1つずつダブルクォーテーションで囲み、それらを+で繋げたら出来ました。

起動ファイルが間違っていて実際には何も解決してませんでした。

投稿2020/07/27 21:26

編集2020/07/27 21:43
Kehlani

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問