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

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

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

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

Q&A

解決済

3回答

4353閲覧

キーボードから整数の値を入力すると、その値が3桁でカンマ区切り、漢数字で出力されるプログラムを作りたいです。

ssssa

総合スコア39

Java

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

0グッド

0クリップ

投稿2018/09/27 16:32

わからない事
実行結果にならい、キーボードから整数の値を入力すると、その値が漢数字で出力されるプログラムを作りたいです。
このとき、用いられるのは、1から9に対応するのが、一から九までの漢字で、ゼロは、〇と表示したいです。
また、この数字と漢字の対応は、HashMapを用いて作りたいです。
また、結果を出力する際には、3桁ごとに「,」(コンマ)を出力したいです。

※ヒント:入力は、数値としてではなく、文字列として受付、その中身が妥当かどうか調べるとよいとのことです。

期待値としては、
整数の値を入力してください:1198000 ← コンソールから整数の値を入力
変換結果:一,一九八,○○○

整数の値を入力してください:hello
整数の値を入力してください。

このような実行結果にしたく以下のコードを書かせていただきました。

書いたコードは以下になります。

Java

1public static void main(String[] args) throws IOException { 2 HashMap<String, String> list = new HashMap<String, String>(); 3 InputStreamReader isr = new InputStreamReader(System.in); 4 BufferedReader br = new BufferedReader(isr); 5 String buf; 6 while (true) { 7 System.out.print("整数の値を入力してください:"); 8 buf = br.readLine(); 9 list.put("0", "〇"); 10 list.put("1", "一"); 11 list.put("2", "二"); 12 list.put("3", "三"); 13 list.put("4", "四"); 14 list.put("5", "五"); 15 list.put("6", "六"); 16 list.put("7", "七"); 17 list.put("8", "八"); 18 list.put("9", "九"); 19 20 if (buf.equals("")) { 21 System.out.println("変換結果"); 22 23 } 24 } 25 } 26 27 private static void showResult(Map<String, String> c1) { 28 for (Map.Entry<String, String> a : c1.entrySet()) { 29 System.out.println(a.getKey() + " : " + a.getValue()); 30 } 31 } 32} 33

期待値通りではないです。
大変申し訳ございませんが、ご教示していただきたいです。

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

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

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

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

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

m.ts10806

2018/09/28 05:09

「期待通りではない」だけでは何が起きているかわかりませんので、実際に起きた問題を記載してください。
ssssa

2018/09/29 00:01

すみませんでした。記載がもれていました。実際起こっている問題は無限ループを終了せず、数字から漢数字に変換されていない状態です。
m.ts10806

2018/09/29 00:03

質問は編集できるので要件部分は都度質問に追記してください。
m.ts10806

2018/09/29 00:05

気になったのですが、「ヒント」として書かれているところの出どころは何でしょうか?学校の課題か何かの先生からのヒントということでしょうか?それとも何かしら調べた結果の記事にあったことということでしょうか?そのあたりもわかりやすいように追記してください。急にご自身とは違う他人事のようなコメントが出てきているのは質問としてはよくありません。
guest

回答3

0

ベストアンサー

3桁ごとにカンマをはさむプログラム例( Java版 )
上記より3桁ごとにカンマをはさむコードを引用

-修正-
@katoyさんの回答を参考に、3桁カンマ区切りにする処理をNumberFormatへ変更修正しました。
Java NumberFormatクラスを使って数値を3桁カンマ区切りにフォーマット(整形)する

java

1 2import java.io.BufferedReader; 3import java.io.IOException; 4import java.io.InputStreamReader; 5import java.util.HashMap; 6 7public class memo_qa148885 { 8 9 public static void main(String[] args) throws IOException { 10 HashMap<String, String> map = new HashMap<String, String>(); 11 InputStreamReader isr = new InputStreamReader(System.in); 12 BufferedReader br = new BufferedReader(isr); 13 String buf; 14 //辞書追加 15 map.put("0", "〇"); 16 map.put("1", "一"); 17 map.put("2", "二"); 18 map.put("3", "三"); 19 map.put("4", "四"); 20 map.put("5", "五"); 21 map.put("6", "六"); 22 map.put("7", "七"); 23 map.put("8", "八"); 24 map.put("9", "九"); 25 26 while (true) { 27 System.out.print("整数の値を入力してください:"); 28 buf = br.readLine(); 29 30 if (buf.equals("")) { 31 System.out.println("プログラムを終了します。"); 32 break; 33 } 34 35 //整数判定 36 Pattern p = Pattern.compile("^[0-9]*$"); 37 Matcher m = p.matcher(buf); 38 if(! m.find()) { 39 System.out.println("半角数字以外が入力されました。"); 40 continue; 41 } 42 43 //3桁カンマ区切りの文字列に変換 44 NumberFormat nf = NumberFormat.getInstance(); 45 String[] strNum = nf.format(Integer.parseInt(buf)).split(""); 46 47 //辞書参照して漢数字に変換 48 String strKanji = ""; 49 for (String s : strNum) { 50 strKanji += map.getOrDefault(s, ","); 51 } 52 53 //出力 54 System.out.println(strKanji); 55 } 56 } 57}

投稿2018/09/27 17:17

編集2018/09/27 21:50
opyon

総合スコア1009

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

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

ssssa

2018/09/29 00:05

opyon様:ありがとうございます。わからなくて時間ばかり過ぎていました。opyon様のおかげで解決できました。参考にさせていただきます。
guest

0

次の 文の jshell での実行例をご覧ください。

java

1import java.text.NumberFormat; 2NumberFormat nf = NumberFormat.getNumberInstance(); 3String KAN = "〇一二三四五六七八九"; 4String s = nf.format(12345); 5for (int i = 0; i < 10; i++) {s = s.replaceAll("" + i, "" + KAN.charAt(i));} 6System.out.println(s);

実行例:
イメージ説明

これをもとにプログラムを組めると思います。

追記;
map を使うことを見落としていました。
jshell で map の初期化を書くのはつらいので、書きませんが、
map (半角数字 -> 漢字数字) をつくったら

java

1for(Map.Entry<String, String> entry : map.entrySet()) { 2 s = s.replaceAll(entry.getKey(), entry.getValue()); 3}

のようにすれば良いです。

==> コメントで指摘を受けたので、Map.of で書いてみました。

java

1Map<String, String> mm = Map.of("0", "〇", "1", "一", "2", "二", "3", "三", "4", "四", "5", "五", "6", "六", "7", "七", "8", "八", "9", "九"); 2for(Map.Entry<String, String> e : mm.entrySet()){System.out.println(e.getKey() + " -> " + e.getValue());}

イメージ説明

参考情報

  • Java NumberFormatクラスを使って数値を3桁カンマ区切りにフォーマット(整形)する

https://www.javalife.jp/2018/01/20/post-243/

  • is there a way to use tr/// (or equivalent) in java?

https://stackoverflow.com/questions/7457886/

  • Javaの拡張ForループでMapをループ

https://qiita.com/kaneko_tomo/items/b9bd6775a78cb95d2a1b

投稿2018/09/27 21:19

編集2018/09/28 15:13
katoy

総合スコア22324

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

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

opyon

2018/09/27 21:28

>また、この数字と漢字の対応は、HashMapを用いて作りたいです。 この条件を満たさないのでは? NumberFormatは便利だと思います。
katoy

2018/09/27 21:55

ああ、見落としていました。
swordone

2018/09/28 00:48

jshellを使っているということはJava9以上なわけですから、Map.ofによる初期化ができるのでは?ギリギリ10組ですし。
ssssa

2018/09/29 00:02

ありがとうございます。参考にさせていただきます。
guest

0

2 つのメソッドを書いてみました。

  • 入力が数字列かの判定
  • 半角数字を漢字にして3桁ごとに区切りをいれる変換

標準入力からのデータ入力だと、テストを繰り返しおこなうのが大変なので、配列で入力する文字列を記載してあります。
(integer に収まらない範囲の長い数字列も扱えるようにしています。
integer に収まるものだけを対象にするなら、Integer.parseInt() でチェックしたり、NumberFormat で区切り文字を入れるようにすると良いです。)

このメソッドを使って、質問文のように標準入力から繰り返しデータ投入を行うようにするのは簡単にできるはずです。

HashMap でなく、 Map を使ってますが、 HashMap に書き換えるのも簡単にできるはずです。

java

1package teratail; 2 3import java.util.Map; 4 5public class memo_qa148885 { 6 7 private final static Map<String, String> TR_MAP = Map.of( 8 "0", "〇", "1", "一", "2", "二", "3", "三", "4", "四", "5", "五", 9 "6", "六", "7", "七", "8", "八", "9", "九"); 10 11 public static void main(String[] args) { 12 ; 13 String[] TESTS = { 14 "1", "12", "123", "1234", "12345", 15 "1.2", 16 "1234567890123456789012345678901234567890" }; 17 for (String buf : TESTS) { 18 task(buf); 19 } 20 } 21 22 static void task(String str) { 23 System.out.println("入力: [" + str + "]"); 24 if (is_valid(str)) { 25 System.out.println(to_kanji(str)); 26 } else { 27 System.out.println("半角数字以外が入力されました。"); 28 } 29 } 30 31 static boolean is_valid(String str) { 32 for (char c : str.toCharArray()) { 33 if (!Character.isDigit(c)) { 34 return false; 35 } 36 } 37 return true; 38 } 39 40 static String to_kanji(String str) { 41 for (Map.Entry<String, String> entry : TR_MAP.entrySet()) { 42 str = str.replaceAll(entry.getKey(), entry.getValue()); 43 } 44 String ans = ""; 45 int keta = str.length(); 46 for (char c : str.toCharArray()) { 47 if (ans.length() > 0 && keta % 3 == 0) { 48 ans += ","; 49 } 50 ans += c; 51 keta--; 52 } 53 return ans; 54 } 55} 56

実行例
イメージ説明

投稿2018/09/29 02:05

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問