문제

나는 a를 사용하고있다 NumberFormatter 그리고 JFormattedTextField, 하지만 .getValue() 사용자가 보는 것과 같은 가치를 반환하지 않습니다.

입력 스트링은 Numberformats Parse-Method를 사용하여 구문 분석하고 NumberFormat을 얻습니다. NumberFormat.getNumberInstance(); 실제 로케일과 함께. 그래서 나는 그것을 쉽게 확장하고 내 자신의 구문 분석 방법을 쓸 수 있다고 생각하지 않습니까?

예를 들어, 사용자가 유형되는 경우 1234.487그만큼 getValue() 돌아올 것입니다 :1234.487 그러나 사용자는 표시됩니다 1,234.49

또 다른 예, 사용 NumberFormat.getCurrencyInstance();. 사용자 유형 1234.487 그리고 getValue() 돌아올 것입니다 1234.487 그러나 사용자는 표시됩니다 $1,234.49

대신에, Formatter가 반올림하지 않고 값을 형성 할 수 없다면, 나는 parseexception이 생성되기를 원합니다. 사용자가 유형되는 경우 동일합니다 4.35b6, 기본적으로 Formatter가 표시됩니다 4.35 그리고 가치는 될 것입니다 4.35, 그러나 사용자가 유효하지 않은 값.

다음은 다음과 같이 시도한 코드입니다.

NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
final JFormattedTextField ftf = new JFormattedTextField(nf);
ftf.setValue(new BigDecimal("1234.50"));

// Print the value from ftf
final JTextField txt = new JTextField(12);
txt.addFocusListener(new FocusAdapter() {
    public void focusGained(FocusEvent e) {
        txt.setText(ftf.getValue().toString());
    }
});

사용자가 보는 것과 동일한 가치를 얻는 방법은 무엇입니까?

도움이 되었습니까?

해결책

당신은 확장해야합니다 NumberFormatter 보다는 NumberFormat 그리고 무시합니다 stringToValue 문자열이 구문 분석되면 원래 값을 되 찾는지 확인합니다.

class StrictNumberFormatter extends javax.swing.text.NumberFormatter {
    @Override
    public Object stringToValue(String text) throws ParseException {
        Object parsedValue = super.stringToValue(text);
        String expectedText = super.valueToString(parsedValue);
        if (! super.stringToValue(expectedText).equals(parsedValue)) {
            throw new ParseException("Rounding occurred", 0);
        }
        return parsedValue;
    }

    public StrictNumberFormatter(NumberFormat nf) {
        super(nf);
    }
}

NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
JFormattedTextField.AbstractFormatter formatter = new StrictNumberFormatter(nf);
final JFormattedTextField ftf = new JFormattedTextField(formatter);
ftf.setValue(new BigDecimal("1234.50"));

이 Formatter는 반올림 전후의 값이 일치하지 않으면 새 텍스트를 거부합니다.

참고 : 이것은 비교합니다 가치, 줄이 아닙니다. 그룹화 문자 제거와 같은 변경 사항을 견딜 수 있습니다 ("$1,000" => "$1000") 및 후행 0 ("$1.20" => "$1.2"). 기본적으로 NumberFormat 동일한 값을 반환하면 허용됩니다. 그러나 NumberFormat 여전히 적용하십시오. 예를 들어 통화 기호를 제거하거나 선행 공간 등을 삽입해서는 안됩니다.

다른 팁

이 시도:

txt.setText(ftf.getFormatter().valueToString(ftf.getValue()));

또한 처리해야합니다 java.text.ParseExceptionvalueToString 방법이 던져집니다.

편집하다:Formatter는 유효하지 않은 항목을 모두 허용하지 않도록 설정할 수 있습니다.

    ((DefaultFormatter)ftf.getFormatter()).setAllowsInvalid( false );
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top