Comparação de strings

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Comparação de strings

Mensagem por rubens »

Olá... Bom dia...

Tenho uma variável Nivel.
Nivel = '9'

Se faço a comparação
Nivel >= '10'
Retorna .t.

Se faço a comparação
Nivel >= '90'
Retorna .f.

Porque ?

Obrigado
Rubens
"Eu e minha casa servimos ao Senhor e você ???"
paiva_dbdc
Usuário Nível 3
Usuário Nível 3
Mensagens: 342
Registrado em: 12 Nov 2012 09:58
Localização: uberlandia mg

Comparação de strings

Mensagem por paiva_dbdc »

Boa


o problema que nivel = 1 posicao

ja apanhei muito (rs)

agora so uso == ai ele compara


noseu caso como tem > e = aqho que vai ter que converter para numerico

val(pnivel)

Paiva
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Comparação de strings

Mensagem por Itamar M. Lins Jr. »

Ola!
Comparação de strings usamos (=, ==,)Igual, exatamente igual e (<>, !=, #,) todos esses são sinais usados para diferente ou "NOT EQUAL"
O sinal < (maior) e >(menor) usamos p/ campos numéricos.

Diferença de = e ==:
"ABC" = "ABC " Resulta .T. (True)
"ABC" == "ABC " Resulta .F. (False) o detalhe são os espaços em branco que uma tem e a outra não tem.


Saudações,
Itamar M. Lins J.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Comparação de strings

Mensagem por Jairo Maia »

Olá pessoal,

No caso de comparação com string numérica, o número de casas precisa ser igual. Nesse caso, como nivel tem 1 caractere, ao comparar com os demais checa somente o primeiro dígito, e indiferente do estado de SET EXACT. Se ao invés de 1 digito alterar a variável nivel para '09' funciona. Veja neste exemplo:

Código: Selecionar todos

Function Main()
 Local nivel, lexact:=Set( _SET_EXACT, .T. )

 Clear Screen
 
 nivel := '9'
 ?
 ? 'nivel:', nivel, ' - comparacao por 1 digito (da erro)'
 ?
 ? [nivel >= '10':], nivel >= '10'  // retorna .T.
 ? [nivel <= '10':], nivel <= '10'  // retorna .F.
 
 nivel := '09'
 ?
 ? 'nivel:', nivel, 'comparacao por 2 digitos (da certo)'
 ?
 ? [nivel >= '10':], nivel >= '10'  // retorna .F.
 ? [nivel <= '10':], nivel <= '10'  // retorna .T. 
 
 ?
 ? ['A' >= 'B':], 'A' >= 'B'        // retorna .F.
 ?
 ? ['A' <= 'B':], 'A' <= 'B'        // retorna .T.
 ?
 
 Set( _SET_EXACT, lexact )
  
 Return
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
rubens
Colaborador
Colaborador
Mensagens: 1520
Registrado em: 16 Ago 2003 09:05
Localização: Nova Xavantina - MT

Comparação de strings

Mensagem por rubens »

Obrigado Pessoal

Vou fazer os testes e adequações

Rubens
"Eu e minha casa servimos ao Senhor e você ???"
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Comparação de strings

Mensagem por Eolo »

Complementando:
"ABC" = "ABC" Resulta .T. (True)
"ABC" == "ABC " Resulta .F. (False) o detalhe são os espaços em branco que uma tem e a outra não tem.
= compara conteúdo
== compara conteúdo e tamanho (espaços em branco ou outros caracteres)

“ABC”=”ABCD “ -> .t.
“ABC”==”ABCD” -> .f.
“ABC”==”ABC ” -> .f.
No caso de comparação com string numérica...
Pode ser alfa-numérica.
O sinal < (maior) e >(menor) usamos p/ campos numéricos.
Também pra datas e strings.

ctod(“01/01/2015”)< ctod(“31/01/2015”) -> .t.
“ABC”<”ABD” -> .t.
“abc@”>”abc?” -> .t., porque o chr do “@” é maior que o chr do “?”
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Comparação de strings

Mensagem por Itamar M. Lins Jr. »

Ola!
Pois é, essa de comparar as strings com > e < eu não tenho o hábito de usar.
"A" é maior que "B" significa que o código na tabela ASCII do A é 65 e B é 66 por isso A é menor que B.

Podemos confundir achando que o conteúdo de A é maior que B ou vice-versa. Tipo A:=10, B:=1
Não sei se é um boa prática isso.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Comparação de strings

Mensagem por Kapiaba »

Sr. Jairo, assim me parece bem:

Código: Selecionar todos

Function Main()

 Local nivel, lexact:=Set( _SET_EXACT, .T. )

 nivel := '9'

 ? 'nivel:', nivel, ' - comparacao por 1 digito (nao da erro)'

 ? [nivel >= '10':], VAL(nivel) >= VAL('10') // retorna .F.
 ? [nivel <= '10':], VAL(nivel) <= VAL('10') // retorna .T.
 
 nivel := '09'

 ? 'nivel:', nivel, 'comparacao por 2 digitos (da certo)'

 ? [nivel >= '10':], VAL(nivel) >= VAL('10') // retorna .F.
 ? [nivel <= '10':], VAL(nivel) <= VAL('10') // retorna .T.
 

 ? ['A' >= 'B':], ASC('A') >= ASC('B')    // retorna .F.

 ? ['A' <= 'B':], ASC('A') <= ASC('B')    // retorna .T.


 Set( _SET_EXACT, lexact )
 
Return Nil
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Comparação de strings

Mensagem por Jairo Maia »

Olá Kapiaba,

Sem dúvida. Porém, a dúvida do autor do tópico era comparar variáveis strings, e não variáveis numéricas, e perguntou: Porque?.

Me ative apenas ao objeto do tópico.

---------------------------------------------
Editado:

Olá Itamar,

Na tabela ASCII temos que:

"A" = 65 e "B" = 66.

Porém, a rigor, em código binário a comparação é:

"A" = 01000001 e "a" = 01100001
"B" = 01000010 e "b" = 01100010

Então: "A" é menor que "a" e "B" é menor que "b".

Quando se trata de conteúdo de variáveis, a questão é outra.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Eolo
Colaborador
Colaborador
Mensagens: 1134
Registrado em: 08 Dez 2005 18:24
Localização: São Paulo - SP

Comparação de strings

Mensagem por Eolo »

Podemos confundir achando que o conteúdo de A é maior que B ou vice-versa. Tipo A:=10, B:=1
Não sei se é um boa prática isso.
Concordo.

Usar variáveis de nome “A” ou “B”, como no seu exemplo, e aplicá-las em alguma comparação, é mesmo temerário.

Já usando variáveis que identifiquem mais claramente o conteúdo, tipo Final:=10 e Inicial:=1, o risco é muito menor.

Aliás, Inicial:=”01” e Final:=”10”, de conteúdo alfanumérico e sempre de mesmo tamanho, já que o tópico fala de comparação de strings.

Mas enfim, como eu disse antes, ”>” e “<” não se aplicam somente a números, mas também a strings e datas. No caso destas últimas, cabe também a recomendação de se usar por exemplo os nomes “dInicial e dFinal”, ao invés de B e A, respectivamente, pra não gerar confusão.
Responder