Cadeia de caracteres
Moderador: Moderadores
-
MATEUS_S
- Usuário Nível 1

- Mensagens: 2
- Registrado em: 07 Fev 2008 11:26
- Localização: TRES PONTAS - MG
Cadeia de caracteres
Bom dia pessoal !
Como posso pesquisar uma cadeia de caracteres como por exemplo:
Tenho uma cadeia -> adbade 7.543,50fadsfasd
como extraio 7.543,50 sendo que a posição da mesma é indefinida.
Depois de extraido posso apenas aplicar:
VValor = 7.543,50
VValor = Val(VValor)
ou tenho que tirar a virgula e o ponto para depois converter para número?
Desde já agradeço a colaboração de vocês q fazem parte do melhor forum sobre programação clipper da NET.
Como posso pesquisar uma cadeia de caracteres como por exemplo:
Tenho uma cadeia -> adbade 7.543,50fadsfasd
como extraio 7.543,50 sendo que a posição da mesma é indefinida.
Depois de extraido posso apenas aplicar:
VValor = 7.543,50
VValor = Val(VValor)
ou tenho que tirar a virgula e o ponto para depois converter para número?
Desde já agradeço a colaboração de vocês q fazem parte do melhor forum sobre programação clipper da NET.
Prezado Colega
Use a função AT()
TEXTO="adbade 7.543,50fadsfasd"
PROCURA="7.543,50"
EXTRAI=SUBSTR(TEXTO,AT(PROCURA,TEXTO),LEN(PROCURA))
@ 10,00 SAY EXTRAI
Resultado : 7.543,50
Acima como se extrai a cadeia
SEMPONTO=STRTRAN(EXTRAI,".")
@ 10,00 SAY SEMPONTO
Resulado : 7543,50
Acima como se retira o ponto da cadeia
TROCAPONTO=STRTRAN(SEMPONTO,",",".")
@ 10,00 SAY TROCAPONTO
Resultado : 7543.50
Acima como se troca a virgula por um ponto
Numa sequencia de programação seria mais ou menos :
Os exemplos a seguir dao uma idéia geral de como AT() funciona:
? AT("a", "abcde") // Resulta: 1
? AT("bcd", "abcde") // Resulta: 2
? AT("a", "bcde") // Resulta: 0
Este exemplo divide uma cadeia de caracteres com base na
posiçao de uma vírgula dentro da cadeia de caracteres destino:
cTarget = "Langtree, Lilly"
? SUBSTR(cTarget, 1, AT(",", cTarget) - 1) // Resulta: Langtree
? SUBSTR(cTarget, AT(",", cTarget) + 2) // Resulta: Lilly
Até logo.
Marcelo
Use a função AT()
TEXTO="adbade 7.543,50fadsfasd"
PROCURA="7.543,50"
EXTRAI=SUBSTR(TEXTO,AT(PROCURA,TEXTO),LEN(PROCURA))
@ 10,00 SAY EXTRAI
Resultado : 7.543,50
Acima como se extrai a cadeia
SEMPONTO=STRTRAN(EXTRAI,".")
@ 10,00 SAY SEMPONTO
Resulado : 7543,50
Acima como se retira o ponto da cadeia
TROCAPONTO=STRTRAN(SEMPONTO,",",".")
@ 10,00 SAY TROCAPONTO
Resultado : 7543.50
Acima como se troca a virgula por um ponto
Numa sequencia de programação seria mais ou menos :
Código: Selecionar todos
TEXTO="adbade 7.543,50fadsfasd"
PROCURA="7.543,50"
EXTRAI=SUBSTR(TEXTO,AT(PROCURA,TEXTO),LEN(PROCURA))
SEMPONTO=STRTRAN(EXTRAI,".")
TROCAPONTO=STRTRAN(SEMPONTO,",",".")
VALOR=VAL(TROCAPONTO)
? AT("a", "abcde") // Resulta: 1
? AT("bcd", "abcde") // Resulta: 2
? AT("a", "bcde") // Resulta: 0
Este exemplo divide uma cadeia de caracteres com base na
posiçao de uma vírgula dentro da cadeia de caracteres destino:
cTarget = "Langtree, Lilly"
? SUBSTR(cTarget, 1, AT(",", cTarget) - 1) // Resulta: Langtree
? SUBSTR(cTarget, AT(",", cTarget) + 2) // Resulta: Lilly
Até logo.
Marcelo
Editado pela última vez por Clipper em 07 Fev 2008 14:28, em um total de 2 vezes.
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
-
Adalberto
- Usuário Nível 3

- Mensagens: 343
- Registrado em: 01 Set 2007 01:09
- Localização: Santa Cruz de la Sierra - Bolivia
cadeia de caracteres
Mateus,
Se a cadeia esta em uma variável do tipo string:
Faço assim:
Da certo.
Se a cadeia esta em uma variável do tipo string:
Faço assim:
Código: Selecionar todos
FUNCTION ExtraeValor( cVariavel )
//
LOCAL Ni , cDigito , cValor := “” // virgulas sem espacos
LOCAL nValor := 0.00 , nLen := LEN( cVariavel )
FOR nI := 1 TO LEN( cVariavel )
cDigito := SUBS( cVariavel , nI , 1 )
IF ( ISDIGIT( cDigito ) .OR. ( cDigito == “.” ) ) // virgulas e ponto
cValor += cDigito
ENDIF
NEXT nI
nValor := VAL( cValor )
RETURN( nValor )
Se o arquivo que você dispõe é essa zona, a única forma de identificar um número é através da vírgula. Se encontrar e você sempre tiver apenas duas casas decimais, você já tem o ponto final. A partir da posição da vírgula, volte até encontrar algo que não seja número (atenção para os números negativos, se tiver). Tendo o ponto inicial e final, é só cortar e converter. Repita esses passos, a partir da posição final, até que não encontre mais vírgula nenhuma.
Agora, se o texto contiver vírgulas, vai dar mais trabalho. Mas tente fazer. Se tiver dúvidas ainda assim, poste-as no fórum.
Agora, se o texto contiver vírgulas, vai dar mais trabalho. Mas tente fazer. Se tiver dúvidas ainda assim, poste-as no fórum.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
pelos exemplos, o que separa as palavras dos números são espaços em branco. Então vc já tem como procurar o inicio dos números.
Se no meio das letras (as palavras) não aparece nenhum número, vc tb pode usar isso para localizar os números.
Se no meio das letras (as palavras) não aparece nenhum número, vc tb pode usar isso para localizar os números.
"TRS-80/Sincler/Apple/PC - Clipper Winter 85, tlink 1.0 [pc 10 MHz - 640K] {NEZ 8000 2Kb RAM}"
{POG - Programação Orientada a Gambiarra}
{POG - Programação Orientada a Gambiarra}
-
Adalberto
- Usuário Nível 3

- Mensagens: 343
- Registrado em: 01 Set 2007 01:09
- Localização: Santa Cruz de la Sierra - Bolivia
cadeia de caracteres
Mateus,
Teste o siguinte:
Observe que a cadeia contem pontos, virgula, espacos e -.
Da certo.
Teste o siguinte:
Código: Selecionar todos
LOCAL cCadena := '-assdgs, hdghs 1,236.20 fhdj f djfh -23.50 kfjdk.fdf 500,4456.45 -dhf 1'
LOCAL nLen , nI := 0 , cDigito , nValor , nFila := 9
WHILE ( LEN( cCadena ) > 1 )
nI++
cDigito := SUBS( cCadena , nI , 1 )
IF ( ISDIGIT( cDigito ) .OR. ( cDigito $ '.,-' ) ) // Ponto virgula e -
IF !( cDigito = ',' )
cCadena := SUBS( cCadena , nI , LEN( cCadena ) )
nValor := ExtraeValor( @cCadena )
IF !EMPTY( nValor )
@ nFila++,10 SAY nValor PICT '###,###,###.##'
ENDIF
nI := 0
ENDIF
ENDIF
ENDDO
wait
RETURN NIL
//
FUNCTION ExtraeValor( cVariavel )
//
LOCAL nI , cValor := "" , nValor := 0 , nLen := LEN( cVariavel )
FOR nI := 1 TO nLen
cDigito := SUBS( cVariavel , nI , 1 )
IF ( ISDIGIT( cDigito ) .OR. ( cDigito $ '.,-' ) )
IF ( cDigito # ',' )
cValor += SUBS( cVariavel , nI , 1 )
ENDIF
ELSE
cVariavel:= SUBS( cVariavel , nI , nLen )
EXIT
ENDIF
NEXT nI
IF ( ( LEN( cValor ) == 1 ) .AND. ( cValor $ ',.-' ) )
cValor := '0'
ENDIF
nValor := VAL( cValor )
RETURN( nValor )
Da certo.

