PDA

Ver la Versión Completa : rellenar una cadena con 0's??????


mguixot
14-07-2003, 15:35:37
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:


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:

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:

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


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


TOpcionesFormateo=(ofIzquierda,ofDerecha,ofCentrado);



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:

texto := 'HOLA' ;
texto := StringOfChar('@'', 10) + texto ;
// Texto se quedaría así: '@@@@@@@@@@HOLA'


Saludos! ;)

roman
28-04-2004, 16:49:07
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
¡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.

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í: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!


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