Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   rellenar una cadena con 0's?????? (https://www.clubdelphi.com/foros/showthread.php?t=2212)

mguixot 14-07-2003 15:35:37

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.

marcoszorrilla 14-07-2003 16:22:28

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.

charly 14-07-2003 16:23:14

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.

roman 14-07-2003 16:23:50

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

mguixot 15-07-2003 10:52:27

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.

jachguate 15-07-2003 11:07:40

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.

;)

mguixot 15-07-2003 11:18:55

Perfecto! muchas gracias por tu ayuda.

1 Saludo desde Alicante (spain)

roman 15-07-2003 17:08:37

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

jachguate 15-07-2003 18:38:35

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.

;)

gatosoft 17-07-2003 17:07:30

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...

Nuria 28-04-2004 13:52:36

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! ;)

roman 28-04-2004 16:49:07

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

Nuria 28-04-2004 17:42:49

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.... :D . Ya suponía yo :rolleyes: que a alguien más le interesaría saber de ella.

Cita:

Empezado por Roman
Gracias Nuria

De nada... a mandar. :p

Ruben_Cu 29-04-2004 04:26:45

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 :D
Saludos

Al González 30-04-2004 07:12:12

¡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 :eek: ¡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 :).


La franja horaria es GMT +2. Ahora son las 04:48:36.

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