Página 1 de 1

Cadeia de caracteres

Enviado: 07 Fev 2008 12:10
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.

Enviado: 07 Fev 2008 12:28
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

cadeia de caracteres

Enviado: 07 Fev 2008 12:51
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.

Enviado: 07 Fev 2008 13:39
por gvc
Não existe nenhuma regra para o posicionamento dos valores em questão?

Enviado: 07 Fev 2008 16:14
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.

Enviado: 07 Fev 2008 16:26
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.

Enviado: 07 Fev 2008 17:46
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.

cadeia de caracteres

Enviado: 08 Fev 2008 23:32
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.