2016-01-29 1 views
1

Привет Я пытаюсь прочитать цифры из текстового поля, которое показывает цену, например. £ 3,00 и конвертировать стоимость цены в двойную. Есть ли способ сделатьСтрока с числами и буквами для двойного javafx

Double value; 
value = Double.parseDouble(textField.getText()); 

Но это не позволит мне сделать это из-за знака Е. Есть ли способ снять знак фунта, а затем прочитать цифры.

Благодаря

+0

Принимая во внимание, что вы всегда будете иметь Е, вы можете использовать 'textField.getText() подстрока (1.) ' – ItachiUchiha

+0

Возможно,' textField.getText(). ReplaceAll ("£", "") 'будет более безопасным, хотя ... что, если пользователь не наберет« £ », или если они помещают пробел в начале, или ... –

+0

Возможный дубликат [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

ответ

3

Там находится некоторое TextFormatter и замена фильтра логика обработки, встроенный в API JavaFX TextField, вы могли бы использовать это.

currency format

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.

Для более простого решения с использованием аналогичных концепций, смотрите также:

 Смежные вопросы

  • Нет связанных вопросов^_^