C#: Convertir número a letras

Estoy haciendo un sistema comercial que imprime facturas.

La factura impresa debe tener el MONTO TOTAL en NUMEROS y en LETRAS

Ejemplo:

S/. 945.23 = NOVECIENTOS CUARENTA Y CINCO CON 23/100 NUEVOS SOLES (moneda en Perú)

Encontré este excelente artículo (inglés) respecto al tema:

Converting Numbers to Words de Jonathan Wood

Le hice algunos cambios menores ya que la escritura de números a letras en español es más compleja (creo yo) que en inglés.

Aquí va:

using System;
using System.Text;

namespace MYPROJECT
{
static class NumberToText
{
private static string[] _ones =
{
"cero",
"un",
"dos",
"tres",
"cuatro",
"cinco",
"seis",
"siete",
"ocho",
"nueve"
};

private static string[] _teens =
{
"diez",
"once",
"doce",
"trece",
"catorce",
"quince",
"dieciseis",
"diecisiete",
"dieciocho",
"diecinueve"
};

private static string[] _tens =
{
"",
"diez",
"veinte",
"treinta",
"cuarenta",
"cincuenta",
"sesenta",
"setenta",
"ochenta",
"noventa"
};

private static string[] _centenas =
{
"",
"ciento",
"doscientos",
"trescientos",
"cuatrocientos",
"quinientos",
"seiscientos",
"setecientos",
"ochocientos",
"novecientos"
};

private static string[] _thousands =
{
"",
"mil",
"millon",
"billon",
"trillon",
"cuatrillon"
};

/// <summary>
/// Converts a numeric value to words suitable for the portion of
/// a check that writes out the amount.
/// </summary>
/// <param name="value">Value to be converted</param>
/// <returns></returns>
public static string Convert(decimal value)
{
string digits, temp;
bool showThousands = false;
bool allZeros = true;

// Use StringBuilder to build result
StringBuilder builder = new StringBuilder();
// Convert integer portion of value to string
digits = ((long)value).ToString();
// Traverse characters in reverse order
for (int i = digits.Length - 1; i >= 0; i--)
{
int ndigit = (int)(digits[i] - '0');
int column = (digits.Length - (i + 1));

// Determine if ones, tens, or hundreds column
switch (column % 3)
{
case 0:        // Ones position
showThousands = true;
if (i == 0)
{
// First digit in number (last in loop)
temp = String.Format("{0} ", _ones[ndigit]);
}
else if (digits[i - 1] == '1')
{
// This digit is part of "teen" value
temp = String.Format("{0} ", _teens[ndigit]);
// Skip tens position
i--;
}
else if (ndigit != 0)
{
// Any non-zero digit
//if (column == 0)
//{
temp = String.Format("{0} ", _ones[ndigit]);
//}
//else
//{
//    temp = String.Format("{0} ", ndigit == 1 ? "un" : _ones[ndigit]);
//}
}
else
{
// This digit is zero. If digit in tens and hundreds
// column are also zero, don't show "thousands"
temp = String.Empty;
// Test for non-zero digit in this grouping
if (digits[i - 1] != '0' || (i > 1 && digits[i - 2] != '0'))
showThousands = true;
else
showThousands = false;
}

// Show "thousands" if non-zero in grouping
if (showThousands)
{
if (column > 0)
{
temp = String.Format("{0}{1}{2}",
temp,
_thousands[column / 3],
allZeros ? " " : ", ");
}
// Indicate non-zero digit encountered
allZeros = false;
}
builder.Insert(0, temp);
break;

case 1:        // Tens column
if (ndigit > 0)
{
temp = String.Format("{0}{1}",
_tens[ndigit],
(digits[i + 1] != '0') ? " y " : " ");
builder.Insert(0, temp);
}
break;

case 2:        // Hundreds column
if (ndigit > 0)
{
temp = String.Format("{0} ", _centenas[ndigit]);
builder.Insert(0, temp);
}
break;
}
}

// Append fractional portion/cents
builder.AppendFormat("con {0:00}/100", (value - (long)value) * 100);

// Capitalize first letter
return String.Format("{0}{1}",
Char.ToUpper(builder[0]),
builder.ToString(1, builder.Length - 1));
}
}
}

Referencias:

Convertir Número a Letras en C# – Por Gerardo
Como convertir números a letras
C# – Convertir números a letras
Converting numbers to text equivalent
Converting a number into text using C#
How to Convert Numbers into Words

One response to this post.

  1. Aquí una librería gratuita que hace todo esto y mas!!! Here is a free library that does all this and more !!!
    http://urysoft.blogspot.com.es/p/urysoftutilities.html?view=sidebar

    Responder

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: