JTable Editor Number Format

I need to show numbers in jTable with exact 2 decimal places. To do this, I created my own cell editor:

public class NumberCellEditor extends DefaultCellEditor { public NumberCellEditor(){ super(new JFormattedTextField()); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { JFormattedTextField editor = (JFormattedTextField) super.getTableCellEditorComponent(table, value, isSelected, row, column); if (value!=null){ DecimalFormat numberFormat = new DecimalFormat("#,##0.00;(#,##0.00)"); editor.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.NumberFormatter(numberFormat))); Number num = (Number) value; String text = numberFormat.format(num); editor.setHorizontalAlignment(SwingConstants.RIGHT); editor.setText(text); } return editor; } } 

This cell editor is great for English, where the dot is used as a decimal point. But in German, it does not take a semicolon as a decimal point. Please let me know where the problem is in my code. Thanks in advance.

EDIT: This is how I worked:

 public class NumberCellEditor extends DefaultCellEditor { public NumberCellEditor(){ super(new JFormattedTextField()); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { JFormattedTextField editor = (JFormattedTextField) super.getTableCellEditorComponent(table, value, isSelected, row, column); if (value instanceof Number){ Locale myLocale = Locale.getDefault(); NumberFormat numberFormatB = NumberFormat.getInstance(myLocale); numberFormatB.setMaximumFractionDigits(2); numberFormatB.setMinimumFractionDigits(2); numberFormatB.setMinimumIntegerDigits(1); editor.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory( new NumberFormatter(numberFormatB))); editor.setHorizontalAlignment(SwingConstants.RIGHT); editor.setValue(value); } return editor; } @Override public boolean stopCellEditing() { try { // try to get the value this.getCellEditorValue(); return super.stopCellEditing(); } catch (Exception ex) { return false; } } @Override public Object getCellEditorValue() { // get content of textField String str = (String) super.getCellEditorValue(); if (str == null) { return null; } if (str.length() == 0) { return null; } // try to parse a number try { ParsePosition pos = new ParsePosition(0); Number n = NumberFormat.getInstance().parse(str, pos); if (pos.getIndex() != str.length()) { throw new ParseException( "parsing incomplete", pos.getIndex()); } // return an instance of column class return new Float(n.floatValue()); } catch (ParseException pex) { throw new RuntimeException(pex); } } } 
+6
source share
4 answers

Take advantage of the locale:

  //Locale myLocale = Locale.GERMANY; //... or better, the current Locale Locale myLocale = Locale.getDefault(); // better still NumberFormat numberFormatB = NumberFormat.getInstance(myLocale); numberFormatB.setMaximumFractionDigits(2); numberFormatB.setMinimumFractionDigits(2); numberFormatB.setMinimumIntegerDigits(1); edit.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory( new NumberFormatter(numberFormatB))); 
+7
source

eg

 import java.text.NumberFormat; import java.math.RoundingMode; import javax.swing.table.DefaultTableCellRenderer; public class SubstDouble2DecimalRenderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; private int precision = 0; private Number numberValue; private NumberFormat nf; public SubstDouble2DecimalRenderer(int p_precision) { super(); setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); precision = p_precision; nf = NumberFormat.getNumberInstance(); nf.setMinimumFractionDigits(p_precision); nf.setMaximumFractionDigits(p_precision); nf.setRoundingMode(RoundingMode.HALF_UP); } public SubstDouble2DecimalRenderer() { super(); setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); nf = NumberFormat.getNumberInstance(); nf.setMinimumFractionDigits(2); nf.setMaximumFractionDigits(2); nf.setRoundingMode(RoundingMode.HALF_UP); } @Override public void setValue(Object value) { if ((value != null) && (value instanceof Number)) { numberValue = (Number) value; value = nf.format(numberValue.doubleValue()); } super.setValue(value); } } 
+2
source

Try

 DecimalFormat numberFormat = new DecimalFormat("\\d*([\\.,\\,]\\d{0,2})?"); 
0
source

Just change #,###,###,##0.00 to #.###.###.##0,00

0
source

Source: https://habr.com/ru/post/891867/


All Articles