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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

3回答

1352閲覧

JAVA ループで0埋めをしたい

退会済みユーザー

退会済みユーザー

総合スコア0

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/08/06 04:04

編集2020/08/06 04:22

前提・実現したいこと

textfieldに入力された文字を0で8桁で揃えたいです。

現在の原始的なやり方でなくてもいいです。
理想は文字数が8になるまでforかwhileでループさせ、0を1つずつ追加していく処理です。

例 txtCodeに入力→11 結果→sに00000011

発生している問題・エラーメッセージ

結果 入力→1 出力→01 正確には00000001と表示されてほしいです。

該当のソースコード

int size = 0; //文字数 int cut_size = 8; size = txtCode.getText().length();  if (size == 8) { s = txtCode.getText(); } else if (size > 8) { //8桁以上なら切り取る s = (txtCode.getText().substring(0, 8)); } else if (size < 8) { //8桁以下なら0を追加する zero = cut_size - size; switch (zero) { case 1: s = "0000000" + txtCode.getText() ; case 2: s = "000000" + txtCode.getText() ; case 3: s = "00000" + txtCode.getText() ; case 4: s = "0000" + txtCode.getText() ; case 5: s = "000" + txtCode.getText() ; case 6: s = "00" + txtCode.getText() ; case 7: s = "0" + txtCode.getText() ; } }

試したこと

for文で8以下の間0を文字列に結合する。→0が一つしか追加されず表示してしまう。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

ベストアンサー

色んな方法があります。簡単なものを3つほど。
** ※回答へのコメントを受けてコードと実行例を追記、修正しています: 2020/08/06 14:28 **

Java

1public class Main { 2 public static void main(String[] args) { 3 String s; 4 5 // (1) 整数ならString.format()を使えば良い 6 s = String.format("%08d", 12); 7 System.out.println(s); 8 9 // (2) 文字列だったら あらかじめ頭に"00000000"を付けてから結合し、 10 // 後ろから8文字を取り出せばよい。 11 String sn = "123"; 12 s = "00000000" + sn; 13 s = s.substring(s.length() - 8); 14 System.out.println(s); 15 16 // (3) あくまでforを使いたいなら、足りない分、前に"0"を付けるべく、生成。 17 sn = "78"; 18 StringBuilder sb = new StringBuilder(); 19 for (int i = sn.length(); i < 8; i++) { 20 sb.append("0"); 21 } 22 // 最後に追加する。 23 sb.append(sn); 24 System.out.println(sb.toString()); 25 26 // ※ここから追記 27 // (4) 28 // 最後にStringBuilderからStringにするときに加工すれば、パターン全てに対応できる。 29 // s = sb.substring(sb.length() - 8); 30 31 // (4)-a 8文字に満たない場合 32 sn = "678"; 33 sb = new StringBuilder(); 34 for (int i = sn.length(); i < 8; i++) { 35 sb.append("0"); 36 } 37 sb.append(sn); 38 s = sb.substring(sb.length() - 8); 39 System.out.println("4-a: " + s); 40 41 // (4)-b ちょうど8文字の場合 42 sn = "12345678"; 43 sb = new StringBuilder(); 44 for (int i = sn.length(); i < 8; i++) { 45 sb.append("0"); 46 } 47 sb.append(sn); 48 s = sb.substring(sb.length() - 8); 49 System.out.println("4-b: " + s); 50 51 // (4)-c 8文字を超える場合 52 sn = "123456789012345678"; 53 sb = new StringBuilder(); 54 for (int i = sn.length(); i < 8; i++) { 55 sb.append("0"); 56 } 57 sb.append(sn); 58 s = sb.substring(sb.length() - 8); 59 System.out.println("4-c: " + s); 60 } 61}

実行例です。

sh

100000012 200000123 300000078 44-a: 00000678 54-b: 12345678 64-c: 12345678

投稿2020/08/06 04:31

編集2020/08/06 05:29
dodox86

総合スコア9183

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

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

q_sane_q

2020/08/06 04:40

確かに末尾までならsubstringの引数1つでいいですね。 StringBuilderを持ち出すならinsertで直に頭に突っ込んでもいいかもしれないですね
退会済みユーザー

退会済みユーザー

2020/08/06 04:52

回答ありがとうございます!これからすべて試させていただきます!
退会済みユーザー

退会済みユーザー

2020/08/06 05:07

2,3番参考にさせていただいた通り実行できました、、、 ありがとうございます。 3番についてなのですが、今回は入力が8桁以下のものの実行ですが8桁以上、もともと8桁の場合は if (size == 8) { s = txtCode.getText(); System.out.println(s); } else if (size > 8) { //8桁以上なら切り取る s = (txtCode.getText().substring(0, 8)); System.out.println(s); } else if (size < 8) { StringBuilder sb = new StringBuilder(); for( int i = txtCode.getText().length() ; i < 8 ; i++) { sb.append("0"); } sb.append(s); System.out.println(sb.toString() + txtCode.getText()); の通り、各if内で表示する方法しかないでしょうか? 後ほどこの取り出した8桁を比較として使いたいので同じ変数にいれたいのですが可能ですか・・・?他はすべてString sに入れられています!
dodox86

2020/08/06 05:34

> 各if内で表示する方法しかないでしょうか? コードを読んで内容を咀嚼してみてください。8文字ちょうどについてはfor文実行時の初期化でint i = 8; になるので"0"が追加されず、そのまま利用されるかたちになります。つまり特別扱いの必要はありません。8文字を超えるケースについては最後にStringBuilderからString化するときに加工することで、対応することができます。つまり、それをしさえすれば3つのパターン全てに対応できます。回答のコード、(4)に追記しましたのでご覧ください。 ※でも、これらのパターンですとforループは使わなくていいですよね。。。"0000000"を頭に付けて末尾から8文字で切る方法と同じです。
dodox86

2020/08/06 05:38

>@q_sane_qさん > StringBuilderを持ち出すならinsertで直に頭に突っ込んでもいいかもしれないですね そうですね。私の回答では足りない"0"の数を意識してforループで愚直に追加する例として挙げました。ご指摘ありがとうございました。
guest

0

1文字だけ入れたらsizeは1ですし、8-1=7
ですよね。

投稿2020/08/06 04:23

m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2020/08/06 04:34

case 1: s = "0" + txtCode.getText() ; case 2: s = "00" + txtCode.getText() ; case 3: s = "000" + txtCode.getText() ; case 4: s = "0000" + txtCode.getText() ; case 5: s = "00000" + txtCode.getText() ; case 6: s = "000000" + txtCode.getText() ; case 7: s = "0000000" + txtCode.getText() ; 回答ありがとうございます!うっかりミスしておりました・・・ ありがとうございます。結合文字を真逆にしてみて実行したのですが1文字だけ入力したときは0が7つ付き無事8桁になりましたがほかの文字数で実行したときもそのまま7つゼロがついてしまいます。まだどこか条件文がまちがっているのでしょうか?
m.ts10806

2020/08/06 04:45

caseはbreakしないと次の条件も実行しますよね。
退会済みユーザー

退会済みユーザー

2020/08/06 04:51

ありがとうございます!できました! 本当に無知で申し訳ないです・・・
m.ts10806

2020/08/06 05:19

考えた上で地道にデバッグするしかないと思います。 時々、単なる四則演算部分(小学校で習う内容)でつまずく人がいるので。
m.ts10806

2020/08/06 05:20

ただ法則性があるので、別にswitchで分岐させる必要はないと思います。 「引き算の結果の数だけ0を頭に追加する」で済むので。
guest

0

とりあえず前に"00000000"をつけて
substring(元の文字列の長さ, 前0を付けた文字列の長さ)
ではどうですか?

投稿2020/08/06 04:21

q_sane_q

総合スコア610

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

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

退会済みユーザー

退会済みユーザー

2020/08/06 04:25

if (txtCode.getText().length() < 8) { ans = "00000000" + txtCode.getText() ; txtCode.setText(ans.substring(0, 8)); System.out.println(ans); } 回答ありがとうございます!このコードで試しましたが、substring が上手く動いていないようで切り取られません。どこか間違っていますでしょうか・・・?
q_sane_q

2020/08/06 04:28

ちょっと表現が微妙でしたね 元の文字列の長さとはtxtCode.getText()の長さのことです。 前0を付けた文字列の長さとはそのコードでいうとansの長さのことです。
q_sane_q

2020/08/06 04:31

あとsubstringは加工後の文字列を返しますが元の文字列は変わりません。
退会済みユーザー

退会済みユーザー

2020/08/06 04:43

txtCode.setText(ans.substring(txtCode.getText().length(), 8)); ということでしょうか? これをansに代入したいのですが、voidからStringのエラーになってしまいます・・・ public Stringにしたいのですが他でreturnを使っているかなのかできません・・・。
q_sane_q

2020/08/06 04:52

dodox86さんの回答により簡潔なバージョンがコード有りで書かれていますのでそちらを参照するとよいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問