Development note/Java
[Java] 숫자 포맷(돈 표시 및 소수점 이하 표시)
v명월v
2019. 8. 19. 23:40
안녕하세요. 명월입니다.
이 글은 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에서 숫자 포맷(돈 표시 및 소수점 이하 표시)에 대한 글이었습니다.
궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.