Página 1 de 1
Primeira letra maiúscula/FOR EACH @
Enviado: 02 Abr 2020 15:13
por JoséQuintas
Código: Selecionar todos
REQUEST HB_CODEPAGE_PTISO
PROCEDURE MAIN
LOCAL cText
SET( _SET_CODEPAGE, "PTISO" )
CLS
cText := "ISTO É UMA BENÇÃO"
@ 1, 0 SAY cText
@ 2, 0 SAY CaseCapital( cText )
Inkey(0)
RETURN
FUNCTION CASECapital( cText )
LOCAL lUpper := .T., cLetter
cText := Lower( cText )
FOR EACH cLetter IN @cText
IF lUpper .AND. cLetter != Space(1)
cLetter := Upper( cLetter )
lUpper := .F.
ENDIF
IF cLetter == Space(1)
lUpper := .T.
ENDIF
NEXT
RETURN cText

- upper.png (7.94 KiB) Exibido 5102 vezes
Primeira letra maiúscula/FOR EACH @
Enviado: 02 Abr 2020 18:36
por alxsts
Olá!
Como o tempo passa!
Tópico de junho de 2009:
Converter carcteres maiusculos por minusculos
Primeira letra maiúscula/FOR EACH @
Enviado: 02 Abr 2020 20:32
por bencz
José, boas noites!!
Bati o olho e ja vi um problema em seu código!
Veja a correção ( eu tirei os acentos e etc, pois meu "uindus" é em inglês, então, o console não mostra os acentos )
Troquei a variavel de entrada do for each, para não utilizar a referencia, pois tenho apenas o xHarbour em meu computador e o xHarbour não suporta variavel por referencia no foreach
Utilize a função "IsSpace" e não "space(1)", caso a string de entrada tenha tabs, por exemplo, a função IsSpace vai identificar isso
Código: Selecionar todos
PROCEDURE MAIN
LOCAL cText
CLS
cText := "ISTO E UMA BENCAO"
@ 1, 0 SAY cText
@ 2, 0 SAY CaseCapital( cText )
Inkey(0)
RETURN
FUNCTION CASECapital( cText )
LOCAL lUpper := .T., cLetter
cText := Lower( cText )
FOR EACH cLetter IN cText
IF lUpper .AND. !IsSpace(cLetter)
cText[HB_EnumIndex()] := Upper( cLetter )
lUpper := .F.
ENDIF
IF IsSpace(cLetter)
lUpper := .T.
ENDIF
NEXT
RETURN cText
Primeira letra maiúscula/FOR EACH @
Enviado: 02 Abr 2020 22:23
por JoséQuintas
bencz escreveu:Veja a correção ( eu tirei os acentos e etc, pois meu "uindus" é em inglês, então, o console não mostra os acentos )
Não sei se funciona igual no Harbour, mas, XHarbour também tem GTWVG.
No Harbour é: hbmk2 projeto.hbp gtwvg.hbc
Sem alterar mais nada.
De console passa a ser uma janela do Windows, e aí fica liberada a codepage do Harbour.
Pensando bem, poderia ser o Empty() ao invés de comparar com espaço.
No aplicativo nem lembro se tenho isso, criei hoje pra um usuário de um fórum, minigui ou algo parecido.
E pra aproveitar e mostrar o uso da referência no for/each.
Primeira letra maiúscula/FOR EACH @
Enviado: 02 Abr 2020 22:35
por JoséQuintas
E não é que meu aplicativo tem.
Mas esta falha se tiver mais de um espaço em branco.
Código: Selecionar todos
FUNCTION UpperLower( mTexto )
LOCAL mTexto2 := "", mMaiuscula := .T., nCont, mLetra
FOR nCont = 1 TO Len( mTexto )
mLetra := Substr( mTexto, nCont, 1 )
DO CASE
CASE mLetra == " "
mTexto2 += mLetra
mMaiuscula := .T.
CASE mMaiuscula
mTexto2 += Upper( mLetra )
mMaiuscula := .F.
OTHERWISE
mTexto2 += Lower( mLetra )
ENDCASE
NEXT
RETURN mTexto2
Provavelmente dá pra fazer melhor com o hb_RegEx(), mas ainda não faço idéia como usar isso.
Primeira letra maiúscula/FOR EACH @
Enviado: 29 Jan 2022 17:12
por clodoaldomonteiro
Pra contribuir com o trabalho de vcs e aproveitando o que vcs colocaram aqui.
Vi a necessidade de deixar algumas palavras em minúsculo mesmo, como, "e, de, do, da".
Segua a função:
Código: Selecionar todos
FUNCTION CaseCapital( cTexto )
LOCAL x, mRetorno := '', aTexto, mExclusoes := "ao,e,de,do,da", mPalavra, mMask
cTexto := Lower(cTexto)
aTexto := HB_ATokens(cTexto, ' ')
FOR x = 1 TO Len( aTexto )
mPalavra := AllTrim(aTexto[x])
If Len(mPalavra) > 0
If mPalavra $ mExclusoes
mRetorno += mPalavra + ' '
Else
mMask := '!' + Replicate('A', Len(mPalavra)-1)
mRetorno += Transform( mPalavra, mMask) + ' '
Endif
Endif
NEXT
RETURN mRetorno
Primeira letra maiúscula/FOR EACH @
Enviado: 29 Jan 2022 20:47
por alxsts
Olá!
Se você olhar a rotina que postei em 2009 (link acima), verá que este tratamento existe nela.