Primeira letra de nomes em maiúscula exceto (de, dos, do...)
Preciso converter a primeira letra de nomes para maiúscula exceto (de, dos, do, das...), como posso fazer, sabem alguma função?
Muito obrigado.
Muito obrigado.
Ibraimjr
Curtidas 0
Respostas
Fabio.hc
27/03/2004
Tente assim:
function CaixaMista (mNome: string): string; var tam,pos1,pos2 : integer ; pal : string; begin tam := Length(mNome); mNome := TrimRight(mNome) + ´ ´; mNome := AnsiUpperCase(mNome); while True do begin pos1:=POS( ´ ´ , mNome) ; if pos1 = 0 then break; pal := Copy(mNome,1,pos1) ; pos2 := pos(pal, ´ DA - DAS - DE - DO - DOS ´); If pos2 > 0 then pal :=AnsiLowerCase (pal) else pal:=Copy(pal,1,1) + AnsiLowerCase(Copy(pal,2,tam)) ; result := result + pal ; mNome := copy(mNome,pos1+1,tam) end; end;
GOSTEI 0
Ibraimjr
27/03/2004
Valeu cara muito obrigado....
GOSTEI 0
Mário Reis
27/03/2004
A tua função é fixe, mas falha em situações especiais/particulares e não é fácil resolver com o apostrofe ou por causa dele e há muitos .
Se estou bem lembrado ISA D'ELREY DE SÁ deveria dar " Isa d'Elrey de Sà e não "Isa D'elrey de Sá" D'AGUIAR O'NEIL, D'OLIVEIRA etc
Como resolver isto? alguém sabe?
Se estou bem lembrado ISA D'ELREY DE SÁ deveria dar " Isa d'Elrey de Sà e não "Isa D'elrey de Sá" D'AGUIAR O'NEIL, D'OLIVEIRA etc
Como resolver isto? alguém sabe?
GOSTEI 0
Emerson Nascimento
27/03/2004
tente assim:
function CaixaMista(mNome: string): string;
const
aPrep: array[0..5] of string = (' da ', ' de ', ' do ', ' dos ', ' das ', ' e ');
var
Tam, iPos, nOffset: integer;
begin
Tam := Length(mNome);
nOffset := 1;
mNome := AnsiLowerCase(mNome); // coloca todas em minúsculas
if Tam > 0 then
mNome[1] := AnsiUpperCase(mNome[1])[1]; // primeira letra maiúscula
// capitaliza as iniciais após os espaços
repeat
iPos := Pos(' ', mNome, nOffset);
if (iPos > 0) and (iPos < Tam) and (mNome[iPos+1] <> ' ') then
mNome[iPos+1] := AnsiUpperCase(mNome[iPos+1])[1]; // capitaliza
nOffset := iPos+1;
until iPos = 0;
// trata das iniciais quando há apóstrofo
// D'avila fica d'Avila
nOffset := 1;
repeat
iPos := Pos('''', mNome, nOffset);
if (iPos > 1) and (iPos < Tam) and (mNome[iPos] = '''') and (mNome[iPos+1] <> ' ') then
begin
mNome[iPos-1] := AnsiLowerCase(mNome[iPos-1])[1]; // minúscula
mNome[iPos+1] := AnsiUpperCase(mNome[iPos+1])[1]; // maiúscula
end;
nOffset := iPos+1;
until iPos = 0;
// substitui as preposições e/ou junções
for iPos := Low(aPrep) to High(aPrep) do
mNome := StringReplace(mNome, aPrep[iPos], aPrep[iPos], [rfReplaceAll, rfIgnoreCase]);
result := mNome;
end;GOSTEI 0