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

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

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

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

Q&A

解決済

6回答

17680閲覧

【Java】先頭の0が落ちてしまう【int型】

t.z

総合スコア21

Java

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

0グッド

0クリップ

投稿2020/04/04 18:55

###問題点
文字列の数字だけを抽出したいのですが、どうしても先頭に0があると落ちてしまいます。
int型として010を出力したいのです。

ご回答、よろしくお願いします。

Java

1  String str = "0n10yh"; 2  int r = Integer.parseInt(str.replaceAll("\D","")); 3  System.out.print(r); 4 5//10

Java

1 2  String str = "0n10yh"; 3  String b = str.replaceAll("\D",""); 4  int r = Integer.parseInt(b); 5  System.out.print(r); 6 7//10

###質問
0. ゼロ落ちする理由はint型だからですよね。
0. 解決策はありますか。
###今のところの解決策
先頭が0の場合とそれ以外で場合分けすることしかできませんが、それだといくつ先頭に0があるのかわからないので不十分です。

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

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

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

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

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

guest

回答6

0

先頭の0を落としたくない、ということであるなら、int型を使ってはダメです。
文字列にしときましょう

投稿2020/04/04 22:48

y_waiwai

総合スコア87774

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

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

t.z

2020/04/05 02:36

そうなりますよね。ご回答ありがとうございます。
guest

0

ベストアンサー

「数値とは何か」を考えればわかることですが、文字列を数値にした時点で、前に0があったのかとか、何個あったのかという情報は消えます。
出力する場合は、再度文字列に変換するわけですが、情報が無いものはどうしようもないです。

・再文字列化の際に先頭に決まった個数の0を付ける
・再文字列化の際に3桁など長さを決めて3桁に足りない部分は先頭に0を埋める

等は可能です。後者はSystem.out.printf等が使えます。

ということで、「先頭0のあった元の桁数」を保持したいなら、文字列のまま処理するか、数値化したものと文字列のままのものと両方保持するか、数値化したものと文字列長を保持するかですね。

投稿2020/04/04 23:15

otn

総合スコア84529

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

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

t.z

2020/04/05 02:37

System.out,printfは最近出会って何かなと思っていたのですが、そういうことだったのですね。具体的にありがとうございます。
guest

0

0始まりの数字列を数値として持ちたいとき、私が以前取った方法として111…10で埋めるというものがあります。(その時は2進数でしたが10進数でも同様にできます)

例:
1111110010 → 010
1111111010 → 10
0100000010 → 100000010

文字列で持つ方法や桁数を追加で持つ方法の方が出力処理が楽だと思いますが。

投稿2020/04/05 05:25

ikadzuchi

総合スコア3047

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

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

t.z

2020/04/05 06:05

ご回答ありがとうございます。1に続く0は消えるのが1つだから0をふたつ続ければ落ちるのが1つだけということですか?どう出力したら例のようになるのか、もう少し詳しくお願いできますか。
ikadzuchi

2020/04/05 16:25

エンコード方法について考えていたので出力については深く考えていませんでしたが、例えば、 桁数固定の0埋め文字列にして、左から全ての"1"を削除し、左から1つの"0"を削除する という方法でいけるとおもいます。
t.z

2020/04/06 13:41

なるほど。おもしろいです。ご返信ありがとうございます。
guest

0

intに変換する必要がないのでは?

java

1  String str = "0n10yh"; 2  String r = str.replaceAll("\D",""); 3  System.out.print(r);

投稿2020/04/05 02:05

swordone

総合スコア20651

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

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

t.z

2020/04/05 02:38

私はintに変換する必要がないと思うのですが...。ご回答ありがとうございます。
swordone

2020/04/05 04:25

「私は」ってことは、これは学校の課題などの類ですか?
t.z

2020/04/05 05:34

海外のプログラミングサイトの課題だったものを思い出して自分流に考え直したものという感じです。ifで分岐して「正解」が出ましたが、正しい正解ではなかったのだろうなと。 サイト由来の記憶は「文字と数字混合のstringから数字を抽出してint型で頭0で出力する」なので、"0n10yh"などは私の作った文字列です。
guest

0

int型が先頭部分の0を保持できないのは仕様上どうしようもないので、
数値のintを桁数を合わせて配列で持っておいて文字列として得たい時だけ桁数で0埋めするしかないのでは。

java

1String str = "0n10yh"; 2String b = str.replaceAll("\D",""); 3int[] r = {Integer.parseInt(b), b.length()}; 4System.out.print(String.format("%0" + r[1] + "d", r[0])); 5//010

投稿2020/04/05 00:16

yureighost

総合スコア2183

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

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

t.z

2020/04/05 02:38

ご回答ありがとうございます。 もう少し質問してもよろしいでしょうか。 System.out.println(r);をしてみると //[I@85ede7b と出力されるのですが、これはなんですか。(int型?何進法?) r[1]が桁数とはどういうことですか。 r[0]が10という情報をもっているのですか。なぜですか。 質問はこの3点です。よろしくお願いします。
yureighost

2020/04/05 03:02 編集

私の修正だとrをint[]で宣言しているので配列だからです。 配列をそのままSystem.out.printlnで出力するとそのような内容で出力されます。 型としてはint型の配列となりますね。 length()メソッドがString型の文字列の文字数を数える処理なので、 intに変換される前の"010"の文字数を数えてr[1]に格納しています。 r[0]はInteger.parseIntでint型に変換した"010"の値が入っているので int型変換により先頭の0が除去されています。 その質問内容だと配列自体わかってないような感じなので詳しく学習されることをお勧めします。
t.z

2020/04/05 03:15

ご返信ありがとうございます。後半は理解しました。rを出力したら{10,3}だか[10,3]となればいいのに、なぜ[I@85ede7bなのかはまだわかりません...。
yureighost

2020/04/05 05:42

この辺は言語次第ですね。 実際その方が便利なのでそういう形式で出力してくれる言語もありますが。 javaはその辺りややレガシーな言語ではあるので。
t.z

2020/04/05 05:47

コンピューター側の言語といったところでしょうか。ご返信ありがとうございます。
guest

0

たぶんこういうことですね。

投稿2020/04/04 19:49

gentaro

総合スコア8949

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

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

t.z

2020/04/05 02:36

最初から桁数が決まっていればできるということですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問