Chaîne de caractères avec des chiffres et des lettres pour doubler javafx
Salut j'essaie de lire les nombres d'un champ de texte qui montre un prix par exemple £3.00, et convertir la valeur du prix en un double. Est il possible de le faire
Double value;
value = Double.parseDouble(textField.getText());
mais il ne me laisse pas faire cela à cause du £ signe. Est-il un moyen de dépouiller le signe dièse, puis de lire les chiffres.
Merci
1 réponses
il y a quelque TextFormatter et changer la logique de gestion du filtre intégrée dans L'API JavaFX TextField, vous pouvez vous en servir.
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();
}
}
les règles exactes pour DecimalFormat et le filtre pourrait être un peu délicat si vous êtes très particulier sur l'expérience de l'utilisateur (par exemple, l'utilisateur peut-il entrer le symbole de la monnaie? ce qui se passe si l'utilisateur n'entre pas un symbole de la monnaie? sont vides valeurs autorisées? etc.) L'exemple ci-dessus offre un compromis entre une expérience utilisateur raisonnable et une solution (relativement) facile à programmer. Pour une application de niveau de production réelle, vous pourriez vouloir ajuster la logique et le comportement un peu plus pour correspondre à votre application particulière.
notez que le bouton Appliquer n'a pas besoin de faire quoi que ce soit pour appliquer le changement. Les changements sont appliqués lorsque l'utilisateur change de foyer loin du champ de texte (tant qu'ils passent le changement de filtre). Ainsi, si l'utilisateur clique sur le bouton apply, il gagne, focus, le champ de texte perd focus et le changement est appliqué s'il y a lieu.
dans l'exemple ci-dessus, les valeurs monétaires sont considérées comme doublées (pour correspondre à la question), mais ceux qui sont sérieux au sujet de la monnaie peuvent vouloir se tourner vers BigDecimal .
pour une solution plus simple utilisant des concepts similaires, Voir aussi: