사용자가 jformattedtextfield에서 보는 것과 동일한 가치를 얻는 방법은 무엇입니까?
-
18-09-2019 - |
문제
나는 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.ParseException
그 valueToString
방법이 던져집니다.
편집하다:Formatter는 유효하지 않은 항목을 모두 허용하지 않도록 설정할 수 있습니다.
((DefaultFormatter)ftf.getFormatter()).setAllowsInvalid( false );