# Como criar um campo de moeda

> Campo com formatação monetária automática, casas decimais e leitura do valor numérico.

Source: https://crossfly.dev/pt/docs/cookbook/forms/mascara-moeda — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Como criar um campo de moeda

**Propósito.** Criar um campo que formata valores monetários da direita para a esquerda (o usuário digita `12345` e vê `123,45`), com agrupamento de milhar e casas decimais conforme o locale, e recuperar o valor como número decimal para cálculo.

## APIs usadas
- `campo.setMode(EditMode.CURRENCY, true)` — liga o modo moeda com `maskedEdit`. Deriva automaticamente: `validChars = "0123456789.+-"`, `textAlignment = END` (alinhado à direita), `keyboard = CALCULATOR` e, se não houver máscara, `mask = TextField.getDefaultCurrencyMask(decimalPlaces)`.
- `campo.<TextFieldStyle>getStyle().decimalPlaces(2)` — número de casas decimais (padrão `2`). Defina **antes** de `setMode`, pois a máscara padrão é montada a partir dele.
- `TextField.getDefaultCurrencyMask(int decimalPlaces)` — gera a máscara padrão usando `LocaleFormats.thousandsSeparator` e `LocaleFormats.decimalSeparator` (ex.: `999.999.999,99` em pt-BR).
- `TextField.getText()` — valor formatado para exibir (`"1.234,56"`).
- `TextField.getTextWithoutMask()` — valor com ponto decimal, pronto para `Double.parseDouble` (`"1234.56"`). Respeita o sinal negativo.

> Sinal negativo: em modo moeda com máscara, digitar `-` ou `+` alterna o sinal sem inserir caractere (`handleCharInput`). O negativo aparece em `getTextWithoutMask()` como prefixo `-`.

> Separadores vêm do locale via `LocaleFormats` (preenchido na inicialização). Não fixe `,`/`.` no código — use `getDefaultCurrencyMask` ou `setMode(CURRENCY, true)` para respeitar a região.

## Exemplo completo (copiar, colar e rodar)
```java
package com.exemplo;

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

/** Tela principal executável. Aponte o launcher (classname) e rode: 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); // defina antes de setMode
      valor.setMode(EditMode.CURRENCY, true);            // moeda + máscara + teclado calculadora
      valor.setText("1234.56");                          // exibe "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);
   }
}
```

> O trecho abaixo mostra **só o miolo**. Para rodar, coloque-o no esqueleto `MainWindow` acima.

## Trecho mínimo
```java
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); // defina antes de setMode
valor.setMode(EditMode.CURRENCY, true);            // moeda + máscara + teclado calculadora

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

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

Para uma máscara customizada (ex.: 3 casas decimais explícitas):
```java
valor.<TextFieldStyle>getStyle()
   .mask(TextField.getDefaultCurrencyMask(3)); // depois setMode(CURRENCY, true)
```

## Aprofunde-se
- [Máscaras e teclados](/docs/ui/forms-and-input/masks-and-keyboards) · [Campos de texto](/docs/ui/forms-and-input/text-fields)
- Receitas irmãs: [Máscara de CPF/CEP/data](/docs/cookbook/forms/mascara-cpf) · [Teclado numérico](/docs/cookbook/forms/teclado-numerico)
- Fonte canônica: Capítulo 14 — Widgets básicos · [Enums (UIConstants)](/docs/reference/enums-uiconstants)
