ChoiceFormat
ChoiceFormat (숫자 범위에 형식 연결)
숫자의 범위에 형식(format)을 연결하게 해 주는 클래스예요. 주로 MessageFormat 안에서 복수형(plurals)을 처리할 때 사용돼요.
본문
선택은 오름차순의 double 목록으로 지정되는데, 각 항목은 다음 항목까지의 반개방 구간(half-open interval)을 지정해요. 즉 숫자 X가 limit[j] <= X < limit[j+1]이면 j와 일치해요. 일치하는 것이 없으면 숫자가 너무 낮거나 높은지에 따라 첫 번째 또는 마지막 인덱스가 사용돼요. limit 배열이 오름차순이 아니면 형식화 결과가 틀려질 수 있어요. ChoiceFormat은 \u221E를 무한대(INF)와 동등하게 받아들여요.
ChoiceFormat은 다른 Format 클래스와 달리 getInstance 스타일 팩토리 메서드가 아니라 생성자로 객체를 만들어요. 로케일별 설정이 필요 없고 로케일 특정 동작도 구현하지 않기 때문이에요. 생성할 때 형식 배열과 limit 배열을 반드시 지정하는데, 두 배열의 길이는 같아야 해요.
double[] limits = {1, 2, 3, 4, 5, 6, 7};
String[] dayOfWeekNames = {"Sun", "Mon", "Tue", "Wed", "Thur", "Fri", "Sat"};
ChoiceFormat form = new ChoiceFormat(limits, dayOfWeekNames);
ParsePosition status = new ParsePosition(0);
for (double i = 0.0; i <= 8.0; ++i) {
status.setIndex(0);
System.out.println(i + " -> " + form.format(i)
+ " -> " + form.parse(form.format(i), status));
}
간단한 예를 들어볼게요. limits = {0, 1, ChoiceFormat.nextDouble(1)}, formats = {"no files", "one file", "many files"}로 만들면 0은 "no files", 1은 "one file", 1보다 크면 "many files"가 매칭돼요. nextDouble()은 반개방 구간을 만들기 위해 바로 다음으로 큰 double 값을 얻는 데 쓸 수 있어요.
부호 있는 특수 문자로 이루어진 패턴 문자열로도 만들 수 있어요. 예: "-1#is negative| 0#is zero or fraction | 1#is one |1.0<is 1+ |2#is two |2<is more than 2." 여기서 #는 이 값 이상 범위를, <는 초과 범위를 뜻해요.
동기화: ChoiceFormat은 동기화되지 않아요. 각 스레드마다 별도의 format 인스턴스를 만드는 것이 권장되며, 여러 스레드가 동시에 접근한다면 외부에서 동기화해야 해요.