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