Cadeia de caracteres

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

MATEUS_S
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 07 Fev 2008 11:26
Localização: TRES PONTAS - MG

Cadeia de caracteres

Mensagem por MATEUS_S »

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.
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

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 :

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)
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
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)
Adalberto
Usuário Nível 3
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

Mensagem por Adalberto »

Mateus,

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 )
Da certo.
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

Não existe nenhuma regra para o posicionamento dos valores em questão?
"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}
MATEUS_S
Usuário Nível 1
Usuário Nível 1
Mensagens: 2
Registrado em: 07 Fev 2008 11:26
Localização: TRES PONTAS - MG

Mensagem por MATEUS_S »

Obrigado pessoal pelo apoio.

Para complicar um pouco, se outros números se repetirem na cadeia e esses forem diferentes e for necessários extraí-los.

Ex.: ABAABABABABABA 7.543,50 TREUQO 5.457,00TASKJDL 4.050,00 DFDKÇAFDK 100,00 ETC.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

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.
[]'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!
Avatar do usuário
gvc
Colaborador
Colaborador
Mensagens: 1270
Registrado em: 23 Ago 2005 10:57

Mensagem por gvc »

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.
"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}
Adalberto
Usuário Nível 3
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

Mensagem por Adalberto »

Mateus,

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 )
Observe que a cadeia contem pontos, virgula, espacos e -.

Da certo.
Responder