escribir en letras valores a pagar

18/07/2006 - 21:35 por Marco Elgueta | Informe spam
Hola a todos!
Estoy trabajando con VB.Net 2003 en la cual me realizo una liquidacion
mensual en donde me arroja un valor total pero quiero pasar ese valor
numerico a su valor en palabra, o sea :

Total a pagar: 200.203 >> son: Doscientos mil doscientos tres pesos.

Gracias de ante mano

Preguntas similare

Leer las respuestas

#1 Matias
19/07/2006 - 00:29 | Informe spam
Fijate este articulo:
http://www.elguille.info/colabora/N...aletra.htm

espero q te sirva.


"Marco Elgueta" escribió en el
mensaje news:
Hola a todos!
Estoy trabajando con VB.Net 2003 en la cual me realizo una liquidacion
mensual en donde me arroja un valor total pero quiero pasar ese valor
numerico a su valor en palabra, o sea :

Total a pagar: 200.203 >> son: Doscientos mil doscientos tres pesos.

Gracias de ante mano

Respuesta Responder a este mensaje
#2 Luis Miguel Blanco
19/07/2006 - 09:17 | Informe spam
Hola Marco

El código que te pongo a continuación pertenece a un control de usuario que
precisamente realiza la operación que pides. Este control consta de dos
TextBox: en uno tecleamos el valor numérico que dinámicamente se va mostrando
como letras en el otro.

Si en tu caso no necesitas emplear un control para resolver el problema,
puedes extraer de este código sólo la parte encargada de transformar el
número a letras.

'/////////////////////////////////////////
' declaración de enumeraciones
Public Enum GeneroEnum
Masculino
Femenino
End Enum

Public Enum FormatoLetrasEnum
Mayusculas
Minusculas
PrimeraLetra
End Enum

Public Class NumLetras
Inherits System.Windows.Forms.UserControl

#Region " Código generado por el Diseñador de Windows Forms "

Public Sub New()
MyBase.New()

'El Diseñador de Windows Forms requiere esta llamada.
InitializeComponent()

'Agregar cualquier inicialización después de la llamada a
InitializeComponent()

End Sub

'UserControl1 reemplaza a Dispose para limpiar la lista de componentes.
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub

'Requerido por el Diseñador de Windows Forms
Private components As System.ComponentModel.IContainer

'NOTA: el Diseñador de Windows Forms requiere el siguiente procedimiento
'Puede modificarse utilizando el Diseñador de Windows Forms.
'No lo modifique con el editor de código.
Friend WithEvents txtNumero As System.Windows.Forms.TextBox
Friend WithEvents txtLetras As System.Windows.Forms.TextBox
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
Me.txtNumero = New System.Windows.Forms.TextBox()
Me.txtLetras = New System.Windows.Forms.TextBox()
Me.SuspendLayout()
'
'txtNumero
'
Me.txtNumero.Anchor = ((System.Windows.Forms.AnchorStyles.Top Or
System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right)
Me.txtNumero.Location = New System.Drawing.Point(4, 5)
Me.txtNumero.Name = "txtNumero"
Me.txtNumero.Size = New System.Drawing.Size(160, 20)
Me.txtNumero.TabIndex = 0
Me.txtNumero.Text = ""
'
'txtLetras
'
Me.txtLetras.Anchor = ((System.Windows.Forms.AnchorStyles.Bottom Or
System.Windows.Forms.AnchorStyles.Left) _
Or System.Windows.Forms.AnchorStyles.Right)
Me.txtLetras.Location = New System.Drawing.Point(4, 29)
Me.txtLetras.Multiline = True
Me.txtLetras.Name = "txtLetras"
Me.txtLetras.Size = New System.Drawing.Size(160, 67)
Me.txtLetras.TabIndex = 1
Me.txtLetras.Text = ""
'
'NumLetras
'
Me.Controls.AddRange(New System.Windows.Forms.Control()
{Me.txtLetras, Me.txtNumero})
Me.Name = "NumLetras"
Me.Size = New System.Drawing.Size(168, 104)
Me.ResumeLayout(False)

End Sub

#End Region


' evento
Public Event NumLetrasCambiado As System.EventHandler
Public Event NumNoValido As System.EventHandler

' variables a nivel de clase
Private maGrupos() As String = New String(4) {}
Private mcUnidad As String
Private mcDecena As String
Private mcCentena As String
Private mnGrupoActual As Integer

' variables de propiedad
Private _formatoNumero As String
Private _formatoLetras As FormatoLetrasEnum
Private _letrasConFormato As String
Private _numeroConFormato As String
Private _letras As String
Private _numero As String
Private _pluralMoneda As String
Private _moneda As String
Private _genero As GeneroEnum

' Propiedades
Protected Property Letras() As String
Get
Return _letras
End Get
Set(ByVal Value As String)
_letras = Value
End Set
End Property

Protected Property Numero() As String
Get
Return _numero
End Get
Set(ByVal Value As String)
If Not IsNumeric(Value) Then
RaiseEvent NumNoValido(Me, New System.EventArgs())
Else
_numero = Value
End If
End Set
End Property

Public Property GeneroMoneda() As GeneroEnum
Get
Return _genero
End Get
Set(ByVal Value As GeneroEnum)
_genero = Value
End Set
End Property

Public Property PluralMoneda() As String
Get
Return _pluralMoneda
End Get
Set(ByVal Value As String)
_pluralMoneda = Value
End Set
End Property

Public Property Moneda() As String
Get
Return _moneda
End Get
Set(ByVal Value As String)
_moneda = Value
End Set
End Property

Public Property FormatoNumero() As String
Get
Return _formatoNumero
End Get
Set(ByVal Value As String)
_formatoNumero = Value
End Set
End Property

Public Property FormatoLetras() As FormatoLetrasEnum
Get
Return _formatoLetras
End Get
Set(ByVal Value As FormatoLetrasEnum)
_formatoLetras = Value
End Set
End Property

Public Function LetrasConFormato() As String
Return _letrasConFormato
End Function

Public Function NumeroConFormato() As String
Return _numeroConFormato
End Function

' métodos
Private Sub txtNumero_TextChanged(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles txtNumero.TextChanged
' cada vez que se introduzca un número
' en el control, se convierte a letra
Dim lnIndice As Integer
txtLetras.Text = ""
Me.Letras = ""

' formar una cadena de 15 dígitos utilizando el número,
' rellenando con ceros a la izquierda
Me.Numero = New String("0", 15 - txtNumero.Text.Length) +
txtNumero.Text

' si el control tiene valor,
' convertir a letra
If (txtNumero.Text.Length > 0) Then
' separar el número en 5 grupos
' de 3 dígitos; cada grupo corresponderá
' a una centena, decena y unidad
' del número; introducir en un
' array los grupos de dígitos;
' se comienzan a coger grupos
' desde la izquierda del número
' rellenando igualmente el array
' desde el último elemento hasta
' el primero
For lnIndice = 0 To 4
mnGrupoActual = lnIndice
maGrupos(4 - mnGrupoActual) =
Me.Numero.Substring((mnGrupoActual) * 3, 3)
Next

' recorrer el array desde el final
lnIndice = 4
While (lnIndice >= 0)
' extraer cada uno de los dígitos
' del elemento actual del array
mnGrupoActual = lnIndice
mcCentena = maGrupos(mnGrupoActual).Substring(0, 1)
mcDecena = maGrupos(mnGrupoActual).Substring(1, 1)
mcUnidad =
maGrupos(mnGrupoActual).Substring(maGrupos(mnGrupoActual).Length - 1, 1)

' componer la parte correspondiente
' del número en letra
ComponerCentena()
ComponerDecena()
ComponerUnidad()
ComponerConector()
lnIndice -= 1
End While
End If

' formatear la cadena con el
' número en letra
Me.Letras = Me.Letras.Trim()
AplicarFormato()

' mostrar el número en letra
' en el control
txtLetras.Text = Me.Letras

' lanzar el evento para que pueda ser
' tomado por el formulario que lo use
RaiseEvent NumLetrasCambiado(Me, Nothing)
End Sub

Private Sub ComponerCentena()
' convertir a letra la centena
' del grupo numérico actual

' comprobar qué número es el
' que está situado en la centena
' y convertir a su equivalente
' en letra
Select Case mcCentena
Case "1"
If (mcDecena + mcUnidad = "00") Then
Me.Letras += "cien "

Else
Me.Letras += "ciento "
End If
Case "2"
Me.Letras += "doscient"
Case "3"
Me.Letras += "trescient"
Case "4"
Me.Letras += "cuatrocient"
Case "5"
Letras += "quinient"
Case "6"
Me.Letras += "seiscient"
Case "7"
Me.Letras += "setecient"
Case "8"
Me.Letras += "ochocient"
Case "9"
Me.Letras += "novecient"
End Select

If (Convert.ToInt16(mcCentena) > 1) Then
' si el grupo numérico que se
' está procesando es menor de 3,
' aplicar el género al número en letra
If (mnGrupoActual < 2) Then
If (Me.GeneroMoneda = GeneroEnum.Masculino) Then
Me.Letras += "os "
Else
Me.Letras += "as "
End If

Else
' si el grupo numérico actual
' es igual o superior a 3, no
' aplicar género
Me.Letras += "os "
End If
End If
End Sub

Private Sub ComponerDecena()
' convertir a letra la decena
' del grupo numérico actual

' comprobar qué número es el
' que está situado en la decena
' y convertir a su equivalente
' en letra
Select Case mcDecena
Case "1"
' cuando la decena es 1, requiere
' una conversión especial
Select Case (mcUnidad)
Case "0"
Me.Letras += "diez "
Case "1"
Me.Letras += "once "
Case "2"
Me.Letras += "doce "
Case "3"
Me.Letras += "trece "
Case "4"
Me.Letras += "catorce "
Case "5"
Me.Letras += "quince "
Case "6"
Me.Letras += "dieciseis "
Case "7"
Me.Letras += "diecisiete "
Case "8"
Me.Letras += "dieciocho "
Case "9"
Me.Letras += "diecinueve "
End Select

Case "2"
' cuando la decena es 2,
' tener en cuenta si junto a
' la unidad forman en número 20
If (mcUnidad = "0") Then
Me.Letras += "veinte "
Else
Me.Letras += "veinti"
End If
' el resto de conversiones es normal
Case "3"
Me.Letras += "treinta "
Case "4"
Me.Letras += "cuarenta "
Case "5"
Me.Letras += "cincuenta "
Case "6"
Me.Letras += "sesenta "
Case "7"
Me.Letras += "setenta "
Case "8"
Me.Letras += "ochenta "
Case "9"
Me.Letras += "noventa "
End Select

' comprobar si podemos poner
' el conector para la decena
If ((mcUnidad <> "0") And (Convert.ToInt16(mcDecena) > 2)) Then
Me.Letras += "y "
End If
End Sub

Private Sub ComponerUnidad()
' convertir a letra la unidad
' del grupo numérico actual

' comprobar qué número es el
' que está situado en la unidad
' y convertir a su equivalente
' en letra
Select Case mcUnidad
Case "0"
If (Convert.ToDouble(Me.Numero) = 0 And mnGrupoActual <> 0)
Then
Me.Letras = "cero"
End If
Case "1"
' si el número es 1 y la decena es
' distinta de 1...
If (mcDecena <> "1") Then
' según el grupo numérico actual
' se aplica el correspondiente género
' y/o espacio separador entre palabras
Select Case (mnGrupoActual)
Case 0
If (Me.GeneroMoneda = GeneroEnum.Masculino) Then
Me.Letras += "un"
Else
Me.Letras += "una"
End If
Case 1
If (Convert.ToInt16(mcDecena) > 1) Then
'If (Convert.ToInt16(mcDecena) > 2) Then
' Me.Letras += " "
'End If
If (Me.GeneroMoneda = GeneroEnum.Masculino)
Then
Me.Letras += "un"
Else
Me.Letras += "una"
End If
End If
Case 2
Me.Letras += "un"
Case 3
If (Convert.ToInt16(mcDecena) > 1) Then
If (Convert.ToInt16(mcDecena) > 2) Then
Me.Letras += " "
End If
Me.Letras += "un"
End If
Case 4
Me.Letras += "un"
End Select
End If
' para el resto de casos,
' conversión normal
Case "2"
If (mcDecena <> "1") Then
Me.Letras += "dos "
End If
Case "3"
If (mcDecena <> "1") Then
Me.Letras += "tres "
End If
Case "4"
If (mcDecena <> "1") Then
Me.Letras += "cuatro "
End If
Case "5"
If (mcDecena <> "1") Then
Me.Letras += "cinco "
End If
Case "6"
If (mcDecena <> "1") Then
Me.Letras += "seis "
End If
Case "7"
If (mcDecena <> "1") Then
Me.Letras += "siete "
End If
Case "8"
If (mcDecena <> "1") Then
Me.Letras += "ocho "
End If
Case "9"
If (mcDecena <> "1") Then
Me.Letras += "nueve "
End If
End Select
End Sub

Private Sub ComponerConector()
' incluir en la cadena con el número
' en letra, las descripciones correspondientes
' a billones, millones, miles, etc.

' si el número en letras no
' contiene un espacio a la derecha,
' incluirlo ahora
If (Me.Letras.Length <> 0) Then
If (Me.Letras.Substring(Me.Letras.Length - 1, 1) <> " ") Then
Me.Letras += " "
End If
End If

' si el grupo actual es un número válido...
If (maGrupos(mnGrupoActual) <> "000") Then
'procesar el número, poniendo la descripción
' del grupo numérico y la moneda si corresponde
Select Case mnGrupoActual
Case 4
If (maGrupos(mnGrupoActual) = "001") Then
Me.Letras += "billón "
Else
Me.Letras += "billones "
End If
Case 3
Me.Letras += "mil "
Case 2
If (maGrupos(mnGrupoActual) = "001") Then
Me.Letras += "millón "
Else
Me.Letras += "millones "
End If
Case 1
Me.Letras += "mil "
Case 0
If (Convert.ToDouble(Me.Numero) > 1) Then
Me.Letras += Me.Moneda + Me.PluralMoneda
Else
Me.Letras += Me.Moneda
End If
End Select
End If
End Sub

Private Sub AplicarFormato()
' convertir las propiedades que contienen el número
' y el número en letra, a los correspondientes valores
' formateados, asignándolos a las propiedades que
' contienen los valores con formato
Me._numeroConFormato =
Convert.ToInt64(Me.Numero).ToString(Me.FormatoNumero)
Select Case (Me.FormatoLetras)
Case FormatoLetrasEnum.Mayusculas
Me._letrasConFormato = Me.Letras.ToUpper()
Case FormatoLetrasEnum.Minusculas
Me._letrasConFormato = Me.Letras.ToLower()
Case Else
Me._letrasConFormato = StrConv(Me.Letras,
VbStrConv.ProperCase)
End Select
End Sub

End Class
'/////////////////////////////////////////

Espero que te sea de utilidad.
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"Marco Elgueta" wrote:

Hola a todos!
Estoy trabajando con VB.Net 2003 en la cual me realizo una liquidacion
mensual en donde me arroja un valor total pero quiero pasar ese valor
numerico a su valor en palabra, o sea :

Total a pagar: 200.203 >> son: Doscientos mil doscientos tres pesos.

Gracias de ante mano

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida