FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
||||
|
||||
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; |
#3
|
|||
|
|||
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. |
#4
|
||||
|
||||
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'; Código:
S := 'Mi perro es muy grande'; FillChar(S[1], 5, '0'); // Ahora S = '00000rro es muy grande'; // Saludos |
#5
|
|||
|
|||
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. |
#6
|
||||
|
||||
algo así como
Código:
n := InputBox('Código:', 'Código', ''); try n := Format('%0.6d', [StrToInt(n)]); except on EConvertError do VosSabrasQueHacerConElError; end;
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#7
|
|||
|
|||
Perfecto! muchas gracias por tu ayuda.
1 Saludo desde Alicante (spain) |
#8
|
||||
|
||||
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 |
#9
|
||||
|
||||
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 |
#10
|
||||
|
||||
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; (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... |
#11
|
||||
|
||||
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' |
#12
|
||||
|
||||
Cita:
Gracias Nuria // Saludos |
#13
|
||||
|
||||
Cita:
Cita:
|
#14
|
|||
|
|||
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' Saludos |
#15
|
||||
|
||||
¡Buen día a todos!
Cita:
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 . |
|
|
|