Saltar al contenido
CrossFly es 100% open sourceSíguenos en GitHub
CrossFlyCrossFly
Empezar

Esta página fue traducida automáticamente del portugués y puede contener errores. La versión en portugués es la canónica.

Cómo crear un campo de moneda

Propósito. Crear un campo que formatea valores monetarios de derecha a izquierda (el usuario escribe 12345 y ve 123,45), con agrupación de miles y decimales según el locale, y recuperar el valor como número decimal para el cálculo.

APIs usadas

  • campo.setMode(EditMode.CURRENCY, true) — activa el modo moneda con maskedEdit. Deriva automáticamente: validChars = "0123456789.+-", textAlignment = END (alineado a la derecha), keyboard = CALCULATOR y, si no hay máscara, mask = TextField.getDefaultCurrencyMask(decimalPlaces).
  • campo.<TextFieldStyle>getStyle().decimalPlaces(2) — número de decimales (por defecto 2). Define antes de setMode, ya que la máscara por defecto se construye a partir de él.
  • TextField.getDefaultCurrencyMask(int decimalPlaces) — genera la máscara por defecto usando LocaleFormats.thousandsSeparator y LocaleFormats.decimalSeparator (ej.: 999.999.999,99 en pt-BR).
  • TextField.getText() — valor formateado para mostrar ("1.234,56").
  • TextField.getTextWithoutMask() — valor con punto decimal, listo para Double.parseDouble ("1234.56"). Respeta el signo negativo.

Signo negativo: en modo moneda con máscara, escribir - o + alterna el signo sin insertar carácter (handleCharInput). El negativo aparece en getTextWithoutMask() como prefijo -.

Los separadores vienen del locale vía LocaleFormats (rellenado en la inicialización). No fijes ,/. en el código — usa getDefaultCurrencyMask o setMode(CURRENCY, true) para respetar la región.

Ejemplo completo (copiar, pegar y ejecutar)

package com.exemplo;

import dev.crossfly.ui.*;
import dev.crossfly.ui.layout.*;
import dev.crossfly.ui.style.*;   // TextFieldStyle (config en el estilo)

/** Pantalla principal ejecutable. Apunta el launcher (classname) y corre: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
   @Override
   public void onShow() throws Exception
   {
      super.onShow();
      setLayout(new VerticalLayout());

      TextField valor = new TextField("");
      valor.caption("Valor");
      valor.<TextFieldStyle>getStyle().decimalPlaces(2); // define antes de setMode
      valor.setMode(EditMode.CURRENCY, true);            // moneda + máscara + teclado calculadora
      valor.setText("1234.56");                          // muestra "1.234,56" (pt-BR)

      Label resultado = new Label("");

      Button somar = new Button("Somar 10");
      somar.onAction(o ->
      {
         double v = Double.parseDouble(valor.getTextWithoutMask()); // 1234.56
         double total = v + 10;
         resultado.setText("Total: " + total);
      });

      add(LAY_FILL, valor);
      add(LAY_AUTO, somar);
      add(LAY_FILL, resultado);
   }
}

El fragmento de abajo muestra solo el núcleo. Para ejecutarlo, colócalo en el esqueleto MainWindow de arriba.

Fragmento mínimo

import dev.crossfly.ui.*;
import dev.crossfly.ui.style.*;
import static dev.crossfly.ui.UIConstants.EditMode;

TextField valor = new TextField("");
valor.caption("Valor");
valor.<TextFieldStyle>getStyle().decimalPlaces(2); // define antes de setMode
valor.setMode(EditMode.CURRENCY, true);            // moneda + máscara + teclado calculadora

// valor inicial:
valor.setText("1234.56"); // muestra "1.234,56" (pt-BR)

Button somar = new Button("Somar");
somar.onAction(o ->
{
   double v = Double.parseDouble(valor.getTextWithoutMask()); // 1234.56
   // ... cálculo
});

Para una máscara personalizada (ej.: 3 decimales explícitos):

valor.<TextFieldStyle>getStyle()
   .mask(TextField.getDefaultCurrencyMask(3)); // después setMode(CURRENCY, true)

Profundiza

¿Te resultó útil esta página?