JTable单元编辑器编号格式

我需要在jTable中显示精确的2位小数。 为此,我创建了一个自定义单元格编辑器:

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; } } 

此单元格编辑器适用于英语区域设置,其中点用作小数点。 但在德语语言环境中,它不接受逗号作为小数点的值。 如果我的代码中存在问题,请告诉我。 提前致谢。

编辑:这是我如何工作:

 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); } } } 

使用区域设置有利于您:

  //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))); 

例如

 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); } } 

尝试

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

只需使用#,###,###,##0.00更改#,###,###,##0.00 #.###.###.##0,00