[JSP] isNaN JSP에서 사용하기

자바스크립트에 있는 isNaN함수(숫자일때 참, 문자일때 거짓)를 JSP에서도 사용가능하게 하는 함수입니다.

public static boolean isNaN(String str) {  
    boolean check = true;
    for(int i = 0; i < str.length(); i++) {
        if(!Character.isDigit(str.charAt(i)))
		{
            check = false;
            break; 
        } // end if
    } //end for
    return check;  
} //isNaN

이 내용을 찾게 된 계기가 수업 중에 숫자를 입력하는 부분에서 문자를 입력했을 때 나오는 오류 처리 부분에서 발생했습니다.

AdderInput.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<p align="center">
<form action="Adder.jsp" method="post">
	첫 번째 수 : <input type="text" name="num1"><br><br>
	두 번째 수 : <input type="text" name="num2"><br><br>
	<input type="submit" value="더하기">
</form>
</body>
</html>

Adder.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
	pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
	String n1 = request.getParameter("num1");
	String n2 = request.getParameter("num2");
	int num1 = Integer.parseInt(n1);
	int num2 = Integer.parseInt(n2);
	int num3 = num1 + num2;
	out.println(num1 + "와" + num2 + "의 합은 "	+ num3 + "입니다.");
%>
</body>
</html>

AdderInput 페이지에서 숫자 값을 받아서 Adder 페이지에서 덧셈한 후 결과 값이 나오는 부분입니다.
여기서 문제는 AdderInput 페이지에서 문자를 입력했을 때 오류가 발생하는 점이었습니다.
오류 메시지를 보니 java.lang.NumberFormatException라는 예외 처리를 하라고 나와 있었습니다.
try catch문을 사용하여 예외 처리를 하였습니다.

Adder.jsp 수정01

<%@ page language="java" contentType="text/html; charset=EUC-KR"
	pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
	String n1 = request.getParameter("num1");
	String n2 = request.getParameter("num2");
	try {
		int num1 = Integer.parseInt(n1);
		int num2 = Integer.parseInt(n2);
		int num3 = num1 + num2;
		out.println(num1 + "와" + num2 + "의 합은 "	+ num3 + "입니다.");
	} catch(NumberFormatException e) {
		out.println(e.getMessage());
	}
%>
</body>
</html>

catch 부분에 오류 메시지를 “?는 입력하실 수 없는 문자입니다.”라고 출력하고 싶어서 고민해본 결과,
if문으로 문자와 숫자를 구별하여 문자가 나오면 출력할 수 없다는 메시지를 출력하면 되겠구나 생각했습니다.

하지만 숫자일 때 참이고 문자일 때 거짓으로 나오게 하는 건 자바스크립트의 isNaN() 함수만 기억이 났다.
구글에서 isNaN 함수와 비슷한걸 찾아냈다. 포스팅 맨 위에 적혀있는 함수가 그 함수이다.
위의 함수를 사용하여 다시 고쳐 보았다.

Adder.jsp 수정02

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%!
public static boolean isNaN(String str) {  
    boolean check = true;
    for(int i = 0; i < str.length(); i++) {
        if(!Character.isDigit(str.charAt(i)))
		{
            check = false;
            break; 
        } // end if
    } //end for
    return check;  
} //isNaN
%>
<%
	String n1 = request.getParameter("num1");
	String n2 = request.getParameter("num2");
	try {
		int num1 = Integer.parseInt(n1);
		int num2 = Integer.parseInt(n2);
		int num3 = num1 + num2;
		out.println(num1 + "와" + num2 + "의 합은 " + num3 + "입니다.");
	} catch(NumberFormatException e) {
		if(!isNaN(n1)) {
			out.println(n1 + "는 입력하실 수 없는 문자입니다.");
		}
		if(!isNaN(n2)) {
			out.println(n2 + "는 입력하실 수 없는 문자입니다.");
		}
	}
%>
</body>
</html>

이렇게 하고 능력자분께 자문했더니 try catch문을 사용할 필요가 없다고 하여 고민고민해본 결과 아래의 결과가 나왔다.

Adder.jsp 수정03

<%@ page language="java" contentType="text/html; charset=EUC-KR"
	pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%!public static boolean isNaN(String str) {
	boolean check = true;
	for (int i = 0; i < str.length(); i++) {
		if (!Character.isDigit(str.charAt(i))) {
			check = false;
			break;
		} // end if
	} //end for
	return check;
} //isNaN%>
<%
	String n1 = request.getParameter("num1");
	String n2 = request.getParameter("num2");
	if (!isNaN(n1)) {
		out.println(n1 + "는 입력하실 수 없는 문자입니다.");
	} else if (!isNaN(n2)) {
		out.println(n2 + "는 입력하실 수 없는 문자입니다.");
	} else {
		out.println(n1 + "와" + n2 + "의 합은 "
				+ (Integer.parseInt(n1) + Integer.parseInt(n2))
				+ "입니다.");
	}
%>
</body>
</html>

마지막 else 부분에 덧셈하는 부분만 형변환으로 처리하면 굳이 예외처리를 할 필요가 없었던 거였다.

int ↔ String 형변환

1) int → Sting
String s = “0”;
int i = Integer.parseInt(s);

2) String → int
int i = 0;
String s = Integer.toString(i);