abreviar nomes
Moderador: Moderadores
-
kakamachado
- Usuário Nível 1

- Mensagens: 30
- Registrado em: 07 Mar 2016 18:54
- Localização: Rio de Janeiro
abreviar nomes
Bom dia colegas, alguém tem um rotina ou função que abrevie nomes próprios (pessoas), por exemplo, de 60 para 30 caracteres? Deve manter o primeiro e o último nome sem abreviar.
Obrigado
Obrigado
abreviar nomes
Boa noite
Seria isso?
Seria isso?
Código: Selecionar todos
FUNCTION AbreviarNome( cNomeCompleto )
LOCAL cAbreviacao
LOCAL aNome, cNome
aNome := HB_ATokens( Alltrim( cNomeCompleto ), " " )
cAbreviacao := ""
FOR EACH cNome IN aNome
IF Empty( cNome )
LOOP
ENDIF
IF HB_EnumIndex( cNome ) == 1 .OR. HB_EnumIndex( cNome ) == Len( aNome ) .OR. Len( cNome ) <= 3
cAbreviacao += " " + cNome
ELSE
cAbreviacao += " " + Left( cNome, 1 ) + "."
ENDIF
NEXT
RETURN cAbreviacao
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
abreviar nomes
Olá!
Aparentemente o código postado atenderá a solicitação.
Há muito tempo precisei desenvolver uma rotina destas mas não tenho o fonte, pois ficou no cliente. A única observação que faço é a seguinte: quando o último sobrenome for "Junior","Jr","Jr.","Filho","Neto","Sobrinho","Sobr.","Netto", etc, o penúltimo sobrenome não poderá ser abreviado.
Aparentemente o código postado atenderá a solicitação.
Há muito tempo precisei desenvolver uma rotina destas mas não tenho o fonte, pois ficou no cliente. A única observação que faço é a seguinte: quando o último sobrenome for "Junior","Jr","Jr.","Filho","Neto","Sobrinho","Sobr.","Netto", etc, o penúltimo sobrenome não poderá ser abreviado.
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
abreviar nomes
Ótima Observação Alexandre... vlw
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:
“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”.
Até 2017 Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL
Novos Projetos:
Desktop Visual Windev Desktop
Celular Android/iOS Windev Mobile
WEB Windev Web
Sejamos gratos a Deus.
“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”.
Até 2017 Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL
Novos Projetos:
Desktop Visual Windev Desktop
Celular Android/iOS Windev Mobile
WEB Windev Web
Sejamos gratos a Deus.
abreviar nomes
Realmente não tinha pensado nesta hipótese, obrigado
William Manesco
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
Harbour 3.x | Fivewin | BCC | MySQL (TDolphin) | HBQT | HBIDE | Atom
-
kakamachado
- Usuário Nível 1

- Mensagens: 30
- Registrado em: 07 Mar 2016 18:54
- Localização: Rio de Janeiro
abreviar nomes
Boa tarde Wmanesco, Fladimir e Alxsts, obrigado pelas colaborações. Fiz uma alteração na função, pois me expressei mal na demanda. Precisava que os nomes fossem abreviados somente se o nome completo ultrapassasse 30 caracteres e mantendo o primeiro e o último sem abreviar. Ex: JOAO CARLOS DA SILVA PEREIRA CONSTANTINO (40 CARACTERES) ficaria JOAO CARLOS DA S P CONSTANTINO (30 CARACTERES) não precisando abreviar o CARLOS. Valeu galera.
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
abreviar nomes
Olá!
A verdade é que 30 caracteres para armazenar nomes de pessoas é pouco espaço. Mesmo abreviando, é possível que ultrapasse este limite. O que fazer? Truncar? Creio que não seja a melhor solução...
A verdade é que 30 caracteres para armazenar nomes de pessoas é pouco espaço. Mesmo abreviando, é possível que ultrapasse este limite. O que fazer? Truncar? Creio que não seja a melhor solução...
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
abreviar nomes
Achei interessante o desafio.
Código: Selecionar todos
PROCEDURE Main
LOCAL nCont, cNome := "JOSE MARIA CUNHA HARBOUR PROGRAMMER OF QUINTAS"
FOR nCont = 10 TO 70 STEP 5
? AbreviarNome( cNome, nCont )
NEXT
RETURN
FUNCTION AbreviarNome( cNaoAbreviado, nTamanho )
LOCAL aNomeLst, cAbreviado := "", oElement, nCont, nQtNaoAbreviado, nTentativas := 0, lTiraInutil := .T., nLimit
hb_Default( @nTamanho, Len( cNaoAbreviado ) )
aNomeLst := hb_RegExSplit( " ", cNaoAbreviado )
IF Len( aNomeLst ) > 2
DO WHILE .T.
cAbreviado := ""
nQtNaoAbreviado := 0
FOR EACH oElement IN aNomeLst
cAbreviado += oElement + " "
nQtNaoAbreviado += iif( Len( oElement ) < 4, 0, 1 )
NEXT
DO CASE
CASE Len( cAbreviado ) <= nTamanho
CASE nQtNaoAbreviado < 3
CASE lTiraInutil
FOR EACH oElement IN aNomeLst
IF oElement == "OF" .OR. oElement == "DE" .OR. oElement == "DO" .OR. oElement == "DA" .OR. oElement == "DAS" .OR. oElement == "DOS"
aDel( aNomeLst, oElement:__EnumIndex )
aSize( aNomeLst, Len( aNomeLst ) - 1 )
ENDIF
NEXT
lTiraInutil := .F.
LOOP
CASE nTentativas > 20
OTHERWISE
nLimit := Len( aNomeLst ) - iif( aNomeLst[ Len( aNomeLst ) ] $ "JUNIOR,JR,FILHO,NETO", 2, 1 )
IF nLimit > 2
FOR nCont = nLimit TO 2 STEP -1
IF Len( aNomeLst[ nCont ] ) > 2
aNomeLst[ nCont ] := Left( aNomeLst[ nCont ], 1 ) + "."
EXIT
ENDIF
NEXT
ENDIF
nTentativas += 1
LOOP
ENDCASE
EXIT
ENDDO
ENDIF
cAbreviado := Pad( cAbreviado, nTamanho )
RETURN cAbreviado
Código: Selecionar todos
JOSE M. C.
JOSE M. C. H. P
JOSE M. C. H. P. QUI
JOSE M. C. H. P. QUINTAS
JOSE MARIA C. H. P. QUINTAS
JOSE MARIA CUNHA H. P. QUINTAS
JOSE MARIA CUNHA HARBOUR P. QUINTAS
JOSE MARIA CUNHA HARBOUR PROGRAMMER QUINTAS
JOSE MARIA CUNHA HARBOUR PROGRAMMER OF QUINTAS
JOSE MARIA CUNHA HARBOUR PROGRAMMER OF QUINTAS
JOSE MARIA CUNHA HARBOUR PROGRAMMER OF QUINTAS
JOSE MARIA CUNHA HARBOUR PROGRAMMER OF QUINTAS
JOSE MARIA CUNHA HARBOUR PROGRAMMER OF QUINTAS
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
abreviar nomes
Compliquei um pouco mais: abrevia do centro pras bordas.
Peguei só um pedaço do nome de D.Pedro pra testar
Nota: a cada nome abreviado, testa pra ver se já resolveu, pra não abreviar demais
Peguei só um pedaço do nome de D.Pedro pra testar
Código: Selecionar todos
PROCEDURE Main
LOCAL nCont, cNome := "PEDRO DE ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER DE PAULA MIGUEL RAFAEL JOAQUIM"
FOR nCont = 100 TO 10 STEP -5
? AbreviarNome( cNome, nCont )
NEXT
RETURN
FUNCTION AbreviarNome( cNaoAbreviado, nTamanho )
LOCAL aNomeLst, cAbreviado := "", oElement, nCont, nQtNaoAbreviado, nTentativas := 0, lTiraInutil := .T., anNao, nMeio
hb_Default( @nTamanho, Len( cNaoAbreviado ) )
aNomeLst := hb_RegExSplit( " ", cNaoAbreviado )
IF Len( aNomeLst ) > 2
DO WHILE .T.
cAbreviado := ""
nQtNaoAbreviado := 0
FOR EACH oElement IN aNomeLst
cAbreviado += oElement + " "
nQtNaoAbreviado += iif( Len( oElement ) < 4, 0, 1 )
NEXT
DO CASE
CASE Len( cAbreviado ) <= nTamanho
CASE nQtNaoAbreviado < 3
CASE lTiraInutil
FOR EACH oElement IN aNomeLst
IF oElement == "E" .OR. oElement == "DE" .OR. oElement == "DO" .OR. oElement == "DA" .OR. oElement == "DAS" .OR. oElement == "DOS"
aDel( aNomeLst, oElement:__EnumIndex )
aSize( aNomeLst, Len( aNomeLst ) - 1 )
ENDIF
NEXT
lTiraInutil := .F.
LOOP
CASE nTentativas > 50
OTHERWISE
anNao := { 1, Len( aNomeLst ), iif( aNomeLst[ Len( aNomeLst ) ] $ "JUNIOR,JR,FILHO,NETO,SOBRINHO", Len( aNomeLst ) - 1, 1 ) }
nMeio := Round( Len( aNomeLst ) / 2, 0 )
IF Len( aNomeLst[ nMeio ] ) > 3 .AND. AScan( anNao, nMeio ) == 0
aNomeLst[ nMeio ] := Left( aNomeLst[ nMeio ], 1 ) + "."
LOOP
ENDIF
FOR nCont = 1 TO nMeio
DO CASE
CASE nMeio + nCont < Len( aNomeLst ) .AND. Len( aNomeLst[ nMeio + nCont ] ) > 3 .AND. AScan( anNao, nMeio + nCont ) == 0
aNomeLst[ nMeio + nCont ] := Left( aNomeLst[ nMeio + nCont ], 1 ) + "."
EXIT
CASE nMeio - nCont > 1 .AND. Len( aNomeLst[ nMeio - nCont ] ) > 3 .AND. AScan( anNao, nMeio - nCont ) == 0
aNomeLst[ nMeio - nCont ] := Left( aNomeLst[ nMeio - nCont ], 1 ) + "."
EXIT
ENDCASE
NEXT
nTentativas += 1
LOOP
ENDCASE
EXIT
ENDDO
ENDIF
cAbreviado := Pad( cAbreviado, nTamanho )
RETURN cAbreviado
Código: Selecionar todos
PEDRO DE ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER DE PAULA MIGUEL RAFAEL JOAQUIM
PEDRO DE ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER DE PAULA MIGUEL RAFAEL JOAQUIM
PEDRO DE ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER DE PAULA MIGUEL RAFAEL JOAQUIM
PEDRO ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER PAULA MIGUEL RAFAEL JOAQUIM
PEDRO ALCANTARA FRANCISCO ANTONIO JOAO C. XAVIER PAULA MIGUEL RAFAEL JOAQUIM
PEDRO ALCANTARA FRANCISCO ANTONIO JOAO C. X. PAULA MIGUEL RAFAEL JOAQUIM
PEDRO ALCANTARA FRANCISCO ANTONIO J. C. X. P. MIGUEL RAFAEL JOAQUIM
PEDRO ALCANTARA FRANCISCO A. J. C. X. P. MIGUEL RAFAEL JOAQUIM
PEDRO ALCANTARA FRANCISCO A. J. C. X. P. M. RAFAEL JOAQUIM
PEDRO ALCANTARA F. A. J. C. X. P. M. RAFAEL JOAQUIM
PEDRO ALCANTARA F. A. J. C. X. P. M. R. JOAQUIM
PEDRO A. F. A. J. C. X. P. M. R. JOAQUIM
PEDRO A. F. A. J. C. X. P. M. R. JOAQUIM
PEDRO A. F. A. J. C. X. P. M. R. JO
PEDRO A. F. A. J. C. X. P. M.
PEDRO A. F. A. J. C. X. P
PEDRO A. F. A. J. C.
PEDRO A. F. A.
PEDRO A. F
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
abreviar nomes
E se o final for FILHO, permanece primeiro e dois últimos, enquanto der.... rs
Código: Selecionar todos
PEDRO DE ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER DE PAULA MIGUEL RAFAEL JOAQUIM FILHO
PEDRO DE ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER DE PAULA MIGUEL RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA FRANCISCO ANTONIO JOAO CARLOS XAVIER PAULA MIGUEL RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA FRANCISCO ANTONIO JOAO C. XAVIER PAULA MIGUEL RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA FRANCISCO ANTONIO JOAO C. X. PAULA MIGUEL RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA FRANCISCO ANTONIO J. C. X. P. MIGUEL RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA FRANCISCO A. J. C. X. P. MIGUEL RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA FRANCISCO A. J. C. X. P. M. RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA F. A. J. C. X. P. M. RAFAEL JOAQUIM FILHO
PEDRO ALCANTARA F. A. J. C. X. P. M. R. JOAQUIM FILHO
PEDRO A. F. A. J. C. X. P. M. R. JOAQUIM FILHO
PEDRO A. F. A. J. C. X. P. M. R. JOAQUIM FILH
PEDRO A. F. A. J. C. X. P. M. R. JOAQUIM
PEDRO A. F. A. J. C. X. P. M. R. JO
PEDRO A. F. A. J. C. X. P. M.
PEDRO A. F. A. J. C. X. P
PEDRO A. F. A. J. C.
PEDRO A. F. A.
PEDRO A. F
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
