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에서 숫자 포맷(돈 표시 및 소수점 이하 표시)에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.