Convertir Números a Letras en Java

Clase Java con método estático NumeroALetras.convertir(). Pega el archivo en tu proyecto y compila. Compatible con Java 8+. Sin dependencias externas.

Función completa

Copia este código en un archivo llamado NumeroALetras.java:

public class NumeroALetras {

    private static final String[] UNIDADES = {
        "", "uno", "dos", "tres", "cuatro", "cinco", "seis", "siete",
        "ocho", "nueve", "diez", "once", "doce", "trece", "catorce",
        "quince", "dieciséis", "diecisiete", "dieciocho", "diecinueve"
    };

    private static final String[] DECENAS = {
        "", "", "veinte", "treinta", "cuarenta", "cincuenta", "sesenta",
        "setenta", "ochenta", "noventa"
    };

    private static final String[] CENTENAS = {
        "", "ciento", "doscientos", "trescientos", "cuatrocientos",
        "quinientos", "seiscientos", "setecientos", "ochocientos",
        "novecientos"
    };

    public static String convertir(double numero) {
        long parteEntera = (long) numero;
        long parteDecimal = Math.round((numero - parteEntera) * 100);
        String resultado = convertirEntero(parteEntera);
        if (parteDecimal > 0) {
            resultado += " con " + parteDecimal + "/100";
        }
        return resultado;
    }

    private static String convertirEntero(long n) {
        if (n == 0) return "cero";
        if (n < 0) return "menos " + convertirEntero(-n);
        if (n == 100) return "cien";

        StringBuilder resultado = new StringBuilder();

        if (n >= 1_000_000) {
            long millones = n / 1_000_000;
            resultado.append(millones == 1
                ? "un millón "
                : convertirEntero(millones) + " millones ");
            n %= 1_000_000;
        }
        if (n >= 1_000) {
            long miles = n / 1_000;
            resultado.append(miles == 1
                ? "mil "
                : convertirEntero(miles) + " mil ");
            n %= 1_000;
        }
        if (n >= 100) {
            resultado.append(CENTENAS[(int) (n / 100)]).append(" ");
            n %= 100;
        }
        if (n >= 20) {
            if (n % 10 == 0) {
                resultado.append(DECENAS[(int) (n / 10)]);
            } else {
                resultado.append(DECENAS[(int) (n / 10)])
                         .append(" y ")
                         .append(UNIDADES[(int) (n % 10)]);
            }
        } else if (n > 0) {
            resultado.append(UNIDADES[(int) n]);
        }

        return resultado.toString().trim();
    }
}

Cómo usar

public class EjemploNumeroALetras {
    public static void main(String[] args) {
        System.out.println(NumeroALetras.convertir(0));           // cero
        System.out.println(NumeroALetras.convertir(15));          // quince
        System.out.println(NumeroALetras.convertir(100));         // cien
        System.out.println(NumeroALetras.convertir(150));         // ciento cincuenta
        System.out.println(NumeroALetras.convertir(1500));        // mil quinientos
        System.out.println(NumeroALetras.convertir(10000));       // diez mil
        System.out.println(NumeroALetras.convertir(100000));      // cien mil
        System.out.println(NumeroALetras.convertir(1000000));     // un millón
        System.out.println(NumeroALetras.convertir(2500000));     // dos millones quinientos mil
        System.out.println(NumeroALetras.convertir(15250.75));    // quince mil doscientos cincuenta con 75/100
        System.out.println(NumeroALetras.convertir(-500));        // menos quinientos
    }
}

Ejemplo en Spring Boot:

// En un servicio de facturación con Spring Boot
@Service
public class FacturaService {

    public String generarTextoFactura(double total) {
        String totalLetras = NumeroALetras.convertir(total);
        return "Son: " + totalLetras + " PESOS M.N.";
    }
}

Casos de prueba

Ejecuta estos casos para verificar que funciona (JUnit 5 o main()):

import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

class NumeroALetrasTest {

    @Test void testCero() { assertEquals("cero", NumeroALetras.convertir(0)); }
    @Test void testUnidades() { assertEquals("cinco", NumeroALetras.convertir(5)); }
    @Test void testEspeciales() { assertEquals("quince", NumeroALetras.convertir(15)); }
    @Test void testDecenas() { assertEquals("treinta", NumeroALetras.convertir(30)); }
    @Test void testDecenasConY() { assertEquals("treinta y cinco", NumeroALetras.convertir(35)); }
    @Test void testCien() { assertEquals("cien", NumeroALetras.convertir(100)); }
    @Test void testCentenas() { assertEquals("quinientos", NumeroALetras.convertir(500)); }
    @Test void testMil() { assertEquals("mil", NumeroALetras.convertir(1000)); }
    @Test void testMilQuinientos() { assertEquals("mil quinientos", NumeroALetras.convertir(1500)); }
    @Test void testDiezMil() { assertEquals("diez mil", NumeroALetras.convertir(10000)); }
    @Test void testCienMil() { assertEquals("cien mil", NumeroALetras.convertir(100000)); }
    @Test void testMillon() { assertEquals("un millón", NumeroALetras.convertir(1000000)); }
    @Test void testDecimales() { assertEquals("mil quinientos con 50/100", NumeroALetras.convertir(1500.50)); }
    @Test void testNegativo() { assertEquals("menos quinientos", NumeroALetras.convertir(-500)); }
}

Decimales

Decimales a fracción sobre cien: NumeroALetras.convertir(15250.75) → «quince mil doscientos cincuenta con 75/100». Para más precisión:

// Para 3 decimales
long parteDecimal = Math.round((numero - parteEntera) * 1000);
if (parteDecimal > 0) {
    resultado += " con " + parteDecimal + "/1000";
}

// Para 4 decimales
long parteDecimal = Math.round((numero - parteEntera) * 10000);
if (parteDecimal > 0) {
    resultado += " con " + parteDecimal + "/10000";
}

Pesos mexicanos

Agrega «PESOS M.N.» al resultado:

public static String convertirMXN(double numero) {
    return convertir(numero) + " PESOS M.N.";
}

// Uso
System.out.println(NumeroALetras.convertirMXN(1500));      // mil quinientos PESOS M.N.
System.out.println(NumeroALetras.convertirMXN(15250.75));  // quince mil doscientos cincuenta con 75/100 PESOS M.N.
System.out.println(NumeroALetras.convertirMXN(1000000));   // un millón PESOS M.N.

Requisitos y compatibilidad

Java puro, compatible con Java 8, 11, 17, 21+. Sin dependencias externas. Funciona en NetBeans, Eclipse e IntelliJ IDEA. No necesitas modificar pom.xml ni build.gradle.

Herramienta Online

Convierte números a letras directamente en tu navegador.

Más Lenguajes

Código en Python, JavaScript, PHP y VBA para Excel.

Versión Python

La misma lógica en Python, ideal para scripts y datos.