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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

Q&A

解決済

5回答

1841閲覧

JAVAでStringを、intに変える

tatakauneko3

総合スコア4

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

0グッド

1クリップ

投稿2021/08/11 23:21

編集2021/08/12 00:05

jspで入力された情報を、javaServletで受けとるコードを作っています。
Stringで来る情報をintに変える際に、数字以外が入力されていたら『入力エラー』を表示して返すことにしたいです。

ただ、Stringをintに変えるところまでは出来たのですが肝心な文字チェックがコーディング出来ず悩んでおります。
宜しくお願い申し上げます。

java

1 2//Servlet 3package ex; 4 5import java.io.IOException; 6 7import javax.servlet.RequestDispatcher; 8import javax.servlet.ServletException; 9import javax.servlet.http.HttpServlet; 10import javax.servlet.http.HttpServletRequest; 11import javax.servlet.http.HttpServletResponse; 12 13public class Question04Servlet extends HttpServlet { 14 15 public void doPost(HttpServletRequest request, HttpServletResponse response) 16 throws IOException, ServletException { 17 18 // レスポンスの為のコンテンツタイプの設定。クライアントにどのようなデータを送るのかを指定 19 response.setContentType("text/html; charset=utf-8"); 20 // リクエストのエンコードの設定。リクエスト・パラメータ読み込み時の文字コードを明示 21 request.setCharacterEncoding("utf-8"); 22 23 //Beanクラスのインスタンス生成 24 Question04FormBean q4 = new Question04FormBean(); 25 26 //リクエストからパラメータの取得 27 String inputData1 = request.getParameter("inputData1"); 28 String inputData2 = request.getParameter("inputData2"); 29 String msg = "入力に不備があります。整数を入力してください。"; 30 31 //入力チェック(「null」或いは、空文字チェック) 32 if (null == inputData1 || "".equals(inputData1)) { 33 //入力値がない場合 34 q4.setMsg(msg); 35 } else if (null == inputData2 || "".equals(inputData2)) { 36 //入力値がある場合 37 q4.setMsg(msg); 38 } 39 40 //整数に変換 ※ここで同時にチェック判定を行いたい。 41 int number1 = Integer.parseInt(inputData1); 42 int number2 = Integer.parseInt(inputData2); 43 44 //足算を実施 45 int sum = number1 + number2; 46 msg = String.valueOf(sum); 47 q4.setMsg(msg); 48 49 //リクエストに「msg」をキーに値をセット 50 request.setAttribute("msg", msg); 51 } 52 53} 54

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

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

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

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

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

tatakauneko3

2021/08/12 00:07

申し訳ございません。スマホから投稿したら汚い状態になっておりました。きちんとではないですが、PCから再投稿したので少し見やすく変更致しました。
m.ts10806

2021/08/12 00:13

コードを伴う場合はモバイルからの投稿はやめたほうがいいです。どういう環境下か知らないですが、基本的にコードもコピペになりませんし。
tatakauneko3

2021/08/12 00:22

移動中に投稿したためスマホからになりました。今後はPCから行うようにします。
guest

回答5

0

ベストアンサー

下記いずれかまたは両方で

  • try-catchでNumberFormatExceptionを捕捉する
  • 正規表現で「数値のみかどうか」を確認する(調べれば幾らでも出てきます)

投稿2021/08/11 23:28

m.ts10806

総合スコア80875

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

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

tatakauneko3

2021/08/12 03:48

ありがとうございます。今回はtry-catchにてNumberFormatExceptionにて解決出来ました。
guest

0

try - catch で例外を捕捉するのは、
例外を発生されるのってちょっと重いって聞いたことがあるんですよね
(何万件も処理するのでなければ誤差の範囲かもしれませんが)

そうすると正規表現でチェックするのが良いのかなあと思います。
正規表現でチェックする場合は、
「マイナス記号は許容するのか」
「小数点はOK?」
あたりも気にすると良いかなと思います。

# まあ簡単さでいえば try - catch かなとは思いますけど。
# 変換できなかったらエラー投げてくれるわけですし...


余所様のサイトですが ぐぐったら出てきたやつ

投稿2021/08/12 02:47

編集2021/08/12 02:49
sk_3122

総合スコア1126

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

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

tatakauneko3

2021/08/13 00:23

回答ありがとうございます。今回はtry-catchにしましたが、正規表現も学習致します。
guest

0

通常リクエストパラメーターの妥当性チェックを通過したあとに
変換かけるのが普通ですが、まぁパラメーター2個くらいならこんな感じでしょうか。

Java

1 public void doPost() { 2 /** 3 割愛 4 */ 5 6 //整数に変換 ※ここで同時にチェック判定を行いたい。 7 Optional<Integer> number1 = this.parse(inputData1); 8 Optional<Integer> number2 = this.parse(inputData2); 9 if (number1.isEmpty() || number2.isEmpty()) { 10 final String invalidMessage = "入力に不備があります。整数を入力してください。"; 11 q4.setMsg(invalidMessage); 12 request.setAttribute("msg", invalidMessage); 13 return; 14 } 15 16 //足算を実施 17 int sum = number1.get() + number2.get(); 18 19 } 20 21 /** 22 * String型をInteger型へ変換する. 23 * 24 * @param value 文字列 25 * @return 数値 26 */ 27 public Optional<Integer> parse(final String value) { 28 try { 29 return Optional.of(Integer.parseInt(value)); 30 } catch (NumberFormatException e) { 31 return Optional.empty(); 32 } 33 } 34

尚、q4(Question04FormBean)がどこにも生かされていないので
どう取り扱っていいかよくわからないです。

投稿2021/08/12 02:40

Luice

総合スコア771

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

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

tatakauneko3

2021/08/12 03:53

回答ありがとうございます。おっしゃるとおりBeanはきちんと生かされておりませんでした。底の部分は別途修正して改善しました。
guest

0

Character.isDigit で文字列のすべての文字が数字かどうかを見るやり方もあります。

Java

1import java.util.Scanner; 2 3class Main { 4 static boolean invalid(String s) { 5 if (s == null || s.isEmpty()) return true; 6 for (int i = 0; i < s.length(); i++) 7 if (!Character.isDigit(s.charAt(i))) return true; 8 return false; 9 } 10 11 public static void main(String[] args) { 12 Scanner sc = new Scanner(System.in); 13 for (;;) { 14 System.out.print("s1>> "); 15 if (!sc.hasNextLine()) break; 16 String s1 = sc.nextLine(); 17 System.out.print("s2>> "); 18 if (!sc.hasNextLine()) break; 19 String s2 = sc.nextLine(); 20 21 if (invalid(s1) || invalid(s2)) 22 System.out.println("不正入力"); 23 else { 24 int n1 = Integer.parseInt(s1); 25 int n2 = Integer.parseInt(s2); 26 int sum = n1 + n2; 27 String msg = String.valueOf(sum); 28 System.out.println(msg); 29 } 30 } 31 } 32}

投稿2021/08/12 01:41

kazuma-s

総合スコア8224

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

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

kazuma-s

2021/08/12 03:05

例えば、全角数字を不正文字とするかどうかということですね。 Integer.parseInt は全角数字でも NumberFormatException をスローしないので try-catch も使えないことになります。 符号を許すかどうかは正規表現でも注意が必要です。 int の範囲を超える数字列の処理も必要でしょうか?
Zuishin

2021/08/12 03:31 編集

どのみち parseInt で変換するのであれば、その前段階でのチェックは parseInt に合わせないと不整合が起こります。 parseInt で使用できない文字を通してしまうとハンドルされていない例外が起きてしまうということですね。 逆に、合わせているのであれば、事前チェックが必要かどうかは要検討と思います。 ついでにこれは好みの問題かもしれませんが、負の数や範囲外の値を排するのであれば、変換後に行う方が可読性が上がったり親切なエラーメッセージが出せるのかなと思います。 (int の範囲外であれば parseInt で例外になると思いますが)
tatakauneko3

2021/08/12 03:51

お二人とも回答ありがとうございます。今回はintの範囲内でしたのでその点は問題ありませんでした。書き方・順番などは改めて参考にさせて頂きます。
guest

0

正規表現でチェックするやり方があります。

Java

1 //整数に変換 ※ここで同時にチェック判定を行いたい。 2 Pattern p = Pattern.compile("^[0-9]+$"); 3 Matcher m1 = p.matcher(inputData1); 4 Matcher m2 = p.matcher(inputData2); 5 boolean result = m1.matches() && m2.matches(); 6 if(!result) { 7 // 数値以外の場合 ※msgの使い方あってるかわからないけど、、、 8 msg = "どっちかに数値以外が入力されています。"; 9 request.setAttribute("msg", msg); 10 return; 11 } 12 int number1 = Integer.parseInt(inputData1); 13 int number2 = Integer.parseInt(inputData2);

参考元:https://techacademy.jp/magazine/28637

投稿2021/08/12 00:07

編集2021/08/12 00:13
TetsujiMiwa

総合スコア1124

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

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

tatakauneko3

2021/08/12 03:49

ありがとうございます。正規表現は学習不足でした。きちんと見直して学びます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問