io.github.dinamo541.corefx.ui

Format

Singleton final JavaFX

Input validation and formatting for JavaFX text controls. Provides ready-made TextFormatters that restrict what users can type — integers, two-decimal numbers, national IDs, Unicode-aware letters and a max-length cap — plus shared, immutable date formatters and a thousands-separated decimal formatter. Validación y formateo de entrada para controles de texto de JavaFX. Ofrece TextFormatters listos para usar que restringen lo que el usuario puede teclear — enteros, números de dos decimales, identificaciones, letras compatibles con Unicode y un tope de longitud máxima — más formateadores de fecha inmutables y compartidos y un formateador decimal con separador de miles.

OverviewVisión general

Attach a formatter to any TextField with field.setTextFormatter(Format.getInstance().integerFormat()). Each formatter rejects invalid keystrokes as they happen, so the field can never hold malformed input. Regex patterns are pre-compiled once, not rebuilt per keystroke. Asocia un formateador a cualquier TextField con field.setTextFormatter(Format.getInstance().integerFormat()). Cada formateador rechaza las pulsaciones inválidas a medida que ocurren, así el campo nunca puede contener entrada malformada. Las regex se precompilan una vez, no se reconstruyen en cada pulsación.

Quick startInicio rápido

Format fmt = Format.getInstance();

quantityField.setTextFormatter(fmt.integerFormat());
priceField.setTextFormatter(fmt.twoDecimalFormat());
idField.setTextFormatter(fmt.idFormat(20));
nameField.setTextFormatter(fmt.lettersFormat(50));   // accepts "María", "Ñoño"
noteField.setTextFormatter(fmt.maxLengthFormat(140));

// Display a formatted amount:
String shown = fmt.getDecimalFormat().format(1234567.89);   // "1,234,567.89"

Input formattersFormateadores de entrada

TextFormatter<String> integerFormat()

Digits only — no decimals, signs or other characters. Valid: "0", "123", "1234567".Solo dígitos — sin decimales, signos ni otros caracteres. Válidos: "0", "123", "1234567".

TextFormatter<String> twoDecimalFormat()

Non-negative decimals with up to two fractional digits; accepts thousands separators. Valid: "123", "123.45", "1,234.56", "1,234,567.89".Decimales no negativos con hasta dos dígitos fraccionarios; acepta separadores de miles. Válidos: "123", "123.45", "1,234.56", "1,234,567.89".

TextFormatter<String> idFormat(int maxLength)

Alphanumerics and single hyphens (no consecutive hyphens). maxLength ≤ 0 means unlimited. Valid: "12345-6789", "ABC-123-DEF".Alfanuméricos y guiones simples (sin guiones consecutivos). maxLength ≤ 0 significa ilimitado. Válidos: "12345-6789", "ABC-123-DEF".

TextFormatter<String> lettersFormat(int maxLength)

Unicode letters and single spaces between words (no digits/symbols, no consecutive spaces). maxLength ≤ 0 = unlimited. Valid: "John", "Jose Maria", "María José".Letras Unicode y espacios simples entre palabras (sin dígitos/símbolos, sin espacios consecutivos). maxLength ≤ 0 = ilimitado. Válidos: "John", "Jose Maria", "María José".

TextFormatter<String> maxLengthFormat(int length)

Caps the field at length characters; deletion is always allowed.Limita el campo a length caracteres; el borrado siempre se permite.

🌍
Unicode-aware lettersLetras compatibles con Unicode

lettersFormat uses the \p{L} letter class, so accented and non-Latin names (María, Ñoño, José) are accepted — a common pain point with naive [a-zA-Z] filters.lettersFormat usa la clase de letra \p{L}, así que se aceptan nombres acentuados y no latinos (María, Ñoño, José) — un punto de dolor habitual con filtros ingenuos [a-zA-Z].

Shared formattersFormateadores compartidos

MemberMiembroPurposePropósito
formatDateShort (field)A DateTimeFormatter for short dates (e.g. "1/15/09"). Immutable, thread-safe, safe to share.Un DateTimeFormatter para fechas cortas (p. ej. "1/15/09"). Inmutable, thread-safe, seguro de compartir.
formatDateMedium (field)Medium dates (e.g. "Jan 15, 2009"). Same guarantees.Fechas medianas (p. ej. "Jan 15, 2009"). Las mismas garantías.
getDecimalFormat()Returns a fresh copy of the thousands-separated formatter (#,###,###,##0.00).Devuelve una copia nueva del formateador con separador de miles (#,###,###,##0.00).
⚠️
Always use getDecimalFormat() — never cache it across threadsUsa siempre getDecimalFormat() — nunca lo caches entre hilos

The underlying DecimalFormat is mutable and not thread-safe, so the field is private and getDecimalFormat() hands back an independent clone. Call it where you need it; don't share one instance between threads.El DecimalFormat subyacente es mutable y no thread-safe, por eso el campo es privado y getDecimalFormat() devuelve un clon independiente. Llámalo donde lo necesites; no compartas una instancia entre hilos.

RecommendationsRecomendaciones

Do set formatters once when wiring up the view (e.g. in the controller's initialize).Asigna los formateadores una vez al armar la vista (p. ej. en el initialize del controlador).

Combine input restriction (a formatter) with post-submit checks via Validator — the formatter stops bad keystrokes, the validator confirms the final value (e.g. range, e-mail).Combina la restricción de entrada (un formateador) con comprobaciones tras el envío vía Validator — el formateador detiene pulsaciones malas, el validador confirma el valor final (p. ej. rango, e-mail).