Там находится некоторое TextFormatter и замена фильтра логика обработки, встроенный в API JavaFX TextField, вы могли бы использовать это.
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();
}
}
Точные правила для DecimalFormat и фильтр может получить немного сложнее, если вы очень частности, об опыте пользователя (например, пользователь сможет ввести символ валюты? Что произойдет, если пользователь не введите символ валюты? допустимы пустые значения и т. д.). В приведенном выше примере предлагается компромисс между разумным пользовательским интерфейсом и (относительно) простым в программном решении. Для реального приложения уровня производительности вы можете настроить логику и поведение немного больше, чтобы соответствовать вашему конкретному приложению.
Примечание. Применить кнопку на самом деле не нужно ничего делать, чтобы применить изменение. Изменения применяются, когда пользователь меняет фокус вдали от текстового поля (если они проходят фильтр изменения). Поэтому, если пользователь нажимает кнопку «Применить», он получает, фокусируется, текстовое поле теряет фокус, и изменение применяется, если это применимо.
В приведенном выше примере рассматриваются значения валюты как удваиваются (в соответствии с вопросом), но те, кто серьезно относится к валюте, возможно, захотят посмотреть на BigDecimal.
Для более простого решения с использованием аналогичных концепций, смотрите также:
Принимая во внимание, что вы всегда будете иметь Е, вы можете использовать 'textField.getText() подстрока (1.) ' – ItachiUchiha
Возможно,' textField.getText(). ReplaceAll ("£", "") 'будет более безопасным, хотя ... что, если пользователь не наберет« £ », или если они помещают пробел в начале, или ... –
Возможный дубликат [Java: удалить все вхождения символа из строки] (http://stackoverflow.com/questions/4576352/java-remove-all-occurrences- of-char-from-string) или http://stackoverflow.com/questions/13386107/java-how-to-remove-single-character-from-a-string – fabian