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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

Q&A

2回答

3212閲覧

Java; 文字列のフォーマットを複数指定するには

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/04/24 04:27

編集2022/01/12 10:55

初学者です

今テキストファイルから文字列を読み込んでフォーマットを指定して出力したいのですが、フォーマットを複数指定して変更するにはどうすればいいのでしょうか

今ファイルを1行ずつ読み込んでいます

java

1import java.io.*; 2import java.util.Scanner; 3 4public class GroceryCart 5{ 6 public static void main(String[] args) throws FileNotFoundException 7 { 8 String fileName = "file.txt"; 9 Scanner scanner = new Scanner(new File(fileName)); 10 11 try { 12 while (scanner.hasNextLine()) { 13 String line = scanner.nextLine(); 14 System.out.printf(line); 15 } 16 } finally { 17 scanner.close(); 18 } 19 } 20}

例えば読み込むファイルが

apple 100 5 banana 30 10 curry rice 500 1

というような場合、どのように名前、 値段 量 とそれぞれに書式の指定を加えることができるのでしょうか

基本的すぎる質問かもしれませんが、回答していただけるとありがたいです

追記

実現したい出力イメージは

Apple $100.0 5 500 Banana $30.0 10 300 Curry Rice $500.0 1 500

名前の左揃え、
それ以外のカラムの右揃えと最初の文字をUppercase にすること、値段の部分の$, 小数点の追加、また最後のカラムに 値段* 量 を出力することです

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

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

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

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

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

unz.hori

2018/04/24 04:44

出力イメージを追記してください
unz.hori

2018/04/24 05:06

名前以外は右揃えかぁ。桁揃えするには全てを読み込んでから出力しなきゃなんないけどそれ以外はprintfとかSystem.out.printでなんとかなるなぁ
unz.hori

2018/04/24 05:08

あ、最初の名前の最大桁数が分かればあとは何とかなるか。printfの書式設定で
unz.hori

2018/04/24 05:11

名前の最大桁を決め打ちすればSystem.out.printfでいけると思います。まずはAPIの仕様を確認してください
unz.hori

2018/04/24 05:39

名前の最初をUppercaseにするのはいいが、問題はCurry Riceで空白で分割できない。(名前の終わりを判断できない)
guest

回答2

0

あくまで参考例です。入力値が異常な場合の動作は考えていません。
※.名前が空白区切りで数値を含む場合は正しく動きません。
※.ファイル入力部は省略して文字列の配列で代用しています。

Java

1package answer.of.teratail; 2 3public class FormatTest2 { 4 5 public static void main(String[] args) { 6 7 String inputStr[] = { 8 "apple 100 5", 9 "banana 30 10", 10 "curry rice 500 1" 11 }; 12 13 for (String line : inputStr) { 14 String token[] = line.split(" "); 15 String name = null; 16 int price = 0; 17 int number = 0; 18 StringBuffer sb = new StringBuffer(); 19 for (String word : token) { 20 try { 21 if (price != 0) { 22 number = Integer.parseInt(word); 23 } else { 24 price = Integer.parseInt(word); 25 } 26 } catch(NumberFormatException e) { 27 word = word.substring(0, 1).toUpperCase() + word.substring(1); 28 sb.append(word).append(" "); 29 name = sb.toString(); 30 } 31 } 32 33 System.out.printf("%-12s %6s %6s %6d\n", 34 name, 35 "$" + price + ".0", 36 number, 37 price * number 38 ); 39 } 40 } 41}

投稿2018/04/24 06:04

unz.hori

総合スコア1057

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

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

unz.hori

2018/04/24 06:05

fuzzballさんの名前認識の方が正攻法かな。
guest

0

  1. String.splitで分割。
  2. キャピタライズは面倒臭いのでApache Commons TextWordUtilsクラスのキャピタライズ関連のメソッドを使う。
  3. String.formatで整形。

投稿2018/04/24 05:18

編集2018/04/24 06:58
fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2018/04/24 05:38

単純にsplitすると最後の行だけ4列になってしまいます。
fuzzball

2018/04/24 05:54

それは整形時になんとでもなるでしょう。
unz.hori

2018/04/24 05:57

そこがこれのキモと言えばキモ。名前の終わりをどう判断するか。例えばInteger.parseInt()でNumberFormatExceptionが発生する場合は文字列(名前の一部)として連結してくとかね。
fuzzball

2018/04/24 06:00 編集

分割後の、(先頭)〜(最後から3番目)が名前です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問