본문 바로가기
개발~/JSP

JSTL <fmt:formatNumber> 금액 표시(세자리마다 쉼표)

by 보배곰 2018. 11. 28.

jsp로 화면을 그리고 있는데, 금액을 표시해야 되서 세자리마다 쉼표(, comma)를 넣어주고 싶었다. 1,000,000원 이렇게! 

그래서 tld로 만들까.. script로 만들까.. 고민하다가, 찾아보니 jstl에서 기능을 제공하고 있었다.


다음에 다시 사용하기 위해 공유! 


참고한 사이트는 아래 tutorials 홈페이지이다. 

https://www.tutorialspoint.com/jsp/jstl_format_formatnumber_tag.htm


그리고 jstl document 관련 문서는 아래 url인 것 같다. 

https://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/


우리는 숫자를 금액으로 표시하는 방법에 대해 알고 싶으니까 oracle 문서에서 formatNumber를 누르고 들어가면 설명이 나온다. 



번역하면 아래와 같다. 

JSTL fmt 
Tag formatNumber


숫자값을 숫자, 통화, 퍼센트로 바꾼다.


Tag Information
Tag Classorg.apache.taglibs.standard.tag.rt.fmt.FormatNumberTag
TagExtraInfo ClassNone
Body ContentJSP
Display NameNone


Attributes
NameRequiredRequest-timeTypeDescription
valuefalsetruejava.lang.String

변환할 숫자값

typefalsetruejava.lang.String

변환할 타입(숫자(number), 통화(currency), 퍼센트(percentage)

patternfalsetruejava.lang.String

사용자 지정 포맷 패턴

currencyCodefalsetruejava.lang.String

type="currency" 일 때, 적용. 나머지 타입에서는 해당 값 무시.
ISO 4217 통화 코드.

currencySymbolfalsetruejava.lang.String

type="currency" 일 때, 적용. 나머지 타입에서는 해당 값 무시.
통화 기호

groupingUsedfalsetruejava.lang.StringSpecifies whether the formatted output will contain any grouping separators.
maxIntegerDigitsfalsetruejava.lang.StringMaximum number of digits in the integer portion of the formatted output.
minIntegerDigitsfalsetruejava.lang.StringMinimum number of digits in the integer portion of the formatted output.
maxFractionDigitsfalsetruejava.lang.StringMaximum number of digits in the fractional portion of the formatted output.
minFractionDigitsfalsetruejava.lang.StringMinimum number of digits in the fractional portion of the formatted output.
varfalsefalsejava.lang.String

포맷팅 된 결과를 String 값으로 저장할 scoped 변수. 

scopefalsefalsejava.lang.String

var의 범위




이제 실전! 사용해보자. 


jstl에 fmt 안에 있는 기능이기 때문에 jsp 상단에 아래 코드 추가.

<%@ taglib prefix = "fmt" uri = "http://java.sun.com/jsp/jstl/fmt" %>


숫자를 최대 3자리마다 쉼표를 찍기 위해 아래와 같이 쓰면 된다. 

<fmt:formatNumber type="number" maxFractionDigits="3" value="${price}" />
여기서 ${price} 는 controller에서 view로 넘긴 값.

위에 처럼 쓰면 화면에 바로 찍힌다. 
만약 변수에 저장하고 싶다면, var에 변수명을 지정해주고, 나중에 불러다가 쓰면된다. 
<fmt:formatNumber type="number" maxFractionDigits="3" value="${price}" var="commaPrice" />

불러다가 쓸때는 ${commaPrice} 이런식을 el 사용해서 하면 된다. 




이렇게 끝내면 아쉬우니까 tutorialspoint의 예제를 몇 개 더 해보자. 
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<body>
	<div>
		<c:set var="price" value="123456.789"/>
		<h4>price : ${price }</h4>
		<ol>
			<li>3자리 마다 쉼표 : <fmt:formatNumber type="number" maxFractionDigits="3" value="${price}" /></li>
			<li>3자리 마다 쉼표 변수지정 : 
				<fmt:formatNumber type="number" maxFractionDigits="3" value="${price}" var="commaPrice"/>
				${commaPrice}
			</li>
			<li>보여줄 최대 자릿수: <fmt:formatNumber type="number" maxIntegerDigits="3" value="${price}"/></li>
			<li>USA 통화 : <fmt:setLocale value="en_US"/><fmt:formatNumber type="currency" value="${price}" /></li>
			<li>한국 통화 : <fmt:setLocale value="ko_KR"/><fmt:formatNumber type="currency" value="${price}" /></li>
			<li>영국 통화 : <fmt:formatNumber type="currency" currencyCode="GBP" value="${price}" /> </li>
			<li>@ 통화 : <fmt:formatNumber type="currency" currencySymbol="@" value="${price}" /> </li>
			<li>퍼센트 : <fmt:formatNumber type="percent" minIntegerDigits = "10" value = "${price}" /></li>
			<li>퍼센트 : <fmt:formatNumber type="percent" maxIntegerDigits = "10" value = "${price}" /></li>
		</ol>
	</div>
</body>
</html>


결과는 




통화 지정할 때, setLocale에 나라를 어떻게 써야할지 몰랐는데, 이클립스에서 해당 내용에 마우스 오버하니까 설명이 나왔다. 

설명보고 찾아서 나라 입력! 

ISO-639에서 정의된 언어 코드 2자리 소문자로, ISO-3166에서 정의한 나라 코드 2자리 대문자로 하이픈(-) 혹은 언더바(_)로 연결해서 쓰면 된다. 


currency에 currencyCode는 무슨 코드 쓰면 좋은지 document에 나와있다! (ISO 4217)