🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

9回答

10772閲覧

数値に3桁ごとにカンマを付けるにはどうすれば良いでしょうか?

ta.tatu

総合スコア12

Java

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

0グッド

1クリップ

投稿2019/11/14 09:48

編集2019/11/14 10:05

public

1 System.out.println(commaSeparatedString(123)); 2 System.out.println(commaSeparatedString(12345)); 3 System.out.println(commaSeparatedString(1234567)); 4 System.out.println(commaSeparatedString(-1234567)); 5 System.out.println(commaSeparatedString(123456789)); 6 System.out.println(commaSeparatedString(-123456789)); 7 8 } 9 10 11 private static char[] commaSeparatedString(int i) { 12 13 //文字列操作を行うためにStringBuilderを用意 14 StringBuilder sb = new StringBuilder(); 15 16 // numberを文字列にして追加 17 sb.add(char.class, toString(number)); 18 // 文字列の後ろから3桁毎にカンマを追加していく 19 20 //文字列の長さの3文字前に初期値を設定 21 22 int offset = sb.length() - 3; 23 24 //文字列の先頭まで繰り返す 25 while(offset < 0) { 26 // -123456等の場合に、 "-、123,456"となってしまわないように 27 // offsetが1でnumberがマイナスの場合は、カンマを追加しないように対処する 28 if(offset != 1 || number > 0) { 29 30 sb.insert(offset,","); 31 } 32 33 //次のカンマの位置は3文字前 34 offset -= 3; 35 36 37 38 39 40 41 } 42 } 43 44 } 45 46 47コード

ここまでしか出来ないし間違いが有ると思います。
教えてください。
※String.format()など、そのままズバリできてしまうメソッドの利用は禁止

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

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

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

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

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

m.ts10806

2019/11/14 10:12

課題なら自力でやりましょう。
ta.tatu

2019/11/14 10:14

頑張って見ます。
swordone

2019/11/14 12:11

返り値がchar[]なのはなぜですか?メソッド名がcommaSeparated"String"であることと食い違います。
guest

回答9

0

想像するものとは違うかもしれませんが、これだけでできます。

Java

1private static char[] commaSeparatedString(int i) { 2 return String.format("%,d", i).toCharArray(); 3}

投稿2019/11/14 09:56

LouiS0616

総合スコア35668

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

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

退会済みユーザー

退会済みユーザー

2019/11/14 10:08

それ以外とかいってるw
LouiS0616

2019/11/14 10:09

後出しされてもどうしようも無いのですけどね。
ta.tatu

2019/11/14 10:11

すいません。 ※String.format()など、そのままズバリできてしまうメソッドの利用は禁止 追記しました。
LouiS0616

2019/11/14 10:14

学習目的と言うことでしょうか。 しかしご提示のコードは唐突にnumberが表れていたり、ちょっと情報が足りないのでは。
guest

0

NumberFormatを使えば解決しませんか。

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

投稿2019/11/14 09:55

mutsuki22

総合スコア445

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

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

mutsuki22

2019/11/14 09:58

あ! もしかして自力のコードで実行したいってことですかね。 それだったらこの回答は駄目になりますね。
ta.tatu

2019/11/14 10:06

すいません。 追記しました。
guest

0

方針だけ。

  • 数字を 10 進での文字列にするときの方法を書く。そこに 3 桁ごとに "," を追加する処理ち追加する。

(数字の先頭には "," を付け加えないとか、 - 符号のことも考慮する)

  • 数字を 1000 で % と / で処理しながら文字列をつくっていく。そこに "," を売れこむ処理を追加する。

この場合も 数字の先頭の特別処理あ 符号のことも考慮する)

投稿2019/11/14 22:31

katoy

総合スコア22324

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

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

0

ベストアンサー

再帰呼出しを使ってみました。

Java

1 private static void comma(StringBuilder sb, long i) { 2 if (i < 1000) sb.append(i); 3 else { 4 comma(sb, i / 1000); 5 sb.append(',').append(i/100%10).append(i/10%10).append(i%10); 6 } 7 } 8 private static String commaSeparatedString(int number) { 9 StringBuilder sb = new StringBuilder(); 10 if (number >= 0) comma(sb, number); 11 else comma(sb.append('-'), -(long)number); 12 return sb.toString(); 13 }

愚直なやり方は、

Java

1 private static String commaSeparatedString(int number) { 2 String s = Integer.toString(number); 3 int n = s.length(), i = n % 3; 4 if (i == 0) i = 3; 5 else if (i == 1 && number < 0) i = 4; 6 String t = s.substring(0, i); 7 while (i < n) t += "," + s.substring(i, i += 3); 8 return t; 9 }

投稿2019/11/14 19:16

kazuma-s

総合スコア8224

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

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

0

末尾から3桁ずつ戻していって、正の数(符号なし)なら終点を0に、負の数(先頭に符号)なら終点を1にすればいい。

java

1 private static char[] commaSeparatedString(int i) { 2 3 //文字列操作を行うためにStringBuilderを用意 4 StringBuilder sb = new StringBuilder(); 5 sb.append(i); 6 int end = sb.charAt(0) == '-' ? 1 : 0; 7 for (int x = sb.length() - 3; x > end; x -= 3) { 8 sb.insert(x, ','); 9 } 10 char[] arr = new char[sb.length()]; 11 sb.getChars(0, sb.length(), arr, 0); 12 return arr; 13 }

投稿2019/11/14 16:23

編集2019/11/14 17:49
swordone

総合スコア20669

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

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

kazuma-s

2019/11/14 17:46

i -= 3 は x -= 3 の間違いではありませんか?
swordone

2019/11/14 17:49

すみません、つい癖で…
guest

0

そのまま、普段あたまで考えていることを愚直に書けばええのでは?

数字の後ろから見るのが面倒だったので、StringBuilderのreverse使ってるけど
別にlengthとindex(offset)の計算でもいいと思います。

java

1private static char[] commaSeparatedString(int i) { 2 StringBuilder ret = new StringBuilder(); 3 StringBuilder num = new StringBuilder("" + i); 4 num.reverse(); 5 6 for(int j = 1; j <= num.length(); j++) { // 仮引数は本当はiでなくnumberでは? 7 ret.append(num.charAt(j - 1)); 8 // if(3桁毎に次の文字が存在してかつ、ハイフンでないなら) { 9 if(j % 3 == 0 && j < num.length() && num.charAt(j) != '-') 10 ret.append(','); 11 } 12 } 13 return ret.reverse().toString().toCharArray(); 14}

投稿2019/11/14 13:22

編集2019/11/15 02:17
momon-ga

総合スコア4826

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

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

momon-ga

2019/11/15 01:59

ベストアンサー決まったので、if文の中身を記載 if(j % 3 == 0 && j < num.length() && num.charAt(j) != '-')
swordone

2019/11/15 03:09 編集

コメントしたあとで的外れだったことに気づき、削除
guest

0

String を返す形にしています.

java

1 static final int SEPARATE_WIDTH = 3; 2 private static String commaSeparatedString(int i) { 3 StringBuilder sb = new StringBuilder(); 4 //負数は正数化 5 long l = i; 6 if(l < 0) { 7 sb.append('-'); 8 l *= -1; 9 } 10 //文字列化 11 String s = ""+l; 12 //最初の1~SEPARATE_WIDTH文字を処理 13 int e = s.length() % SEPARATE_WIDTH; 14 if(e == 0) e = SEPARATE_WIDTH; 15 sb.append(s.substring(0, e)); 16 //残りをSEPARATE_WIDTH文字ずつ処理 17 for(int j=e; j<s.length(); j+=SEPARATE_WIDTH) { 18 sb.append(',').append(s.substring(j, j+SEPARATE_WIDTH)); 19 } 20 21 return sb.toString(); 22 }

投稿2019/11/14 16:16

編集2019/11/15 03:04
jimbe

総合スコア13202

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

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

kazuma-s

2019/11/14 17:47

commaSeparatedString(-2147483648) が正しく処理されません。
guest

0

確認してないけど、こんなの保守しろと言われたらイヤな奴

Java

1private static char[] commaSeparatedString(int val) 2{ 3 char[] chars = new char[14]; 4 int idx = 13; 5 boolean minus = false; 6 if (val < 0) { 7 minus = true; 8 val = -val; 9 } 10 do { 11 if (idx % 4 == 2) chars[idx--] = ','; 12 chars[idx--] = (char)('0' + (val % 10)); 13 val /= 10; 14 } while(val != 0); 15 if (minus) chars[idx--] = '-'; 16 if (idx == -1) return chars; 17 char[] result = new char[13 - idx]; 18 for (int i = 0; i < result.length; ++i) result[i] = chars[++idx]; 19 return result; 20}

投稿2019/11/14 15:51

編集2019/11/14 15:54
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kazuma-s

2019/11/14 17:49

commaSeparatedString(-2147483648) が正しく処理されません。
退会済みユーザー

退会済みユーザー

2019/11/14 22:16

それは符号反転したときにあぶれちゃいますねw 他が動いてることに感動しました ネタなのでバグらせときます
退会済みユーザー

退会済みユーザー

2019/11/14 22:40

回答多いので、特徴というか他との違いだけ書いときますね ・できあいのクラスを一切使っていない、完全独自処理 ・速度特化
guest

0

まあ、適当に書いたもの

末尾、もしくは, の前に数値が4つならんでいたら1文字目と2文字目の間に, を追加する

long a = -304564L; String b = Long.toString(a); Pattern p1 = Pattern.compile("([0-9])([0-9]{3})$"); Pattern p2 = Pattern.compile("([0-9])([0-9]{3},.*)$"); b = p1.matcher(b).replaceFirst("$1,$2"); while (p2.matcher(b).find()) { b = p2.matcher(b).replaceFirst("$1,$2"); } System.out.println(b);

清書版(ステップ数削減w)

long a = -30456423424563463L; String b = Long.toString(a); Pattern p = Pattern.compile("([0-9])([0-9]{3}(,.*)*)$"); while (p.matcher(b).find()) b = p.matcher(b).replaceFirst("$1,$2"); System.out.println(b);

投稿2019/11/14 13:14

編集2019/11/14 14:48
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問