带数字和字母的字符串到双javafx

带数字和字母的字符串到双javafx,javafx,textfield,Javafx,Textfield,您好,我正在尝试从显示价格的文本字段中读取数字,例如3.00英镑,并将价格值转换为双精度。有办法吗 Double value; value = Double.parseDouble(textField.getText()); 但它不会让我这么做,因为那个标志。有没有办法去掉英镑符号,然后读出数字 感谢JavaFX TextField API中内置了一些更改过滤器处理逻辑,您可以利用它们 导入javafx.application.application; 导入javafx.beans.bin

您好,我正在尝试从显示价格的文本字段中读取数字,例如3.00英镑,并将价格值转换为双精度。有办法吗

Double value;
value = Double.parseDouble(textField.getText()); 
但它不会让我这么做,因为那个标志。有没有办法去掉英镑符号,然后读出数字

感谢

JavaFX TextField API中内置了一些更改过滤器处理逻辑,您可以利用它们

导入javafx.application.application;
导入javafx.beans.binding.Bindings;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.*;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
导入javafx.util.StringConverter;
导入java.text.DecimalFormat;
导入java.text.ParseException;
类CurrencyFormatter扩展了TextFormatter{
专用静态最终双默认值=5.00d;
私有静态最终字符串CURRENCY_SYMBOL=“\u00A3”//英镑
私有静态最终DecimalFormat strictZeroDecimalFormat
=新的十进制格式(货币符号+“#####,##0.00”);
CurrencyFormatter(){
超级(
//字符串转换器在字符串和值属性之间进行转换。
新的StringConverter(){
@凌驾
公共字符串toString(双值){
返回strictZeroDecimalFormat.format(值);
}
@凌驾
public Double fromString(字符串字符串){
试一试{
返回strictZeroDecimalFormat.parse(string).doubleValue();
}捕获(解析异常){
返回Double.NaN;
}
}
},
默认_值,
//如果无法分析文本输入,更改筛选器将拒绝该文本输入。
更改->{
试一试{
strictZeroDecimalFormat.parse(change.getControlNewText());
回报变化;
}捕获(解析异常){
返回null;
}
}
);
}
}
公共类FormattedTextField扩展了应用程序{
公共静态void main(字符串[]args){launch(args);}
@凌驾
公共作废开始(最后阶段){
TextField TextField=新的TextField();
setTextFormatter(新的CurrencyFormatter());
标签文本=新标签();
text.textProperty().bind(
Bindings.concat(
“案文:”,
textField.textProperty()
)
);
标签值=新标签();
value.textProperty().bind(
Bindings.concat(
“价值:”,
textField.getTextFormatter().valueProperty().asString()
)
);
VBox布局=新的VBox(
10,
textField,
文本,
价值
新建按钮(“应用”)
);
布局。设置填充(新插图(10));
舞台场景(新场景(布局));
stage.show();
}
}
如果您对用户体验非常挑剔(例如,用户可以输入货币符号吗?如果用户不输入货币符号会发生什么情况?允许使用空值吗?等等),则过滤器的确切规则可能会变得有点棘手。上面的示例在合理的用户体验和(相对的)用户体验之间进行了折衷易于编程的解决方案。对于实际的生产级应用程序,您可能希望进一步调整逻辑和行为,以适合您的特定应用程序

注意,“应用”按钮实际上不需要做任何事情来应用更改。当用户更改焦点远离文本字段时(只要通过更改过滤器),将应用更改。因此,如果用户单击apply按钮,它将获得焦点,文本字段将失去焦点,如果适用,将应用更改

上面的例子将货币值视为双倍值(与问题相匹配),但那些认真对待货币的人可能希望看到

有关使用类似概念的更简单解决方案,请参见:


考虑到您将始终拥有,您可以使用
textField.getText().substring(1)
也许
textField.getText().replaceAll(“;”)
会更安全一些。。。如果用户没有键入“£”,或者他们在开头加了空格,或者…可能与或重复,该怎么办
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;

import java.text.DecimalFormat;
import java.text.ParseException;

class CurrencyFormatter extends TextFormatter<Double> {
    private static final double DEFAULT_VALUE = 5.00d;
    private static final String CURRENCY_SYMBOL = "\u00A3"; // british pound

    private static final DecimalFormat strictZeroDecimalFormat  
        = new DecimalFormat(CURRENCY_SYMBOL + "###,##0.00");

    CurrencyFormatter() {
        super(
                // string converter converts between a string and a value property.
                new StringConverter<Double>() {
                    @Override
                    public String toString(Double value) {
                        return strictZeroDecimalFormat.format(value);
                    }

                    @Override
                    public Double fromString(String string) {
                        try {
                            return strictZeroDecimalFormat.parse(string).doubleValue();
                        } catch (ParseException e) {
                            return Double.NaN;
                        }
                    }
                },
                DEFAULT_VALUE,
                // change filter rejects text input if it cannot be parsed.
                change -> {
                    try {
                        strictZeroDecimalFormat.parse(change.getControlNewText());
                        return change;
                    } catch (ParseException e) {
                        return null;
                    }
                }
        );
    }
}

public class FormattedTextField extends Application {

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

    @Override
    public void start(final Stage stage) {
        TextField textField = new TextField();
        textField.setTextFormatter(new CurrencyFormatter());

        Label text = new Label();
        text.textProperty().bind(
                Bindings.concat(
                        "Text: ",
                        textField.textProperty()
                )
        );

        Label value = new Label();
        value.textProperty().bind(
                Bindings.concat(
                        "Value: ",
                        textField.getTextFormatter().valueProperty().asString()
                )
        );

        VBox layout = new VBox(
                10,
                textField,
                text,
                value,
                new Button("Apply")
        );
        layout.setPadding(new Insets(10));

        stage.setScene(new Scene(layout));
        stage.show();
    }

}