转换String-> Float-> String时出现问题

时间:2011-07-04 08:29:47

标签: java swing

我有一个JTable,我输入一些值。这是监听器函数,知道它是否对值进行了任何更改,因此我可以更新它们。值必须具有指示的格式(#。###),所以如果客户端输入的值超过3,我正在执行此修复以将浮点数舍入为3位小数。

    private class CambioTablaPretratamientoListener implements TableModelListener{
    public void tableChanged(TableModelEvent e){
        try{
            if(enviarDatosADispositivo){
                TableModel model = (TableModel)e.getSource();
                float value = Float.parseFloat((String)model.getValueAt(e.getLastRow(), 1));
                DecimalFormat dec = new DecimalFormat("#.###");
                String aux = dec.format(value);
                if(model.getValueAt(e.getLastRow(), 1).equals(aux))
                    return;
                else
                    model.setValueAt(aux, e.getLastRow(), 1);
                value = Float.parseFloat(aux);

                String nombreAtributo = (String)model.getValueAt(e.getLastRow(), 0);

                nodoAModificar.setPretratamientUserParameter(nombreAtributo, value);     
            }
        }catch(BusinessException ex){
            ex.printStackTrace();
        }
    }
}

代码似乎首先起作用,因为它会轮询并且数字会出现在表中,但值不会更新。我猜我在使用DecimalFormat时出错了,因为如果我将这个函数保留下来,它会起作用:

    private class CambioTablaPretratamientoListener implements TableModelListener{
    public void tableChanged(TableModelEvent e){
        try{
            if(enviarDatosADispositivo){
                TableModel model = (TableModel)e.getSource();
                float value = Float.parseFloat((String)model.getValueAt(e.getLastRow(), 1));
                String nombreAtributo = (String)model.getValueAt(e.getLastRow(), 0);

                nodoAModificar.setPretratamientUserParameter(nombreAtributo, value);     
            }
        }catch(BusinessException ex){
            ex.printStackTrace();
        }
    }
}

并且决定

3 个答案:

答案 0 :(得分:2)

您似乎认为将浮点数转换为String并再次返回可以使其具有一定数量的小数位。这是荒谬的。 FP值没有任何小数位。他们有二进制位置。如果小数部分是2的负幂,例如,这些仅对应于固定的小数位数。 0.5,0.125,0.0625等

答案 1 :(得分:2)

相反,请将DecimalFormat应用为custom table cell renderer

答案 2 :(得分:0)

如果你使用BigDecimal,你实际上可以截断数字,而不是试图使用Float(缺乏)精度。