안녕하세요. 명월입니다.
이 글은 Java에서 숫자 포맷(돈 표시 및 소수점 이하 표시)에 대한 글입니다.
이전에 제가 C#으로 숫자 포맷에 대해 소개한 적이 있습니다.
링크 - [C#] 숫자 포맷 (돈 표시 및 소수점 이하 표시)
프로그램 내에서 숫자를 돈표시나 소수점 이하 표시를 설정할 필요가 있기 때문에 간단하지만 자주 사용하지 않을 까 싶습니다.
특히, 돈 표시의 경우는 수만, 수억의 표시가 될 때 콤마(,) 표시가 없으면 헤갈리기 쉽기 때문에 중요하다고 생각됩니다.
Java에서는 int나 double, float를 String 포맷으로 바꿀 때는 DecimalFormat 클래스를 이용합니다.
import java.text.DecimalFormat;
public class Main {
public static void main(String[] args) {
// 돈 표시 (세자리 수당 ,를 표시)
DecimalFormat formatter = new DecimalFormat("#,##0");
int data = 1000000000;
String ret = formatter.format(data);
System.out.print("#,##0 - ");
// 1,000,000,000
System.out.println(ret);
// 소수점 이하 2번째자리까지 표시 (소수점 이하가 없을 경우 0.00으로 표시한다.)
DecimalFormat formatter2 = new DecimalFormat("#,##0.00");
double data2 = 10000000d;
ret = formatter2.format(data2);
//10,000,000.00
System.out.print("#,##0.00 - ");
System.out.println(ret);
// 소수점 이하 2번째자리까지 표시 (소수점 이하가 없을 경우 표시하지 않는다.)
DecimalFormat formatter3 = new DecimalFormat("#,##0.##");
ret = formatter3.format(data2);
System.out.print("#,##0.## - ");
// 1,000,000,000
System.out.println(ret);
double data3 = 1000.123d;
System.out.print("#,##0.00 - ");
ret = formatter2.format(data3);
// 1,000.12
System.out.println(ret);
System.out.print("#,##0.## - ");
ret = formatter3.format(data3);
// 1,000.12
System.out.println(ret);
double data4 = 1000.1d;
System.out.print("#,##0.00 - ");
ret = formatter2.format(data4);
// 1,000.10
System.out.println(ret);
System.out.print("#,##0.## - ");
ret = formatter3.format(data4);
// 1,000.1
System.out.println(ret);
}
}
여기서 만약 소수2번째자리까지 표시하고 0.127를 하면 어떻게 될까요? 반올림으로처리 되서 0.13으로 표시됩니다.
public class Main {
public static void main(String[] args) {
DecimalFormat formatter = new DecimalFormat("0.##");
double data2 = 0.127d;
String ret = formatter.format(data2);
System.out.println(ret);
}
}
상황에 따라서 반올림이 아닌 절삭을 해야 할 때가 있습니다. 방법은 Math클래스를 사용하던가 BigDecimal 타입으로 변경해서 사용하는 방법이 있습니다.
import java.math.BigDecimal;
import java.text.DecimalFormat;
public class Main {
public static void main(String[] args) {
DecimalFormat formatter = new DecimalFormat("0.##");
double data = 0.127d;
// 2자리수를 100으로 곱하여 소수점 이하 절삭 후 다시 100로 나눈다.
double data2 = Math.floor(data * 100) / 100;
String ret = formatter.format(data2);
System.out.println(ret);
// BigDecimal로 변경후 절삭한다.
BigDecimal data3 = new BigDecimal(data);
data3 = data3.setScale(2, BigDecimal.ROUND_DOWN);
ret = formatter.format(data3);
System.out.println(ret);
}
}
개인적으로는 BigDeciaml를 이용하는 편이 안전하다고 생각합니다. 100을 곱하고 나누는 과정에 예상치 못한 오버플로우가 발생하거나 값의 오차가 발생할 수 있기 때문입니다.
여기까지 Java에서 숫자 포맷(돈 표시 및 소수점 이하 표시)에 대한 글이었습니다.
궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.
'Development note > Java' 카테고리의 다른 글
[Java] Tomcat 서버에서 소켓 서버를 만드는 방법 (0) | 2019.10.20 |
---|---|
[Java] 서블릿 환경에서 현재 실행 디렉토리 가져오기 (0) | 2019.10.16 |
[Java] 알고리즘 - 지하철 노드 탐색 (연결리스트, 트리 탐색 응용) (6) | 2019.09.24 |
[Java] 로그 라이브러리(log4j) (0) | 2019.08.26 |
[Java] XML를 Xpath를 이용하여 데이터를 취득하는 방법(XPathFactory) (0) | 2019.08.08 |
[Java] Jsoup를 이용해서 XML파일(HTML)을 다루는 방법 (0) | 2019.08.07 |
[Java] 직렬화(Serializable) (2) | 2019.07.16 |
[Java] 클래스 복제(Clonable, Reflection) (0) | 2019.07.15 |