2016-03-17 54 views
-1

的自動校正我有一個字段,並在其上的過濾器,只允許數字和,雙值輸入

我想,如果我鍵入1,,我自動獲得1,0當我離開文本字段。 我可以解析它並檢查一個子串是否最後有一個,。但在我看來,這不是一個很好的方法。有沒有更好的方法來做到這一點?

+0

你使用的是「TextFormatter」嗎?如果是這樣,提供一個轉換器應該爲你做這個。 (並且,我們之前還沒有過兩次嗎?) –

回答

1

文本格式使用轉換器使用的是過濾輸入:(。顯然,過濾器,可以在這裏提高,如避免多個小數點分隔符輸入)

import java.text.DecimalFormat; 
import java.text.DecimalFormatSymbols; 
import java.util.function.UnaryOperator; 

import javafx.application.Application; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.TextArea; 
import javafx.scene.control.TextField; 
import javafx.scene.control.TextFormatter; 
import javafx.scene.control.TextFormatter.Change; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 
import javafx.util.StringConverter; 

public class DecimalTextField extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     // decimal formatter for default locale: 
     DecimalFormat decimalFormat = new DecimalFormat(); 
     decimalFormat.setMinimumFractionDigits(1); 
     DecimalFormatSymbols symbols = decimalFormat.getDecimalFormatSymbols() ; 
     char decimalSep = symbols.getDecimalSeparator() ; 

     UnaryOperator<Change> filter = change -> { 
      for (char c : change.getText().toCharArray()) { 
       if ((! Character.isDigit(c)) && c != decimalSep) { 
        return null ; 
       } 
      } 
      return change ; 
     }; 

     StringConverter<Double> converter = new StringConverter<Double>() { 

      @Override 
      public String toString(Double object) { 
       return object == null ? "" : decimalFormat.format(object); 
      } 

      @Override 
      public Double fromString(String string) { 
       try { 
        return string.isEmpty() ? 0.0 : decimalFormat.parse(string).doubleValue(); 
       } catch (ParseException e) { 
        return 0.0 ; 
       } 
      } 

     }; 

     TextFormatter<Double> formatter = new TextFormatter<>(converter, 0.0, filter); 
     TextField textField = new TextField(); 
     textField.setTextFormatter(formatter); 

     VBox root = new VBox(10, textField, new TextArea()); 
     root.setAlignment(Pos.CENTER); 
     primaryStage.setScene(new Scene(root, 400, 400)); 
     primaryStage.show(); 
    } 

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

+0

爲什麼我必須重寫toString和fromString方法? – Goldi

+0

如何轉換器知道如何轉換?我真的不明白這個問題。 –

+0

對不起,我從來沒有看到有人重寫這些方法。我總是使用這些方法而不用重寫整數,例如 – Goldi

0

我認爲最好的方法是將字符串轉換爲雙精度型,然後使用DecimalFormat將雙精度型轉換回字符串。這樣你就知道你會知道這個號碼是你想要的格式。