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

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

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

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

Q&A

解決済

2回答

5028閲覧

Java ゼロパディング処理について

minty

総合スコア13

Java

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

0グッド

1クリップ

投稿2018/01/05 07:25

###前提・実現したいこと
XMLファイルから取得したデータ(文字列の数)が指定の桁数に満たない場合
前に0をつけ指定の桁数になるような処理を記述したいです。
###発生している問題・エラーメッセージ

エラー等は出ていませんが、指定桁数を3として取得した文字列を"0"とすると 結果は000としたいのですが今のところ0としか表示されていません。 for文を使用したゼロパディングの例がなかなか見つからず躓いています。 宜しくお願いいたします。

###該当のソースコード

//前0処理用メソッド //引数で取得したString型の文字列と指定桁数を受け取る static String padding(String ck, int n){ String wk; int digit; wk = ck; digit = n; //データの文字数を取得 int len = wk.length();     //指定桁数から取得した文字数を引いてその分文字列の前に0を結合 for(int i=0; i >= digit - len; i++){ wk = "0" + wk; } return wk; }

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

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

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

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

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

guest

回答2

0

ベストアンサー

原因

for文の条件部が成立しないように見えます。

Java

for(int i=0; i >= digit - len; i++){
wk = "0" + wk;
}

digit - lenは正数ですよね?条件部はループを続ける条件です。

ついでに

次の部分はかなり冗長です。

Java

String wk;
int digit;
wk = ck;
digit = n;

Javaでは引数が値渡しされるうえに、Stringのインスタンスはイミュータブルです。
メソッド内でwkとnをモロに弄んでも危険性はまずないです。

書くなら

以下のように書いた方が簡潔な気がします。

Java

1static String padding(String src, int n) { 2 return String.format("%0"+n+"d", Integer.valueOf(src)); 3}

投稿2018/01/05 07:28

編集2018/01/05 07:57
LouiS0616

総合スコア35660

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

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

umyu

2018/01/07 01:43 編集

コードの指摘事項が3点あります。 1,Integer.valueOfの場合、int型の範囲を超えるとjava.lang.NumberFormatExceptionの例外が発生します。桁数的には10桁の数値(2147483648)で発生するので、Long.valueOf(src)の方が良いのではないでしょうか。 2,マイナス数値の考慮 符号がマイナスの数値に対してパディング処理を行った時にマイナス記号の分文字の桁数が増える事の考慮が必要な時もあるかと。 3,メソッド名(padding)についてですが、padStart/padEndのようにどちらの方向からパディング処理を行うのかをメソッド名で表したほうが好みです。 以降はテストソースです、ご参考まで import java.util.stream.Stream; public class Q107686 { public static void main(String[] args) { Stream<String> stream = Stream.of(String.valueOf(Integer.MIN_VALUE), String.valueOf(Integer.MAX_VALUE), String.valueOf(Long.MIN_VALUE), String.valueOf(Long.MAX_VALUE)); for (String str : stream.toArray(s -> new String[s])) { String pads = padding(str, 30); System.out.println(pads); } } static String padding(String src, int n) { return String.format("%0" + n + "d", Integer.valueOf(src)); } }
退会済みユーザー

退会済みユーザー

2018/01/07 02:35 編集

NumberFormatExceptionをきにするなら DecimalFormat format = new DecimalFormat("00000"); format.setMinimumFractionDigits(0); format.setMaximumFractionDigits(0); BigDecimal number = new BigDecimal("600.01"); System.out.println(format.format(number)); BigDecimal + DecimalFormat じゃろ
LouiS0616

2018/01/07 03:29 編集

umyuさん、詳細なご指摘勉強になります。 asahina1979さんもコメントありがとうございます。 1. 質問のケースが高々3桁なので考えていませんでした。巨大な数を扱う場合、asahina1979さんのご紹介されている方法が使われるようですね。 https://qiita.com/Co_Pilot/items/6d6321c2f8a0425d6722 2. こちらは少し検討したのですが、やはり質問のコードでは考慮されていないようなのでスルーしました。符号を桁数に含めるか?というのは状況に依りますしね。 3. 変えた方が丁寧かもしれませんね。ただし、ゼロの場合右側に埋めると意味が変わってしまいますので、padEndは考慮しなくて良く、padStartではなくpadZeroなどの方が良いかと。
umyu

2018/01/07 05:40

>LouiS0616さん コメント欄への質問の回答ありがとうございました。メソッド名はpadZeroの方が適切だと思いました。 >asahina1979さん 勉強になりますー。
minty

2018/01/09 04:53

皆様ありがとうございました。 参考にさせていただき引き続き勉強していきたいと思います。
guest

0

javaはよく存じ上げないのですが仕組みとしては
左から"000"(1文字以上が確定なら"00")を足して右から3桁切り出せばよいかと。
forで回すというのはかなり違和感があります。

投稿2018/01/05 07:33

sousuke

総合スコア3828

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

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

退会済みユーザー

退会済みユーザー

2018/01/07 02:42

Java なら各種フォーマットクラス PHP,C,PERLや同派生言語なら sprintf があるのじゃよ・w・
LouiS0616

2018/01/07 03:28

例えばPythonだとこの方法でもいい ("0"*n + ck)[-n:] んですけれど、Javaだと少し書きづらいですね。
退会済みユーザー

退会済みユーザー

2018/01/07 08:39

# commons.lan3 StringUtils.substring(StringUtils.repeat("0", n) + x, 0-n) たしかに、標準ではないからなぁ
sousuke

2018/01/07 11:06

フォーマットクラスあるならそれでいいですね。substringは左からしか切れないんですね。 左右反転できるならreverseして右から0埋めして左からn切ってreverse…やっぱり上の方がいいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問