Validación de JavaFX TextField para la entrada de enteros y también permite K o k (para Mil) o M o m (para Millones) en el último

Quiero agregar validación en javafx TextField para que el usuario solo pueda insertar valores enteros ([0-9] y Dot). Además, el usuario debe poder insertar B o b (para Billion) y K o k (para Thousand) y M o m (para Million). Básicamente debería ser un campo de cantidad. Eliminar y Retroceso también deberían funcionar.

por ejemplo :

10k debería convertirse en 10,000.00 tan pronto como el usuario presione k y K no debería mostrarse en el campo cantidad (campo de texto) De manera similar, 10M o 10m deberían convertirse en 10,000,000.00

adsadi342fn3 o 31233123werwer o dsad342134k no deben poder ingresar en el campo de texto.

He usado el método getKeyChar al validar TextField en el caso de Swing. Pero necesito la misma implementación en el caso de JavaFx donde no tenemos el método getKeyChar.

He utilizado el siguiente método, pero el problema con esto es que permite al usuario ingresar cualquier valor. ejemplo: sdafewr23rf

private void amountEntered() {
        if (amountField != null) {
            String value;
            char[] charArray = amountField.getText().toCharArray();
            if (charArray.length > 0)
                switch (charArray[charArray.length - 1]) {
                    case 't':
                    case 'T':
                        value = multiplyValue(amountField.getText(), new BigDecimal(1000000000000.0));
                        updateAmount(value);
                        break;
                    case 'b':
                    case 'B':
                        value = multiplyValue(amountField.getText(), new BigDecimal(1000000000.0));
                        updateAmount(value);
                        break;
                    case 'm':
                    case 'M':
                        value = multiplyValue(amountField.getText(), new BigDecimal(1000000.0));
                        updateAmount(value);
                        break;
                    case 'k':
                    case 'K':
                        value = multiplyValue(amountField.getText(), new BigDecimal(1000.0));
                        updateAmount(value);
                        break;
                    case '0':
                    case '1':
                    case '2':
                    case '3':
                    case '4':
                    case '5':
                    case '6':
                    case '7':
                    case '8':
                    case '9':
                    case '.':
                    case ',':
                        updateAmount(amountField.getText());
                        break;
                    default:
                        break;
                }
        }
    }

private String multiplyValue(String number, BigDecimal multValue) {
        //get rid of "," for double parsing
        BigDecimal value = new BigDecimal(cleanDouble(number.substring(0, number.length() - 1)));
        value = value.multiply(multValue);
        return value.toPlainString();
    }

Respuestas a la pregunta(3)

Su respuesta a la pregunta