Página 1 de 1

Comparação de strings

Enviado: 21 Set 2015 10:59
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

Comparação de strings

Enviado: 21 Set 2015 11:13
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

Comparação de strings

Enviado: 21 Set 2015 14:11
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.

Comparação de strings

Enviado: 21 Set 2015 14:38
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

Comparação de strings

Enviado: 21 Set 2015 20:27
por rubens
Obrigado Pessoal

Vou fazer os testes e adequações

Rubens

Comparação de strings

Enviado: 21 Set 2015 21:57
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 “?”

Comparação de strings

Enviado: 22 Set 2015 16:13
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.

Comparação de strings

Enviado: 22 Set 2015 16:39
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

Comparação de strings

Enviado: 22 Set 2015 17:06
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.

Comparação de strings

Enviado: 22 Set 2015 17:46
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.