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

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

ただいまの
回答率

87.80%

文字列の数値かそれ以外かの判断

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,697

score 54

いつもお世話になっております。

受け取ったString文字列が数値かそうでないか、を判断するコードを作る課題があったので、自分なりに作りました。
こちらです↓

/* 
コマンドライン引数より取得した文字列が
数字であれば「true」を、
文字であれば「false」を返すプログラムを作成せよ。
 */
package no211_Test_22;

public class Test14 {
    public static void main(String[] args) {
        String str = args[0];
        int i = 0;
        int len = str.length();
        char ch = str.charAt(i);
        while (i < len){
            boolean result = Character.isDigit(ch);
            if(i == len){
                System.out.println(true);
            } else {
                System.out.println(result);
                break;
            }
            i++;
        }
    }
}

Character.isDigit()ではString文字列を扱えないので
charAt(i)を用いてループを回し1つずつ確認させる、というやり方です。

先生に提出したところ、
処理が面倒くさいのでもっと簡単なのにしろ、と言われたのですが、
どうしても上手くまとめる方法が思いつきません。

どなたか知恵をお貸し下さい。
よろしくお願いします。

↓以下修正後
public class Test14 {
    public static void main(String[] args) {
        try {
            int number = Integer.parseInt(args[0]);

            System.out.println(true);

        } catch (NumberFormatException e) {
            System.out.println(false);
        }
    }
}

こんな感じになりました。
とても短くて見やすいと実感。
いかに自分がダメな事をしていたか。。。

ループの回し方にも問題がたくさんありましたが、
これらの点にもご指摘頂いた皆様、ありがとうございました。

一応これで解決済みにしたいと思います。
何か問題があれば解決済みですがコメント頂けるとありがたいです。

PS
numberという変数を出すだけだして使えていないのですが、これはしょうがないのでしょうか?
うまく纏める術を伝授して頂けると幸いです。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 6

checkベストアンサー

+1

受け取ったString文字列をparseIntして例外処理をすればいいんじゃない?
参考になればいいなと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/04/21 19:06

    ループしか頭に無かった僕への打開策になりました。
    感謝致します!

    キャンセル

+1

学校の課題のようなので考え方だけ書きます
1.for文を使って添え字を0から最後までループ(for-each形式を使ってもいいです)
2.ループの中ではisDigitがfalseの場合だけreturnして、trueを返すのはループを抜けた後
この辺が先生の言いたいところだと思います

(先生の想定を超えたいなら難易度が上がりますが「正規表現」を使う方法もあります。)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/04/21 18:11

    ご配慮ありがとうございます。
    答えを教えてもらうのは卑怯だと思うので、ありがたいです。

    最初の質問の時に書けば良かったのですが、
    一文字ずつ見る方法ではないモノを使ってみてください、と言われました。
    なのでkutsulogさんの提示して頂いた考え方は僕のコードの修正にはぴったりですが、
    求められているものはちょっと違うのかもしれません。。。

    正規表現、調べてみます!

    キャンセル

+1

問題文とは関係ないですが、
if (true) {
} else {
}
では絶対に elseが実行されないと思いますがそれはいいのですか?
&&演算子で true をつなげる意味も分かりません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/04/21 18:06

    まだまだ知識が足りないのでまともな人から見ると滅茶苦茶なコードになっている事と思います(汗)
    1つずつ無駄なモノを省いて行こうと思います。

    ちなみに、変なモノが一杯くっついているみたいですが、
    現在の確認ではelseは動いております。
    ご指摘ありがとうございます。

    キャンセル

  • 2015/04/21 18:21

    そうなのですか、無粋なコメントだったようですね。
    すみませんでした。

    キャンセル

  • 2015/04/21 18:26

    いえ、最終的には全部まともにしたいので質問とは別の問題点でもご指摘頂けるのはありがたいです。

    キャンセル

+1

このコード,本当はif文のtrueにはresultが入るべきなのでは?
たぶん自分の中で(resultがtrueなら・・・)ってお考えかと思いますが,
この書き方ではhtsignさんの言うとおり,最後のelse文に入り得ません(いわゆるデッドコード).

あなたの考え方に沿うなら,kutsulogさんの手法が一番自然ですが,
個人的にはipipip0129さんの手法を取りたいですね.
Integer#parseInt(String)は,引数が数値変換できなければNumberFormatExceptionを投げるので,
それをcatchした時falseとすれば要件は満たせます.

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/04/21 18:29

    デッドコード確認致しました。
    質問のコードを上書きしてみたので再度見て頂けるとありがたいです。

    Integer#parseInt(String)の意見が多いので取り扱ってみようと思います。
    ご丁寧にありがとうございます。

    キャンセル

+1

        while (i < len){
            boolean result = Character.isDigit(ch);
            if(i == len){
                System.out.println(true);
            } else {
                System.out.println(result);
                break;
            }
            i++;
        }
これだと今度は1文字目しかチェックできないのでは・・・・?
whileでi<lenという条件なので,iを操作せずに直後にあるi==lenという条件は絶対に成立しません.

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/04/21 18:48

    言われてみればそうですね、うぅん、頭の悪い自分がもどかしい。
    i+1 == len
    サイレント修正で条件成立かな?と思うのですがこの場合の問題点はありますか?
    while (i < len){
    boolean result = Character.isDigit(ch);
    if( i+1 == len){
    System.out.println(true);
    } else {
    System.out.println(result);
    break;
    }
    i++;
    }

    キャンセル

  • 2015/04/21 19:06

    1文字目でbreakされて抜けてしまうので話になりません.
    kutsulogさんのアルゴリズムをもう一度よく見て考えてください

    キャンセル

  • 2015/04/21 19:39

    回答ありがとう御座います。
    for eachを使ってなかったですね、もうちょっと練りなおしてみます。

    キャンセル

+1

修正後のコードですが,数字を使うことが目的のコードではないので,numberを用意する必要が無いですね.
parseIntはint型の数値を返しますが,それを収める変数が無いだけで問題ありません.
もちろん変数を用意していても何ら問題ありません(Eclipseを使うと「変数numberの値は使われていません」と怒られますが).

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/04/21 19:37

    なるほど、書かなくてよろしいのですね!
    スッキリしました。
    ありがとうございます。

    キャンセル

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

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

関連した質問

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