BigDecimal
클래스는 NumberFormatException
을 던지는 입력에 대해 고유 한 유효성 검사 알고리즘을 구현합니다.
BigDecimalConverter
가 13
로 1,3
을 분석하는 이유는 보이지 않는 원시 DecimalFormat
을 사용하고 있다는 점이다. AbstractNumberConverter.parse()
에서 getNumberFormat(locale)
및 parse()
방법의 조합 식 중 개찰을 얻어 다음 코드로 귀결
NumberFormat format = NumberFormat.getInstance(Locale.US);
format.setParseBigDecimal(true);
BigDecimal bd = format.parseObject("1,3");
System.out.println(bd.toString()); // Prints 13 !
UPDATE가 정의되어 있기 때문에 DecimalFormat
가 ,
문자 무시 이유는 미국 로케일의 그룹화 구분 기호는 DecimalFormatSymbols
입니다. 허용되며, 유효한 것은 1,300.5
입니다.
당신이
13
에
1,3
을 변환하고, 잘못된 형식 변환 예외가 발생하지 않도록하려는 경우
, 당신은 그룹을 사용하여 다른 그룹의 기호를 사용하거나 더 제한적인 패턴을 사용하지 않도록 DecimalFormat
을 수정하기 위해 BigDecimalConverter.getNumberFormat(Locale)
을 무시할 수 .
TextField<BigDecimal> text = new TextField<BigDecimal>(id, model){
@Override
public IConverter getConverter(Class<?> type) {
return new BigDecimalConverter() {
@Override
public NumberFormat getNumberFormat(Locale locale) {
NumberFormat format = super.getNumberFormat(locale);
format.setGroupingUsed(false);
return format;
}
};
}
};
text.setType(BigDecimal.class);
주 : 예를 들어이 getConverter()
의 각 호출에 인스턴스화되지 않고 NumberFormat
예를 BigDecimalConverter.getNumberFormat()
반환을 수정하지 않도록 컨버터의 클래스를 만들고,주의 위의 예를 사용하여, 글로벌 공유 인스턴스 일 수 있습니다.
그냥 추가하면 그룹 구분 기호 인 ,
문자를 무시하는 코드와 정확히 일치합니다 : DecimalFormat.subparse()
branch in line 1522. 1,3
입력시 쉼표는 무시되고 isGroupingUsed()
이 참입니다.
@Chris ['BigDecimalConverter'] (http://grepcode.com/file/repo1.maven.org/maven2/org.apache.wicket/wicket/1.4.17/org/apache/wicket/util/convert/변환기/BigDecimalConverter.java # 44) *는'Locale'을 무시하지 않습니다. 위키 예제의 코드는 변환기의 실제 코드가 아닙니다. 그것이 '13'을 반환하는 이유는 DecimalFormat에만 해당됩니다. –
그것은 내 질문에 대한 두 번째 철저한 대답이었습니다. 고마워, 사비! – prasopes