Función para rellenar con ceros a la izquierda

4,853 views
Skip to first unread message

3rn3st0

unread,
Mar 25, 2009, 3:12:05 PM3/25/09
to Mundo Visual FoxPro
Muchas veces tenemos la necesidad de generar números enteros los
cuales deben ser "rellenados" con ceros a la izquierda, para un número
de serie, por ejemplo, para un correlativo, etc.

Aquí les dejo el código de una función que escribí hace poco. Primero
está una versión completa y comentada luego una versión mucho más
simple, minimalista diría yo.

Usen cualquiera de las dos de la misma manera. Ambas son idénticas en
su funcionamiento.

*-------------------------------------------------------------------------------
* Función : StrZero
* Autor : Ernesto L. Chapon R.
* Fecha : 2009-01-28
* Versión : 1.00.00
* Tipo : String
* Retorna : sZeros, Una cadena de caracteres rellena con ceros a la
izquierda tantas veces como indique el parámetro <iZeros>.
* Parámetros: <iNum> Número que será convertido a cadena de caracteres
y relleno con ceros a la izquierda. Obligatorio.
* <iZeros> Cantidad de ceros con los que será rellena la
cadena a ser retornada.
* Ejemplos :
* StrZero( 9, 6 ) --> "000009"
* StrZero( 34, 6 ) --> "000034"
* StrZero( 12345, 6 ) --> "012345"
* StrZero( 123456, 6 ) --> "123456"
*-------------------------------------------------------------------------------
function StrZero( iNum As Integer, iZeros As Integer ) As String
local sZeros As String

&& Validación de los parámetros
if Vartype( iNum ) <> "N" or Vartype( iZeros ) <> "N"
sZeros = ""
else
&& Determina la cantidad real de ceros a la izquierda
iZeros = iZeros - Len( Alltrim( Str( iNum ) ) )
&& Creación del valor de retorno
sZeros = Replicate( "0", iZeros ) + Alltrim( Str( iNum ) )
endif
return( sZeros )

VERSIÓN SIMPLIFICADA

function StrZero( iNum, iZeros )
return( PadL( Alltrim( Str( iNum ) ), iZeros, "0" ) )


NOTA 1: Quise hacer esta colaboración para ilustrar mejor lo que dije
en la pregunta que hiciera Gerardo sobre si un número es par o impar.
En mi último comentario explicaba los problemas que podrían acarrear
funciones muy simples donde luego la depuración se nos haría harto
difícil. Les dejo a ustedes mismos la opinión sobre cual de las dos
versiones de la función es más legible y por ende más sencilla de
depurar.
NOTA 2: Las declaraciones sobre los tipos de datos en la primera
función tanto para los parámetros como para la propia función los
escribo porque de esta manera el IntelliSense de VFP reconoce mis
funciones y me muestra las ayudas, tal y como lo hace con las
funciones internas de VFP.

Saludos a todos desde Venezuela, espero les sirva este código :-)

Intel Man

unread,
Mar 25, 2009, 6:18:20 PM3/25/09
to mundovis...@googlegroups.com
Hola, gracias por tu codigo :)

Y si queremos la funcion mas corto yo lo minimalizaria en esto :)

function StrZero( iNum, iZeros )
return PadL(iNum, iZeros,"0")

Asi es mas facil de depurar, al menos para mi :)

Saludos



> Date: Wed, 25 Mar 2009 12:12:05 -0700
> Subject: [Mundo Visual FoxPro] Función para rellenar con ceros a la izquierda
> From: ernest...@gmail.com
> To: mundovis...@googlegroups.com

Noe

unread,
Mar 26, 2009, 12:28:49 AM3/26/09
to Mundo Visual FoxPro
*Esto tambien inserta ceros al izquieda
*en este caso la longitud es de 10 caracteres

Local Vnum

Vnum=12345

ceros_izq=rightc("0000000000"+allt(str(Vnum)),10)
? ceros_izq

PATRICK PALMA

unread,
Mar 26, 2009, 10:34:40 AM3/26/09
to mundovis...@googlegroups.com
Me parece muy acertado el ultimo comentario... me parece el mejor...
 
Salu2

3rn3st0

unread,
Mar 26, 2009, 11:26:19 AM3/26/09
to Mundo Visual FoxPro
@Intel Man: ¡No sabía yo que PadL convertía automáticamente de números
a caracteres!

@Noe: Otra solución, eso me encanta de la programación. Un problema
puede tener muchas soluciones.

Gracias a ambos :-)

Marlon Cabrera

unread,
Mar 26, 2009, 10:34:09 PM3/26/09
to mundovis...@googlegroups.com
Yo prefiero esto, el parametro l indica que se mantengan los ceros a la izquierda.
 
?
TRANSFORM(123,"@rl 99999999999")
 
o que tal
 
?TRANSFORM(123,"@rl 999-999-99999")
 
?TRANSFORM(123,"@rl 999,999,999.99")
 
En fin
 
2009/3/26 3rn3st0 <ernest...@gmail.com>

Marlon Cabrera

unread,
Mar 26, 2009, 10:34:31 PM3/26/09
to mundovis...@googlegroups.com
Yo prefiero esto, el parametro l indica que se mantengan los ceros a la izquierda.
 
?
TRANSFORM(123,"@rl 99999999999")
 
o que tal
 
?TRANSFORM(123,"@rl 999-999-99999")
 
?TRANSFORM(123,"@rl 999,999,999.99")
 
En fin
 
2009/3/26 3rn3st0 <ernest...@gmail.com>

3rn3st0

unread,
Mar 27, 2009, 2:47:18 AM3/27/09
to Mundo Visual FoxPro
¿Una más? Tampoco sabía que se podía hacer eso con Transform() deberé
implementarlo. Gracias Marlon, ese aporte creo que es excelente :-)

On 26 mar, 22:34, Marlon Cabrera <cabre...@gmail.com> wrote:
>  Yo prefiero esto, el parametro l indica que se mantengan los ceros a la
> izquierda.
>
> ?TRANSFORM(123,"@rl 99999999999")
>
> o que tal
>
>  ?TRANSFORM(123,"@rl 999-999-99999")
>
>  ?TRANSFORM(123,"@rl 999,999,999.99")
>
> En fin
>
> 2009/3/26 3rn3st0 <ernestocha...@gmail.com>

masayanica

unread,
Mar 28, 2009, 8:33:02 AM3/28/09
to Mundo Visual FoxPro
Para què tantas vueltas?
Ejemplo.

Sea q1 la variable donde guardas el valor numerico
Q1 = 235.75
usa:

PADL(Q1,10,"*")

Y ya
Te Pondra ****235.75
10 caracteres nada màs, Si quieres màs o menos varia el 10
y si quieres otro caracter diferente al * , cambiarlo y suficiente.


Rodolfo Granados S.

Marlon Cabrera

unread,
Mar 28, 2009, 1:23:38 PM3/28/09
to mundovis...@googlegroups.com
Con TRANSFORM también logras lo mismo
TRANSFORM(Q1,"@R $***,****,**9.99")
 
tal vez el detalle es que transform es especializado para esto, más rápido, además que te permite combinar mascaras en forma mas limpia, que tal si no quieres comas y quieres separacios por espacios
 
TRANSFORM(Q1,"@R $*** **** **9.99")
 
Transform ademas sirve para caracteres, fechas, currency, etc.  Pueden revisar las bondades de esta función y veran que al final es más rápido que técnicas alternativas.


2009/3/28 masayanica <rodog...@gmail.com>
Reply all
Reply to author
Forward
0 new messages