如何将textfield解析为bigdecimal

时间:2015-03-16 13:49:22

标签: java math javafx

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

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

2 个答案:

答案 0 :(得分:1)

不,那不是你应该怎么做的 - 你当前正在从一个字符串解析为float,然后将该float转换为BigDecimal。您清楚地知道如何从文本字段中获取字符串,因为您已经在第一行中执行了该操作 - 您只需使用BigDecimal执行此操作:

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

但是,您应该注意,这不会对文化敏感 - 例如,它将始终使用.作为小数点分隔符。如果您需要对文化敏感的解析,则应使用NumberFormat

答案 1 :(得分:1)

这是一个带有属性,文本字段和转换器的示例:

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

}