N2L (Numero a Letra, cosa del español)

HMG Samples and Enhancements

Moderator: Rathinagiri

Post Reply
User avatar
nspmadero
Posts: 6
Joined: Wed Jul 30, 2008 7:45 pm

N2L (Numero a Letra, cosa del español)

Post by nspmadero »

Como bien saben, los gringos usan una connotación diferente para nombrar los números, en el español agrupamos 6 dígitos para nombrar los zillones, mientras que los gringos lo hacen cada 3 dígitos después del millón.

así que mil millones es para nosotros lo que1 billón es para los gringos.

Además de su tendencia rara de llamar los cientos en decenas
(diez cientos = 1000 y quince cientos = 1500)

Hice éste código hace muchas lunas para poder colocarlo en las facturas que imprimimos, se puede portar con relativa facilidad a excel si lo desean.

Code: Select all

#include 'minigui.ch'

Function Main( )
  MsgInfo( N2L (23367421) )
RETURN NIL

Function N2L (Numero)
  Local nMaximo
  Local aUnidad, aDecena, aCentena, aResto
  Local nUnidad, nDecena, nCentena, nResto
  Local C, R
  Local I, J

  nMaximo = 18
  aUnidad = {"UN", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE"}
  aDecena = {"DIEZ", "VEINTE", "TREINTA", "CUARENTA", "CINCUENTA","SESENTA", "SETENTA","OCHENTA","NOVENTA"}
  aCentena = {"CIENTO","DOSCIENTOS","TRESCIENTOS","CUATROCIENTOS","QUINIENTOS","SEISCIENTOS","SETECIENTOS","OCHOCIENTOS","NOVECIENTOS"}
  aResto = {"ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE"}

  // Es más fácil romper el número en pedazos de cadena.
  C = Left (Str (Numero, nMaximo, 2), nMaximo - 3)
  Numero = Val (C)
  R = ""
  If Numero = 0
    R = "CERO"
  Else
    I = 0
    Do While .T.
      J = 0
      Do While .T.
        If (J > 0) .And. (Mod (Numero, 1000) > 0)
          R = "MIL " + R
        EndIf
        nUnidad = Mod (Numero, 10)
        nDecena  = INT (Mod (Numero, 100) / 10)
        nResto = Mod (Numero, 100) - 10
        If nResto > 0 .And. nResto < 6
          R = aResto [nResto] + " " + R
        Else
          If nUnidad > 0
            R = aUnidad [nUnidad] + " " + R
          EndIf
          If nDecena > 0
            Do Case
            Case nDecena = 1 .And. nUnidad > 5
              R = "DIECI" + R
            Case nDecena = 2 .And. nUnidad > 0
              R = "VEINTI" + R
            Otherwise
              If nUnidad > 0
                R = "Y " + R
              EndIf
              R = aDecena [nDecena] + " " + R
            EndCase
          EndIf
        EndIf
        nCentena = INT (Mod (Numero, 1000) / 100)
        If nCentena > 0
          If (nCentena == 1) .And. (Mod (Numero, 100) = 0)
            R = "CIEN " + R
          Else
            R = aCentena [nCentena] + " " + R
          EndIf
        EndIf
        Numero = Int (Numero / 1000)
        If Numero > 0
          J++
          If J > 1
            Exit
          EndIf
        Else
          Exit
        EndIf
      EndDo
      If Numero > 0
        I++
        If Mod (Numero, 1000000) > 0
          R = " " + R
          If Numero > 1
            R = "ES" + R
          EndIf
          Do Case
          Case I = 1
            R = "MILLON" + R
          Case I = 2
            R = "BILLON" + R
          Case I = 3
            R = "TRILLON" + R
          OtherWise
            Exit
          EndCase
        EndIf
      Else
        Exit
      EndIf
    EndDo
  EndIf
Return R
Post Reply