Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NumberFormatException:对于输入字符串:";三十、 ";在文本字段中,与区域设置相关_Java_Mysql_Javafx_Javafx 2_Locale - Fatal编程技术网

Java NumberFormatException:对于输入字符串:";三十、 ";在文本字段中,与区域设置相关

Java NumberFormatException:对于输入字符串:";三十、 ";在文本字段中,与区域设置相关,java,mysql,javafx,javafx-2,locale,Java,Mysql,Javafx,Javafx 2,Locale,我有一个控制器类,它根据选定的选项加载场景。我把它叫做“CMenu” 有“产品”菜单,看起来像这样 当我键入成本并设置利润时,使用onKeyEvent计算价格,格式为“123.456,99”。反之亦然 txtUtil.setOnKeyReleased(new EventHandler<KeyEvent>() { @Override public void handle(KeyEvent event) { if (txtCost

我有一个控制器类,它根据选定的选项加载场景。我把它叫做“CMenu”

有“产品”菜单,看起来像这样

当我键入成本并设置利润时,使用onKeyEvent计算价格,格式为“123.456,99”。反之亦然

txtUtil.setOnKeyReleased(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent event) {
            if (txtCosto.getText() != null && txtUtil.getText() != null && txtPrecio.getText() != null) {
                try {
                    costo = Double.parseDouble(txtCosto.getText());
                    util = Double.parseDouble(txtUtil.getText());
                    precio = (costo / (((util / 100) - 1) * (-1)));
                    txtPrecio.setText(String.valueOf(String.format("%.2f", precio)));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                JOptionPane.showMessageDialog(null, "error en algo");
            }

        }
    });
        txtPrecio.setOnKeyReleased(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent event) {
            if (txtCosto.getText() != null && txtUtil.getText() != null && txtPrecio.getText() != null) {
                try {
                    costo = Double.parseDouble(txtCosto.getText());
                    precio = Double.parseDouble(txtPrecio.getText());
                    util = ((costo / precio) - 1) * -100;
                    txtUtil.setText(String.valueOf((double) Math.round(util * 100) / 100));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                JOptionPane.showMessageDialog(null, "error");
            }
        }
    });
}
我发现问题出在ajfmo.sislic.controlador.CProductos$3.handle(CProductos.java:164),但我发现真正的问题是场景获得的默认区域设置,我改为en,问题消失了,但是如果我想保持默认区域设置,而不得到那个错误怎么办?

除了将记录保存到MySQL数据库中之外,如果我更改了该区域设置,是否会出现问题?


非常感谢您阅读本文。

要以与区域设置相关的方式(包括分组字符和与区域设置相关的小数分隔符)将文本解析为数值,请使用对象

这是一个非常快速的演示,应该很容易适应您的应用程序:

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

public class DecimalFormatTest {

    public static void main(String[] args) throws ParseException {

        // use system default locale:
        // NumberFormat format = DecimalFormat.getInstance();

        // or specify the locale explicitly:
        NumberFormat format = DecimalFormat.getInstance(new Locale("es", "VE"));

        String text = "123.456,01" ;
        double value = format.parse(text).doubleValue();
        System.out.println("Parsed value as double: " +value);
        System.out.println("Value formatted again as text: " + format.format(value));
    }

}
这给出了输出

解析为双精度的值:123456.01
重新格式化为文本的值:123.456,01

< /代码>

.Luff.ValueOf,和扩展Douffy.PARSEBULL,不考虑浮点数的国际表示。Double.valueOf上的javadoc声明如下:

要解释浮点值的本地化字符串表示,请使用java.text.NumberFormat的子类。

要获取NumberFormat的本地化版本,请使用它的getInstance方法。下面两行代码

costo = Double.parseDouble(txtCosto.getText());
precio = Double.parseDouble(txtPrecio.getText());
应改为,

NumberFormat nf = NumberFormat.getNumberInstance(); // Use JVM default locale
costco = nf.parse(txtCosto.getText()).doubleValue();
precio = nf.parse(txtPrecio.getText()).doubleValue();

在解析之前,您可以检查什么是区域设置以及它的十进制分隔符,然后只需在
getText()
上调用
.replace()
,并将其替换到右侧。1。不要使用键事件处理程序响应文本字段中的更改(如果用户使用鼠标粘贴数据会发生什么情况?)。改为使用
textProperty()
注册侦听器。2.不要将Swing(例如您的
JOptionPane
)和JavaFX混用;这将挂在许多系统上。3.使用一个实例,该实例可以将文本解析(以及格式化)为数字,并考虑语言环境。@DavidS。谢谢你的建议!但这不是我想要的方法。@James\u D你好,吉姆!非常感谢。非常欢迎并感谢您的建议,我现在正在努力,您的回答还带来了其他问题,但我认为我可以解决这些问题+1:这就解决了我遇到的错误。现在我发现了一个bug,但我想这是我自己可以解决的。我正在重构这个类和方法,看看HQL和那个逗号值是否没有问题。非常感谢您的回复,先生,萨卢多斯,委内瑞拉,您已经知道了!
costo = Double.parseDouble(txtCosto.getText());
precio = Double.parseDouble(txtPrecio.getText());
NumberFormat nf = NumberFormat.getNumberInstance(); // Use JVM default locale
costco = nf.parse(txtCosto.getText()).doubleValue();
precio = nf.parse(txtPrecio.getText()).doubleValue();