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

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

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

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

Q&A

2回答

4524閲覧

【java】コマンドライン引数に指定された値の内、floatとして扱える値を判別する

kanon962

総合スコア7

Java

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

0グッド

0クリップ

投稿2015/08/28 08:36

Javaで、コマンドライン引数に指定された全ての値の中から、floatとして扱える値の合計を求めたいです。

その為、たとえば下記の場合ですと、

Java

1public class Hoge { 2 public static void main(String[] args) { 3 float result = 0;//最終的にここに合計を代入 4 5 for(int i = 0; i < args.length; i++) { 6 float f = Float.parseFloat(args[i]); 7 8 result += f; 9 } 10 11 System.out.println(result); 12 13 } 14}

この場合、コマンドライン引数がfloatかどうかを判別していない為、long等の引数も合計してしまう事になってしまいます。
なので、

Java

1public class Y03 { 2 public static void main(String[] args) { 3 float result = 0; 4 5 for(int i = 0; i < args.length; i++) { 6 if( ??? ){ 7 float f = Float.parseFloat(args[i]); 8 result += f; 9 } 10 } 11 12 System.out.println(result); 13 14 } 15}

この様な形にして、???の部分でコマンドライン引数がfloatとして扱えるかどうかを判定してからresultへ代入したいのですが、その判定で使用すればよいものがわかりません…。

ifではなく、try - catchで例外処理をする方法もあるというのは聞いたことがあるのですが、皆目見当がつかない状態です。

情報不足で回答が出来ない等でしたら、補足で説明させて頂きたいと思いますので、お手数ですがどなたかご回答お願い致します。

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

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

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

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

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

guest

回答2

0

1つの発想としては,正規表現を使う方法があるのではないでしょうか.
"数字1個以上.数字1個以上"という形の正規表現を用意して,
コマンドライン引数にマッチするかを判定して,マッチすればparseFloatする,と言った具合です.
あるいは単純に小数点がコマンドライン引数の文字列内にあるかを判定してから,という手段もありえそうです.
ただこれらの方法は全角・半角が入り混じった時に正しく動作するのかちょっと私は知らないので,確認する必要があるかと思います.
いずれにせよ今のままでは1回floatに変換できないものが来た時点で例外終了してしまうので,そこはきちんと処理する必要があります.
例外で分岐するなら,いったんlongへの変換を試みて,例外が発生しなければループのはじめに戻し,
例外が発生した時にfloat変換を試みる,という手法になると思います.

java

1 for(int i = 0; i < args.length; i++) { 2 try{ 3 Long.parseLong(args[i]); 4 continue; //longに変換できたらループ最初にもどる 5 } catch (NumberFormatException e){} //例外が発生したら何もせずに次に進む 6 7 try{ 8 float f = Float.parseFloat(args[i]); 9 10 result += f; 11 } catch (NumberFormatException e){} 12 }

投稿2015/08/28 09:38

swordone

総合スコア20651

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

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

Jake

2015/08/30 00:35 編集

気になったのでやってみました。 public static void main(String[] args) { String[] s = {"10","aaa","1.25","5.1","3","あああ","68","1.006"}; checkFloat(s); } public static void checkFloat(String[] s){ int floatCount =0; for(int i = 0; i < s.length; i++) { try{ long L = Long.parseLong(s[i]); } catch (NumberFormatException e){ try{ float f = Float.parseFloat(s[i]); floatCount++; } catch (NumberFormatException er){} } } System.out.println(floatCount); } でもいいですねー。try catchをネストにするかどうかという感じで。
guest

0

正規表現 "^[+|-]?\d+\.\d*$" で小数表記かを判定するようにしてみました。(+, - 符号も考慮しています)

本来は小数表記としてどんな書式を許すかの仕様を決め、それにそった正規表現にする必要があります。
コードの後半に、この正規表現ではどんな文字列を小数表記として判定するか?の簡易テストを書いてあります。

java

1import java.util.regex.Matcher; 2import java.util.regex.Pattern; 3 4public class Sample { 5 public static void main(String[] args) { 6 System.out.println(sumFloat(args)); 7 test_parseFloat(); 8 } 9 10 // strs 中の小数表記のものだけをとりだして、その合計を Float で返す。 11 private static Float sumFloat(String[] strs) { 12 Float result = 0.0F; 13 for (String str : strs) { 14 Float f = parseFloat(str); 15 if (f != null) { 16 result += f; 17 } 18 } 19 return result; 20 } 21 22 // str が小数点を含む数値表記なら、Float に変換したものを返す。 23 // そうでなければ null を返す。 24 private static Float parseFloat(String str) { 25 Float ans = null; 26 try { 27 // 正規表現をつかって小数表記かを判定する。 28 Pattern p = Pattern.compile("^[+|-]?\\d+\\.\\d*$"); 29 if (str != null) { 30 Matcher m = p.matcher(str); 31 if (m.find()) { 32 ans = Float.parseFloat(str); 33 } 34 } 35 } catch (NumberFormatException ex) { 36 // do nothing 37 } 38 return ans; 39 } 40 41 // parseFloat(str) の簡易テスト 42 private static void test_parseFloat() { 43 String tests[][] = { 44 { null, "null" }, 45 { "", "null" }, 46 { "a", "null" }, 47 { "あ", "null" }, 48 { "1", "null" }, 49 { ".1", "null" }, 50 51 { "1.2", "1.2" }, 52 { "+1.2", "1.2" }, 53 { "-1.2", "-1.2" }, 54 55 { "1.", "1.0" }, 56 { "1.0", "1.0" }, 57 { "1.00", "1.0" }, 58 }; 59 for (String[] t : tests) { 60 Float val = parseFloat(t[0]); 61 if (!t[1].equals("" + val)) { 62 System.out.println("fail:" + t[0] + " -> " + val); 63 } 64 } 65 } 66}

投稿2015/09/05 09:25

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問