Foros del Web » Programación para mayores de 30 ;) » .NET »

Relleno de ceros a la izquierda

Estas en el tema de Relleno de ceros a la izquierda en el foro de .NET en Foros del Web. Hola Foreros! Estoy en una aplicación WebForm en VB.NET y me preguntaba si existía una función interna en la que enviándole dos números haga lo ...
  #1 (permalink)  
Antiguo 02/06/2005, 04:12
Avatar de Phoncadiz  
Fecha de Ingreso: mayo-2004
Ubicación: Cádiz City
Mensajes: 232
Antigüedad: 20 años
Puntos: 1
Relleno de ceros a la izquierda

Hola Foreros!

Estoy en una aplicación WebForm en VB.NET y me preguntaba si existía una función interna en la que enviándole dos números haga lo siguiente:

rellenaCeros (14,4) = 0014

Saludos!!
__________________
Tantas horas delante de una pantalla servirá para algo....
[Phoncadiz; mínimo 8 h. al día con el PC] :stress:
  #2 (permalink)  
Antiguo 02/06/2005, 04:39
 
Fecha de Ingreso: abril-2005
Mensajes: 82
Antigüedad: 19 años
Puntos: 2
No entiendo.... Que quieres que haga????
  #3 (permalink)  
Antiguo 02/06/2005, 06:49
Avatar de Phoncadiz  
Fecha de Ingreso: mayo-2004
Ubicación: Cádiz City
Mensajes: 232
Antigüedad: 20 años
Puntos: 1
Vaya, es verdad. No he puesto lo que quería que hiciera.

14 es ún número entero cualquiera
y 4 es el número de caracteres que deseo que tenga la cadena en total.^

Así que si a la función le llega un 14 (tiene 2 caracteres numéricos) por un lado y un 4 que le indica que tiene que ser una cadena con 4 número el resultado es 0014 (4 caracteres)

Tal como pongo en el título, símplemente es rellenar de ceros a la izquierda hasta llegar al número de caracteres que indique la función. Ejemplos:

(312,8) = 00000312
(9,2) = 09
(9,1) = 9
(99,1) = error

Creo que está claro.
__________________
Tantas horas delante de una pantalla servirá para algo....
[Phoncadiz; mínimo 8 h. al día con el PC] :stress:
  #4 (permalink)  
Antiguo 02/06/2005, 07:41
Avatar de Jose_minglein2  
Fecha de Ingreso: noviembre-2004
Mensajes: 2.344
Antigüedad: 19 años, 5 meses
Puntos: 8
Que yo sepa no existe, pero sería fácil implementarla
  #5 (permalink)  
Antiguo 02/06/2005, 08:04
Avatar de charlytesis  
Fecha de Ingreso: agosto-2003
Ubicación: La Paz - Bolivia
Mensajes: 207
Antigüedad: 20 años, 8 meses
Puntos: 1
Si lo haces con unos if's y manejando los ceros, puedes realizar el relleno de ceros...

num=14
relleno=4

long=len(num)

if relleno<>long then
rellenar
end if

completalo y veras que te sale...

saludos
__________________

Saludos desde el corazón de América.....BOLIVIA
Da lo mejor de ti, que siempre será recompensado


  #6 (permalink)  
Antiguo 02/06/2005, 08:07
Avatar de RootK
Moderador
 
Fecha de Ingreso: febrero-2002
Ubicación: México D.F
Mensajes: 8.004
Antigüedad: 22 años, 2 meses
Puntos: 50
Te paso un ejemplo de como te quedaría:


Cita:
Private Function GetZeros(ByVal iNum As Integer, ByVal iLimit As Integer) As String
Dim iLength As Integer = iNum.ToString.Length
Dim s As String

If iLength < iLimit Then
For i As Integer = 1 To iLimit - iLength
s += "0"
Next
s += iNum.ToString
Else
s = "Error"
End If

Return s
End Function
Y para llamarla:

Cita:
Response.Write(GetZeros(312, 9))

Salu2
__________________
Nadie roba nada ya que en la vida todo se paga . . .

Exentrit - Soluciones SharePoint & Net
  #7 (permalink)  
Antiguo 02/06/2005, 09:13
Avatar de Phoncadiz  
Fecha de Ingreso: mayo-2004
Ubicación: Cádiz City
Mensajes: 232
Antigüedad: 20 años
Puntos: 1
Muchas gracias a todos los que habeis participado.

Ya se que podía implementarla. Pero era para ahorrarme trabajo si es que existía o incluso si se podría realizar en una sola línea de código uniendo un par de funciones de las de toda la vida.

De todas formas... un millón de gracias!!!
__________________
Tantas horas delante de una pantalla servirá para algo....
[Phoncadiz; mínimo 8 h. al día con el PC] :stress:
  #8 (permalink)  
Antiguo 02/06/2005, 10:23
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
Para quien lo quiera para VC++ o una DLL para llamar y que sea rápido, he hecho una función estilo a las ANSI-C en inline ASM...

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*******************************************
* Rellena con ceros a la izquierda - MaxExtreme
*
**** Argumentos ****
* numero - Número origen al que se añadirán ceros
* destino - Puntero donde se guardará el resultado
* cifras - Cifras totales que tendrá la string destino
*
**** Devuelve ****
* ret==0	OK
* ret!=0	ERROR
******************************************/
int Rellenar(int numero, char * destino, int cifras)
{
	static char buffer[11];

	__asm
	{
		pusha

		lea edx, buffer
		push 10d
		push edx
		push numero
		call itoa
		add esp, 0Ch
		push eax
		call strlen
		pop edx

		mov ebx, destino
		mov ecx, cifras
		mov byte ptr [ebx+ecx], 0h
		sub ecx, eax
		mov edx, ecx

		cmp eax, cifras
		jg error
		je igual

ceros:		mov byte ptr [ebx+ecx-1], 30h
		loop ceros

igual:		add ebx, edx
		mov ecx, eax
		lea edx, buffer
num:		mov al, byte ptr [edx+ecx-1]
		mov byte ptr [ebx+ecx-1], al
		loop num


		popa
		mov eax, 0h
		jmp fin

error:		popa
		mov eax, 1h

fin:
	}
}



void main()
{
	// Rellenamos parte de la cadena para comprobar que se incluye el terminador \0
	char destino[100]="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

	// Rellenamos con el número 12345 con 10 cifras -> OK
	if(Rellenar(12345,destino,10)==0)	printf("%s\n",destino);
	else						printf("Error\n");

	// Rellenamos con el número 12345 con 5 cifras -> OK
	if(Rellenar(12345,destino,5)==0)	printf("%s\n",destino);
	else						printf("Error\n");

	// Rellenamos con el número 12345 con 3 cifras -> ERROR
	if(Rellenar(12345,destino,3)==0)	printf("%s\n",destino);
	else						printf("Error\n");
}
Ese ejemplo devuelve lo que se espera:
Código:
0000012345
12345
Error
No sé si se puede optimizar más, pero ahí queda como curiosidad...

** EDIT: pops sustituidos por add dado que itoa devuelve el puntero que se le pasa y por lo tanto lo tenemos en eax para hacer push a strlen sin usar edx - Eternal Idol

Última edición por MaxExtreme; 02/06/2005 a las 14:01
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 10:24.