Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Convertir un cadena donde cada Palabra Primera con mayuscula (https://www.clubdelphi.com/foros/showthread.php?t=56071)

shoulder 06-05-2008 21:51:44

Convertir un cadena donde cada Palabra Primera con mayuscula
 
Una pregunta cual es la funcion en delphi donde de una cadena de dos o tres palabras me convierta la primera letra de cada palabra en mayuscula y luego la palabra en minuscula como la funcion strconv de access.

Gracias

roman 06-05-2008 22:14:06

No recuerdo haber visto una función así en delphi. Prueba a ver si ésta da el ancho:

Código Delphi [-]
function Capitalize(S: String): String;
var
  I: Integer;
  InBetween: Boolean;

begin
  Result := '';
  InBetween := true;

  for I := 1 to Length(S) do
    if S[i] = ' ' then
    begin
      Result := Result + S[i];
      InBetween := true;
    end
    else if InBetween then
    begin
      Result := Result + UpCase(S[i]);
      InBetween := false;
    end
    else
      Result := Result + LowerCase(S[i]);
end;

// Saludos

jhonny 06-05-2008 22:28:10

Yo tampoco recuerdo una función que haga eso y también propongo una función, para el caso:

Código Delphi [-]
 
function Capitalize(S: String): String;
var
  ListaVar: TStringList;
  Cadena  : String;
  i:  Integer;
begin
  ListaVar      :=  TStringList.Create;
  Result     :=  '';
  try
    ExtractStrings([' '],[' '], PCHAR(S), ListaVar);
    for I := 0 to ListaVar.Count - 1 do
    begin
      Cadena      :=  ListaVar[i];
      Cadena      :=  LowerCase(Cadena);
      Cadena[1]   :=  UpCase(Cadena[1]);
      Result   :=  Result + Cadena  + ' ';
    end;
    SetLength(Result, Length(Result)-1);
  finally
    ListaVar.Free;
  end;
end;

cHackAll 06-05-2008 23:41:02

Estas subastas de código son fantásticas, yo pongo el mío;

Código Delphi [-]
function Capitalize(Str: string): string;
var Index: Cardinal;
begin
 for Index := 1 to Length(Str) do
  if (Index = 1) or (Str[Index - 1] = ' ') then
   if Str[Index] in ['a'..'z'] then
    Dec(Str[Index], 32) else // verdad que parecería que sobra ese "else" ?
  else
   if Str[Index] in ['A'..'Z'] then
    Inc(Str[Index], 32);
 Result := Str;
end;

jhonny 07-05-2008 00:06:54

Bueno, lo que me parece curioso es que aunque no es difícil de incluir, ninguna de las tres funciones tienen en cuenta los caracteres especiales, tales como la Ñ o las mayúsculas con tildes :D.

cHackAll 07-05-2008 00:18:52

Cierto (SP), la corrijo:

Código Delphi [-]
function Capitalize(Str: string): string;
var Index: Cardinal;
begin
 for Index := 1 to Length(Str) do
  if (Index = 1) or (Str[Index - 1] = ' ') then
   if Str[Index] in ['a'..'z','á','é','í','ó','ú','ñ'] then
    Dec(Str[Index], 32) else
  else
   if Str[Index] in ['A'..'Z','Á','É','Í','Ó','Ú','Ñ'] then
    Inc(Str[Index], 32);
 Result := Str;
end;

Saludos :)

shoulder 07-05-2008 00:58:59

Genios
 
La verdad deben patentar la funciòn, anda perfecta, estuve horas buscando en internet una funcion interna como tiene access que es la strconv y no existe y sirve muchisimo para los nombres y apellidos.

Un gran abrazo a los genios virtuales.

Delphius 07-05-2008 01:01:16

Este reto me gustó. Propongo una nueva variante:

Código Delphi [-]
function TForm1.Capitalize(Text: string): string;
var Aux, Capital: string;
begin
  Capital := AnsiUpperCase(Text[1]);
  Aux := AnsiLowerCase(Text);
  Aux[1] := Capital[1];
  result := Aux;
end;

function TForm1.CapitalizeAll(Text: string): string;
var i: integer;
    CopyText: string;
    CapitalizeText: string;
begin
 for i := 1 to Length(Text) do
   begin
     if (Text[i] <> ' ') or (i = Length(Text))
        then CopyText := CopyText + Text[i]
        else begin
               CapitalizeText := CapitalizeText + ' ' + Capitalize(CopyText);
               CopyText := '';
             end;
   end;
 result := CapitalizeText + ' ' + Capitalize(Copytext);
end;

En teoría debería funcionar con cualquier caracter que se venga...

Saludos,

roman 07-05-2008 07:45:52

Cita:

Empezado por cHackAll
// verdad que parecería que sobra ese "else" ?

¡Vaya! ¡Qué interesante! Aunque parece que sólo a mi me sorprende.

Yo siempre había pensado que pascal tenía un defecto de sintaxis al no permitir

Código Delphi [-]
if X then
  if Y then
    A;
else
  B;

que tendría que ser válido puesto que el else corresponde al primer if. Por lo general recurría a

Código Delphi [-]
if X then
begin
  if Y then
    A;
end
else
  B;

Ahora veo que también lo puedes resolver con

Código Delphi [-]
if X then
  if Y then
    A
  else
else
  B;

Siempre se aprende algo nuevo :)

// Saludos

Lepe 07-05-2008 10:29:54

idem roman.

Delfino 07-05-2008 10:36:19

Propongo la función mas económica y rentable para capitalizar la primera letra de una palabra,

IVA incluido y descuento :D
O se queda satisfecho o le devolvemos su dinero :D
Si encuentra mas barato le abonamos la diferencia :D
Código Delphi [-]
cadena :=  StuffString(Texto,1,1,UpperCase(LeftStr(Texto,1)))

jhonny 07-05-2008 15:13:02

Cita:

Empezado por Delfino (Mensaje 284790)
Propongo la función mas económica y rentable para capitalizar la primera letra de una palabra,

IVA incluido y descuento :D
O se queda satisfecho o le devolvemos su dinero :D
Si encuentra mas barato le abonamos la diferencia :D

Código Delphi [-]cadena := StuffString(Texto,1,1,UpperCase(LeftStr(Texto,1)))

Bueno, pero solo es para capitalizar la primera letra de una palabra, cosa que también se hace así:

UpCase(Cadena[1]);

La cosa es que se requiere, que sea mayúscula la primera letra de cada palabra de toda la frase, pero que además se conviertan en minúsculas las demás.

Cita:

Empezado por roman
¡Vaya! ¡Qué interesante! Aunque parece que sólo a mi me sorprende.

Pues a mi también, de hecho me gusto la optimización en si :).

roman 07-05-2008 16:47:19

Yo doy mi voto por la de cHackAll. Había pensado entrarle por ahí, pero desistí porque desconocía yo algo fundamental que hace válida esa solución (y que no es el lo del else) :o

Pero como nadie lo comenta, supongo que para todos es muy claro así que ahí lo dejo.

:)

// Saludos

cascarrabias 07-05-2008 19:07:18

Cita:

Empezado por roman (Mensaje 284895)

Pero como nadie lo comenta, supongo que para todos es muy claro así que ahí lo dejo.

:)

// Saludos


Pues de hecho para mi tambien fue algo nuevo y sorprendente eso del else... me pasaba igual que a ti....yo ponia un begin y un end para manejar estas situaciones......Saludos Roman

fidel 08-05-2008 18:59:26

Algo así también me venía funcionando, pero con algún resultado no demasiado correcto.

Código Delphi [-]
//coger apellidos y pasar a minúsculas con mayúscula inicial
sAape := 'SIGÜENZA NÚÑEZ PUÇOL' 
sApellidos := '';
sEspacio := 'Si';
For i := 1 to Length(sAape) do
  begin
    if sEspacio = 'Si' then
      sApellidos := sApellidos + AnsiUpperCase(copy(sAape, i, 1))
    else
      sApellidos := sApellidos + AnsiLowerCase(copy(sAape, i, 1));
    if copy(sAape, i, 1) = ' ' then
      sEspacio := 'Si'
    else
      sEspacio := 'No';
  end;

MARTÍNEZ-MENDOZA GIL ..... Martínez-mendoza Gil (Martínez-Mendoza Gil)
HURTADO DE MENDOZA DE LA CUADRA .... Hurtado De Mendoza De La Cuadra (Hurtado de Mendoza de la Cuadra)

Delphius 08-05-2008 19:22:25

Hola fidel,
Asi a vista rápida el código que tienes solo hará mayúsculas en caso de que haya un espacio.
Si tu deseas que controlase el tema de guiones y los "de", "la" y otros más habrá que buscarle un algoritmo un poquito más complicado, pero se puede.

Por el momento puedo decirte que el algoritmo que tienes puede mejorarse un poco:

Código Delphi [-]
HayEspacio := True;
For i := 1 to Length(sAape) do
  begin
    if HayEspacio 
       then sApellidos := sApellidos + AnsiUpperCase(copy(sAape, i, 1))
       else sApellidos := sApellidos + AnsiLowerCase(copy(sAape, i, 1));
    HayEspacio := Copy(sAape, i, 1) = ' ';
  end;

Saludos,

egostar 08-05-2008 19:36:27

Cita:

Empezado por roman (Mensaje 284895)
Pero como nadie lo comenta, supongo que para todos es muy claro así que ahí lo dejo.

Yo aún sigo anonadado con eso, no tengo NPI que es lo que hace, aunque se que nuestro buen amigo [cHackAll] tiene por ahi mas cosas debajo de la manga, solo que nos las da de poquito a poquito :D

Salud OS

roman 08-05-2008 19:55:06

¿De qué no tienes NPI? Su código lo que hace es:
  1. Recorre la cadena caracter a caracter
  2. Si el caracter actual es una letra minúscula y el anterior un espacio en blanco (principio de palabra), lo convierte a mayúscula.
  3. Si el caracter actual es una letra mayúscula y el anterior no es un espacio en blanco (mitad de palabra), lo convierte a minúscula,

La conversión minúscula<->mayúscula se basa en que unas y otras están separadas por 32 caracteres.

Lo que yo no sabía, es que esto último -la separación por 32 caracteres- era válido también para caracteres acentuados y ñ. Yo creía que el tipo de datos Char seguía el orden de los caracteres ASCII.

// Saludos

maeyanes 08-05-2008 19:57:15

Cita:

Empezado por egostar (Mensaje 285315)
Yo aún sigo anonadado con eso, no tengo NPI que es lo que hace, aunque se que nuestro buen amigo [cHackAll] tiene por ahi mas cosas debajo de la manga, solo que nos las da de poquito a poquito :D

Salud OS

Que hace? Pues convierte de mayúsculas a minúsculas y viceversa cuando así se requiere... :D

Como lo hace? Pues sumando o restando 32 al carácter indicado por el indice actual... esto es, si le sumas 32 a la A obtendrás la a, lo mismo con los caracteres acentuados y la Ñ... :p

Y bueno, a lo mejor es muy obvio lo que acabo de poner... jejeje


Saludos...

Delphius 08-05-2008 20:11:03

Pues yo también me he llevado ese asombro roman, yo no pensaba que incrementar y decrementar 32 lugares podría servir para el caso de las Ñ y simbolos especiales...

Al no creer en el inc y dec con 32, me mandé ese código medio chapuza.

No lo quise comentar porque ya lo hicieron ustedes... pero en fin... uno no se acuesta sin haber aprendido algo nuevo.:)

A mi lo que más me impresionó fue el doble else... eso, para mi, fue el "mejor truco de magia" que he visto.

Ahora si desean, podemos aceptar el reto al que se enfrenta fidel. Ese si que va a ser interesante de resolver.
NOTA: Javier, dame un tiempo... dame una ventaja... :D

Saludos con ojos abiertos,


La franja horaria es GMT +2. Ahora son las 07:02:21.

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