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

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

ただいまの
回答率

90.82%

  • Java

    12550questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 294

minty

score 7

前提・実現したいこと

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;
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+5

原因

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

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

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

ついでに

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

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

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

書くなら

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/07 10: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 11: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 じゃろ

    キャンセル

  • 2018/01/07 12:29 編集

    umyuさん、詳細なご指摘勉強になります。
    asahina1979さんもコメントありがとうございます。

    1. 質問のケースが高々3桁なので考えていませんでした。巨大な数を扱う場合、asahina1979さんのご紹介されている方法が使われるようですね。 https://qiita.com/Co_Pilot/items/6d6321c2f8a0425d6722

    2. こちらは少し検討したのですが、やはり質問のコードでは考慮されていないようなのでスルーしました。符号を桁数に含めるか?というのは状況に依りますしね。

    3. 変えた方が丁寧かもしれませんね。ただし、ゼロの場合右側に埋めると意味が変わってしまいますので、padEndは考慮しなくて良く、padStartではなくpadZeroなどの方が良いかと。

    キャンセル

  • 2018/01/07 14:40

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

    キャンセル

  • 2018/01/09 13:53

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/07 11:42

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

    キャンセル

  • 2018/01/07 12:28

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

    キャンセル

  • 2018/01/07 17:39

    # commons.lan3
    StringUtils.substring(StringUtils.repeat("0", n) + x, 0-n)

    たしかに、標準ではないからなぁ

    キャンセル

  • 2018/01/07 20:06

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

    キャンセル

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

  • ただいまの回答率 90.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    キーボード入力によるn!の計算

    下記のプログラムで、キーボードで20を入力して20の階乗を計算したいのですが、scanf()をつかって20を入力したのですが出力されるのが「-2102132736」と出てきてしまい

  • 解決済

    「限られた数字で作れる数の、まんなかの値」を求めたい。

    前提・実現したいこと 「限られた数字で作れる数の、まんなかの値」を求めたいです。 例えば, 0, 4, 5以外の数を使わずに作ることができる3桁以下の非負の整数は, 0, 

  • 解決済

    C/C++で整数の桁数を求める場合、1番処理が速いのはどの方法でしょうか?

    タイトル通りですが、C/C++で整数の桁数を最短で求めるにはどうすればよいでしょうか? 実験として、以下のようなプログラムを書いて、①10で割っていく、②常用対数を使う、の2通り

  • 解決済

    unityで隠しコマンド的なものを導入したいです。

    前提・実現したいこと unityで簡単なゲームをつくっています。 その中で、指定したコマンドを入力したら、シーン切り替えをするという動作をさせたいのですが、コードの書き方がわか

  • 受付中

    C:大きな数の計算方法,オーバーフロー回避

    C言語で3^80の計算をしたいのですが、数が大きすぎてオーバーフローしてしまいます。各桁ごとに配列を置けばいいのかとも思いましたが、いまいちよくわかりません。 解決方法が分かる方

  • 解決済

    文字列のプログラムについて

    Cを使って3つの文字列を入力し一番文字数が最多の文字列を出力する(ただし最多の数と同じ数の文字列がある場合同じ数の文字列をすべて出力) というプログラムを作っているのですが今文字数

  • 解決済

    c言語学習中の学生です。

    前提・実現したいこと c言語を学んでいる学生です。 非常に低レベルな質問ですがお願いします。 Windows10でmingwを使っています。 発生している問題・エラーメッセージ

  • 解決済

    桁数を判定して、4桁の数が入力されるまで繰り返すメソッド

    前提・実現したいこと ここに質問したいことを詳細に書いてください Javaで4桁の乱数を当てるHitBlowを作っています。5桁以上なら「多すぎます。4桁になるようにしてください。

同じタグがついた質問を見る

  • Java

    12550questions

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