Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-07-2003
mguixot mguixot is offline
Miembro
 
Registrado: may 2003
Posts: 102
Poder: 21
mguixot Va por buen camino
rellenar una cadena con 0's??????

Hola compañeros,
me gustaria saber si hay alguna funcion, que me permita tratar una cadena, y rellenar con 0's los huecos hasta una determinada longitud.

1 Saludo.
Responder Con Cita
  #2  
Antiguo 14-07-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Prueba a adaptar este ejemplo:

Código:
procedure TForm1.Button1Click(Sender: TObject);
var
I:Integer;
s:String;
begin
s:='Esto es un ejemplo';
for i:=1 to lengtH(s) do
begin
 If pos(' ',S) > 0 then
 S[Pos(' ', S)] := '0';
end;
Un Saludo.
Responder Con Cita
  #3  
Antiguo 14-07-2003
charly charly is offline
Miembro
 
Registrado: may 2003
Posts: 36
Poder: 0
charly Va por buen camino
Hola,
Yo he creado la siguiente función para mis desarrollos.

function StrFill(cadena:string;longitud:Integer;relleno,posicion:string) : string;
var cTemp:string;
n, nVeces:Integer;
begin
cTemp := cadena;
nVeces := longitud - length(cTemp);
for n := 1 to nVeces do
begin
if ((posicion = 'D') or (posicion = 'd')) then
cTemp := cTemp+relleno
else
cTemp := relleno+cTemp;
end;
Result := cTemp;
end;

Parametros :
cadena = cadena inicial a tratar
longitud = longitud final de la cadena
relleno = caracter de relleno
posicion = si (D ó d) rellena por la derecha, sino por la izquierda de la cadena pasada en CADENA.

Espero te sirva.
Un saludo.
Responder Con Cita
  #4  
Antiguo 14-07-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No sé muy bien a qué te refieres. Si quieres, por ejemplo escribir números anteponiendo ceros hasta completar un determinado númeo de caracterespuedes hacerlo con Format:
Código:
Format('%0.5d, [84]); // Escribe '00084'
Format('%0.3d, [2]); // Escribe '002'
Format('%0.7s, ['hola']); // Escribe '000hola';
O bien, si tienes una cadena S y quieres convertir a ceros los primeros dígitos puedes hacerlo con FillChar:
Código:
S := 'Mi perro es muy grande';
FillChar(S[1], 5, '0'); // Ahora S = '00000rro es muy grande';
Observa que debes poner S[1] y no simplemente S

// Saludos
Responder Con Cita
  #5  
Antiguo 15-07-2003
mguixot mguixot is offline
Miembro
 
Registrado: may 2003
Posts: 102
Poder: 21
mguixot Va por buen camino
La opcion de la funciona Format, me parece la mas apropiada, el problema que tengo, es que no se como pasarle como parametro una variable tipo 'string' en la que tengo el nº a formatear, es decir:

n:string;

// entrada por telclado
n := InputBox('Código:', 'Código', '');

n := Format('%0.6d', n);

// el problema que la funcion Format, no permite un parametro string


Sabria alguien como conseguir hacer que funcione esto?

Muchas gracias y Saludos.
Responder Con Cita
  #6  
Antiguo 15-07-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
algo así como

Código:
n := InputBox('Código:', 'Código', '');
try
  n := Format('%0.6d', [StrToInt(n)]);
except
  on EConvertError do
    VosSabrasQueHacerConElError;
end;
Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 15-07-2003
mguixot mguixot is offline
Miembro
 
Registrado: may 2003
Posts: 102
Poder: 21
mguixot Va por buen camino
Perfecto! muchas gracias por tu ayuda.

1 Saludo desde Alicante (spain)
Responder Con Cita
  #8  
Antiguo 15-07-2003
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No es necesaria la conversión ya que esa es labor de Format.
En lugar de

Format('%0.6d', [StrToInt(n)]);

simplemente se pone

Format('%0.6s', [n]);

Les recomiendo que lean la documentación de la función para saber el significado de los parámetros.

// Saludos
Responder Con Cita
  #9  
Antiguo 15-07-2003
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Al hacerlo de la forma que sugiere roman, sin embargo, podrias obtener algo así como

'00EstoNoEsUnNumero'

que dependerá de vos si es válido o no...

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #10  
Antiguo 17-07-2003
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
Al igual que charly, yo tambien he creado una función parecida... bastante parecida....

Código:
TOpcionesFormateo=(ofIzquierda,ofDerecha,ofCentrado);
Código:
function FormatearCadena(pCadena:String;
                         pLongitud:Byte;
                         pOpcion:TopcionesFormateo;
                         pCaracter:Char=#32):String;
var i, vLongCadena:Integer;
Begin
 Result:=pCadena;

 vLongCadena:=Length(pCadena);
 if vLongCadena>pLongitud then
    Result:=copy(pCadena,1,pLongitud);    
                 //Trunca la cadena si es muy larga...


 Case pOpcion of
   ofIzquierda:Begin
                  if pLongitud>vLongCadena then
                   For i:=1 to (pLongitud-vLongCadena) do
                      begin
                        Result:=Result+pCaracter;
                      end; //for
               end;
   ofDerecha:Begin
               if pLongitud>vLongCadena then
                   For i:=1 to (pLongitud-vLongCadena) do
                      begin
                        Result:=pCaracter+Result;
                      end; //for
             end;
   ofCentrado:Begin
                  if pLongitud>vLongCadena then
                   For i:=1 to (pLongitud-vLongCadena) do
                      begin
                        if i mod 2= 0 then
                           Result:=pCaracter+Result
                        else
                           Result:=Result+pCaracter;
                      end; //for
              end;
 end; //Case

end;
Creo que tener una función asi es muy util y evita estar escribiendo codigo, haciendo calculos o molestandose en recordar un algoritmo o un grupo de instrucciones. Ademas, cuando se requiere hacer esta operacion para varios valores y repetidas veces, es mejor tener un codigo que haga legible nuestra programación.

(Acepto que utilizo nombres muy largos y soy un poco complicado, pero ese es mi estilo de documentación y me gusta.)


Funcionamiento:
===========


FormatearCadena('Prueba',20, ofIzquierda,'@');
'Prueba@@@@@@@@@@@@@@';

FormatearCadena('Prueba',20, ofDerecha,'@');
'@@@@@@@@@@@@@@Prueba';

FormatearCadena('Prueba',20, ofCentrado,'@');
'@@@@@@@Prueba@@@@@@@';

Yo no le recomendaria a Charly llamar a su procedimiento StrFill, pues podria haber una función nativa de delphi que ahora o en un futuro se llame asi.


Saludos a Todos...
Responder Con Cita
  #11  
Antiguo 28-04-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 22
Nuria Va por buen camino
Hola!

Por si le interesa a alguien... Para repetir caracteres en una string está la función StringOfChar.

Ejemplo:
Código:
  texto := 'HOLA' ;
  texto := StringOfChar('@'', 10) + texto ;
  // Texto se quedaría así: '@@@@@@@@@@HOLA'
Saludos!
Responder Con Cita
  #12  
Antiguo 28-04-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Nuria
Por si le interesa a alguien... Para repetir caracteres en una string está la función StringOfChar.
¡Vaya! Siempre que creo haber visto ya todas las funciones de manejo de strings me entero de una nueva. Y mira que es una que siempre he deseado. No sé, o mi inglés es fatal o a veces Borland escoge unos nombres poco significativos.

Gracias Nuria

// Saludos
Responder Con Cita
  #13  
Antiguo 28-04-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 22
Nuria Va por buen camino
Cita:
Empezado por Roman
¡Vaya! Siempre que creo haber visto ya todas las funciones de manejo de strings me entero de una nueva. Y mira que es una que siempre he deseado. No sé, o mi inglés es fatal o a veces Borland escoge unos nombres poco significativos.
Me resistía a creer que en Delphi no hubiera una función como está, me ha costado encontrarla pero al final lo conseguí, una que es un poco cabezona.... . Ya suponía yo que a alguien más le interesaría saber de ella.

Cita:
Empezado por Roman
Gracias Nuria
De nada... a mandar.
Responder Con Cita
  #14  
Antiguo 29-04-2004
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
Hola a todos, otra posibilidad sería el uso de la función DupeString que quedaría mas o menos así:
Código:
texto := 'SALUDOS' ;
  texto :=DupeString('0', 5) + texto ;
  // Texto se quedaría así: '00000SALUDOS'
El resultado es similar a la propuesta por Nuria, pero como vemos Delphi brinda, mas de una posibilidad
Saludos
Responder Con Cita
  #15  
Antiguo 30-04-2004
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Buen día a todos!


Cita:
Empezado por gatosoft
...yo tambien he creado una función...Creo que tener una función asi es muy util y evita estar escribiendo codigo, haciendo calculos o molestandose en recordar un algoritmo o un grupo de instrucciones. Ademas, cuando se requiere hacer esta operacion para varios valores y repetidas veces, es mejor tener un codigo que haga legible nuestra programación...
Interesante tu función, Gatosoft. Y totalmente de acuerdo con lo que comentas. Mencionaste una palabra clave: legibilidad.

Veo que empleas tipos de datos enumerados y parámetros opcionales (es bueno aprovechar las bondades de Object Pascal). También observo que prefijas los nombres de parámetros con una "p". No es mi estilo, pero en rutinas largas ayuda a distinguir las referencias a parámetros recibidos. Noto en ti algo de bibliotecario .

En el mejor de los planes, me permito hacerte algunas sugerencias sobre la función FormatearCadena:

Podrías hacer de tipo Integer el parámetro pLongitud, para permitir longitudes de cadenas mayores a 255 caracteres. También, sería práctico que el parámetro pOpcion fuese opcional, con un valor predeterminado de ofDerecha, considerando que la mayoría de las ocasiones se usaría la función para alargar una cadena de su extremo final (o cualquiera de los otros dos valores, según la evaluación que hagas de esto). Y algo que quizás cueste un poquitín más de trabajo, pero que valdría la pena: que el actual parámetro pCaracter fuera más bien un parámetro de tipo String, para poder especificar un relleno no uniforme, es decir, una cadena de caracteres como relleno, que no necesariamente sea una secuencia del mismo carácter, por ejemplo un patrón ':.:.:.:.:'.

Lo que comentas de los nombres largos de funciones, puede solucionarse empleando un sistema de abreviaturas. Por ejmplo, tu servidor utiliza una regla general (con algunas útiles excepciones) de abreviatura a las primeras cuatro letras por palabra para los identificadores de programa que se forman por más de una palabra, pero si se trata del nombre de una rutina (función, procedimiento o método), utilizo las primeras cinco letras en la primera palabra, por ejemplo Function AbrirDocu...(Abrir Documento).

Finalmente, te comento algo sobre el estándar de Borland de utilizar prefijos de dos letras minúsculas para las constantes de grupo (como dsInsert, dsEdit, dsBrowse, por ejemplo): Me encanta dicho estilo, que a diferencia del de Microsoft (WM_KEYDOWN, WM_COMMAND, WM_CAP_FILE_SET_CAPTURE_FILE ¡esta cosa realmente existe!), es más legible, fácil de escribir y, siento yo, significativo, ya que al estar el prefijo en minúsculas da una sensación congruente con la impresión que uno tiene de las costantes: que son valores sencillitos (pequeños). Sólo que yo utilizo tres letras minúsculas en lugar de dos, porque al analizar las constantes de Turbo Vision, hace algunos años, y ahora la actual VCL, noté que por falta de letras Borland comenzaba a repetir prefijos en diferentes grupos de constantes. Así que preferí adoptar un estándar derivado, que empleara tres letras minúsculas en lugar de dos.

Espero esto sea de utilidad. Seguimos en contacto.

Al González .
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:11:19.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi