Как создать десятичное текстовое поле и соединить тысячи операторов одновременно в режиме реального времени? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть два метода:

Первый метод - делает мое текстовое поле десятичным в реальном времени, когда пользователь что-то вводит

Второй метод - другой метод, который разделяет мои цифры с (')Тысяча операторов

Мне было интересно, есть ли какое-либо слияние, которое я могу сделать с моими двумя методами, но я застрял.

Я пробовал много примеров регулярных выражений, но ни один из нихпохоже на работу.Вот мой код

//the first method
public static void make_textfield_decimal(JFXTextField txt) {
        txt.textProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                if (!newValue.matches("\\d{0,9}([,.]\\d{0,2})?")) {
                    txt.setText(oldValue);
                }
            }
        });
    }

//the second method 
public static void separate_digits(JFXTextField textField) {
            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;
            }));
        }
...