java - 输入数字时分隔文本字段中的数字 (Javafx)

标签 java javafx delimiter

我创建了一个简单的 javafx 程序。当我在文本字段中输入数字时,我想将数字三乘三分隔。我使用了 stackoverflow 链接中给出的两个解决方案( How to format text of TextField? JavaFXJava 8 U40 TextFormatter (JavaFX) to restrict user input only for decimal number )

但他们都不为我工作。第一个解决方案(设置文本格式化程序)对我来说没用(或者也许我无法以正确的方式使用它),但第二个解决方案可以工作,但只接受 4 位数字,我在文本字段中输入的其他数字是与我输入时不带逗号的样式相同。

我想像这样分隔每三位数字:12,564,546,554 如果有人知道解决方案,请帮助我克服这个问题。 谢谢。

 import javafx.application.Application;
 import javafx.scene.Scene;
 import javafx.scene.control.TextField;
 import javafx.scene.control.TextFormatter;
 import javafx.scene.layout.HBox;
 import javafx.stage.Stage;

 import java.text.DecimalFormat;
 import java.text.ParsePosition;


 public class DelimiterExample extends Application{


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


@Override
public void start(Stage primaryStage) throws Exception {

    TextField textField = new TextField();
    HBox hBox = new HBox();

    //solution one

    DecimalFormat format = new DecimalFormat( "#,###" );

    textField.setTextFormatter( new TextFormatter<>(c ->
    {
        if ( c.getControlNewText().isEmpty() )
        {
            return c;
        }

        ParsePosition parsePosition = new ParsePosition( 0 );
        Object object = format.parse( c.getControlNewText(), parsePosition );

        if ( object == null || parsePosition.getIndex() < c.getControlNewText().length() )
        {
            return null;
        }
        else
        {

            return c;
        }

    }));


    // solution two

    textField.textProperty().addListener((obs , oldVal , newVal)-> {

        if (newVal.matches("\\d*")) {
            DecimalFormat formatter = new DecimalFormat("#,###");
            String newvalstr = formatter.format(Float.parseFloat(newVal));
            //System.out.println(newvalstr);
            textField.setText(newvalstr);
        }


    });

    hBox.getChildren().add(textField);
    Scene scene = new Scene(hBox , 100 , 100);
    primaryStage.setScene(scene);
    primaryStage.show();
}
}

最佳答案

任何非选择更改的修改都可以通过修改范围之前的字符来修复:

final char seperatorChar = ',';
final Pattern p = Pattern.compile("[0-9" + seperatorChar + "]*");
textField.setTextFormatter(new TextFormatter<>(c -> {
    if (!c.isContentChange()) {
        return c; // no need for modification, if only the selection changes
    }
    String newText = c.getControlNewText();
    if (newText.isEmpty()) {
        return c;
    }
    if (!p.matcher(newText).matches()) {
        return null; // invalid change
    }

    // invert everything before the range
    int suffixCount = c.getControlText().length() - c.getRangeEnd();
    int digits = suffixCount - suffixCount / 4;
    StringBuilder sb = new StringBuilder();

    // insert seperator just before caret, if necessary
    if (digits % 3 == 0 && digits > 0 && suffixCount % 4 != 0) {
        sb.append(seperatorChar);
    }

    // add the rest of the digits in reversed order
    for (int i = c.getRangeStart() + c.getText().length() - 1; i >= 0; i--) {
        char letter = newText.charAt(i);
        if (Character.isDigit(letter)) {
            sb.append(letter);
            digits++;
            if (digits % 3 == 0) {
                sb.append(seperatorChar);
            }
        }
    }

    // remove seperator char, if added as last char
    if (digits % 3 == 0) {
        sb.deleteCharAt(sb.length() - 1);
    }
    sb.reverse();
    int length = sb.length();

    // replace with modified text
    c.setRange(0, c.getRangeEnd());
    c.setText(sb.toString());
    c.setCaretPosition(length);
    c.setAnchor(length);

    return c;
}));

关于java - 输入数字时分隔文本字段中的数字 (Javafx),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50705500/

相关文章:

java - 展平列表列表 - 转换类型不匹配

java - 多态二叉搜索树类型不匹配错误

java - 将数据库中的值填充到 javafx 中的 ObservableList

bash - cut -d,忽略参数中的定界符

mysql - 'DELIMITER $$' 附近的错误

java - 如何从 HttpServlet 获取客户端的 MAC 地址?

java - 创建 session 工厂时出现空指针异常

java - 如何搜索存储在 hashmap 中的匹配对?

java - 触摸输入和 OpenJDK 11 与 JavaFX 11 的问题

java - 如何为 java 扫描器使用多个分隔符