DecimalFormat
DecimalFormat (십진수 형식)
십진수를 형식화하는 NumberFormat의 구체 하위 클래스예요. 서양·아랍·인도 숫자 지원을 포함해 어떤 로케일에서든 숫자를 파싱·형식화할 수 있게 하는 다양한 기능을 갖고 있어요. 정수(123), 고정 소수점(123.4), 과학 표기(1.23E4), 백분율(12%), 통화 금액($123) 같은 여러 종류의 숫자도 지원해요. 이 모든 것이 로컬라이즈될 수 있어요.
본문
특정 로케일(기본 로케일 포함)에 대한 NumberFormat을 얻으려면 NumberFormat의 팩토리 메서드 중 하나(예: getInstance())를 호출해요. 일반적으로 DecimalFormat 생성자를 직접 호출하지는 않는 것이 좋아요. NumberFormat 팩토리 메서드가 DecimalFormat이 아닌 하위 클래스를 반환할 수 있기 때문이에요.
형식 객체를 커스터마이즈해야 한다면 이렇게 해요.
NumberFormat numFormat = NumberFormat.getInstance(loc);
if (numFormat instanceof DecimalFormat decFormat) {
decFormat.setDecimalSeparatorAlwaysShown(true);
}
DecimalFormat은 패턴과 심볼 집합으로 구성돼요. 패턴은 applyPattern()으로 직접 설정하거나 API 메서드로 간접 설정할 수 있고, 심볼은 DecimalFormatSymbols 객체에 저장돼요. NumberFormat 팩토리 메서드를 쓰면 패턴·심볼이 로컬라이즈된 ResourceBundle에서 읽혀요.
패턴 문법
DecimalFormat 패턴의 문법은 다음과 같아요.
- 양수 패턴과 음수 패턴은
;로 구분돼요. 예:"#,##0.00;(#,##0.00)" - 각 하위 패턴은 접두사(prefix), 숫자 부분, 접미사(suffix)를 가져요.
- 음수 하위 패턴은 선택적이에요. 없으면 양수 패턴에 마이너스 기호(
-U+002D)를 붙여 음수 패턴으로 써요. 즉"0.00"만으로"0.00;-0.00"과 동등해요. - 숫자 부분은 정수부와 소수부로 나뉘고, 지수부(
E)가 있을 수 있어요. 0은 숫자를 나타내고(없으면 0 표시),#도 숫자를 나타내지만(없으면 생략) 구분자 위치를 유지해요.,는 그룹 구분자,.는 소수 구분자를 나타내요.
예를 들어 "#,###.##" 패턴은 1234.56을 "1,234.56"으로 형식화해요.
지역 차이를 반영하려면 DecimalFormatSymbols를 사용해 소수·그룹 구분자 등을 바꿀 수 있어요. 소수 구분자가 전부 소수 부분이 아닌 자릿수에 나타나는지, 음수 접두사가 뒤에 오는지 등은 유니코드 데이터에서 로케일로부터 설정돼요.