Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.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 如何将textfield解析为bigdecimal_Java_Math_Javafx - Fatal编程技术网

Java 如何将textfield解析为bigdecimal

Java 如何将textfield解析为bigdecimal,java,math,javafx,Java,Math,Javafx,可以从文本字段解析BigDecimal吗? 我见过一些代码,它们从字符串解析bigdecimal。 但是也可以在textfield上使用它吗。 我已经制定了一些代码使其工作。但我不知道我是否应该这样做 Float price = Float.parseFloat(textFieldInvoiceServicePrice.getText()); String servicetext = textFieldInvoiceService.getText(); BigDecimal priceExcl=

可以从文本字段解析BigDecimal吗? 我见过一些代码,它们从字符串解析bigdecimal。 但是也可以在textfield上使用它吗。 我已经制定了一些代码使其工作。但我不知道我是否应该这样做

Float price = Float.parseFloat(textFieldInvoiceServicePrice.getText());
String servicetext = textFieldInvoiceService.getText();
BigDecimal priceExcl=  BigDecimal.valueOf(price);

不,这不是您应该做的-您当前正在从字符串解析为浮点,然后将该浮点转换为
BigDecimal
。很明显,您知道如何从文本字段中获取字符串,因为您已经在第一行中执行了该操作-您可以使用
BigDecimal
执行该操作:

BigDecimal price = new BigDecimal(textFieldInvoiceServicePrice.getText());

但是,您应该注意,它不会区分区域性-例如,它将始终使用
作为十进制分隔符。如果需要区分区域性的解析,应该使用
NumberFormat

下面是一个包含属性、文本字段和转换器的示例:

public class MoneyParser extends Application {

    ObjectProperty<BigDecimal> money = new SimpleObjectProperty<BigDecimal>();

    @Override
    public void start(Stage primaryStage) {

        Group root = new Group();

        TextField textField = new TextField();

        // bind to textfield
        Bindings.bindBidirectional(textField.textProperty(), moneyProperty(), new MoneyStringConverter());

        // logging
        money.addListener((ChangeListener<Number>) (observable, oldValue, newValue) -> System.out.println("Money: " + newValue));

        root.getChildren().addAll(textField);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }

    public class MoneyStringConverter extends StringConverter<BigDecimal> {

        DecimalFormat formatter;

        public MoneyStringConverter() {
            formatter = new DecimalFormat("0.0", new DecimalFormatSymbols(Locale.US));
            formatter.setParseBigDecimal(true);
        }

        @Override
        public String toString(BigDecimal value) {

            // default
            if( value == null)
                return "0";

            return formatter.format( (BigDecimal) value);

        }

        @Override
        public BigDecimal fromString(String text) {

            // default
            if (text == null || text.isEmpty())
                return new BigDecimal( 0);

            try {

                return (BigDecimal) formatter.parse( text);

            } catch (ParseException e) {
                throw new RuntimeException(e);
            }

        }
    }

    public final ObjectProperty<BigDecimal> moneyProperty() {
        return this.money;
    }

    public final java.math.BigDecimal getMoney() {
        return this.moneyProperty().get();
    }

    public final void setMoney(final java.math.BigDecimal money) {
        this.moneyProperty().set(money);
    }

}
公共类MoneyParser扩展应用程序{
ObjectProperty money=新的SimpleObjectProperty();
@凌驾
公共无效开始(阶段primaryStage){
组根=新组();
TextField TextField=新的TextField();
//绑定到文本字段
Bindings.bindBidirective(textField.textProperty(),moneyProperty(),new MoneyStringConverter());
//伐木
money.addListener((ChangeListener)(可观察、旧值、新值)->System.out.println(“money:+newValue”);
root.getChildren().addAll(textField);
场景=新场景(根,300,250);
setTitle(“你好,世界!”);
初级阶段。场景(场景);
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
公共类MoneyStringConverter扩展了StringConverter{
十进制格式化程序;
公帑({
格式化程序=新的DecimalFormat(“0.0”,新的DecimalFormatSymbols(Locale.US));
setParseBigDecimal(true);
}
@凌驾
公共字符串toString(BigDecimal值){
//违约
如果(值==null)
返回“0”;
返回formatter.format((BigDecimal)值);
}
@凌驾
公共BigDecimal fromString(字符串文本){
//违约
if(text==null | | text.isEmpty())
返回新的BigDecimal(0);
试一试{
return(BigDecimal)格式化程序.parse(text);
}捕获(解析异常){
抛出新的运行时异常(e);
}
}
}
公共最终对象属性moneyProperty(){
归还这笔钱;
}
public final java.math.BigDecimal getMoney(){
返回此.moneyProperty().get();
}
公共最终void setMoney(最终java.math.BigDecimal money){
this.moneyProperty().set(money);
}
}

对于BigDecimal和的JavaFX属性包装器,而不是使用double来表示货币,这可能是一个很好的选择,当然目前还不存在这样的东西。哦,你说得对。我把它改为Object和BigDecimal。