Converter parte de uma string em valor

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Converter parte de uma string em valor

Mensagem por Ricardo Sales Ribeiro »

Ola amigos!
Preciso de ajuda.
Preciso de uma linda de comando, q acho seja bem simples só q não estou conseguindo é o seguinte:

Tenho um arquivo no formato txt, com linhas do tamanho de 100 caracteres ok. Na posição 20 até a 29 tenho o seguinte: 999.999,99 como faço para pegar esta informação e transformar em valor? Logico q levando em cosideraçao as unidades de centavos, centenas e milhares.

É q preciso trazer esta informação e salvar em uma variavel numerica de Custo e Venda.

Desde já agradeço a ajuda.

Abraços
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
MARCELOG
Usuário Nível 4
Usuário Nível 4
Mensagens: 546
Registrado em: 15 Mar 2005 16:54
Localização: Divinópolis/MG

Mensagem por MARCELOG »

val(substr(cString,20,10))
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

MARCELOG, isto não daria certo por causa do formato em padrão inverso ao americano. Onde a nossa vígula para eles é milhar e onde o nosso ponto, é decimal pra eles.

Eu armazenaria isto sem padrão algum, apenas o decimal (com ponto). Daí você faz com ele o que quiser. Mas se ja vem assim e não dá para mudar tal geração. Então é um pouquinho mais elaborado. Eu sugiro pegar em duas partes esse valor. Desdobrando a parte decimal do inteiro. Como você disse é FIXO, não e?. Então faria assim:

VAR:=VAL( CHARREM(".",SUBSTR(cString,20,7))+"."+SUBSTR(cString,28,2) )

Eu acho que está correto o tamanho e posição da SUBSTRING mas acredito também que tem outra forma de sintetizar isso, mudando o FORMATO dos número. Mas assim fica uma coisa exclusiva para este fim.

O CHARREM, é uma função da CT.LIB e serve para remover caracteres numa string. Claro que pode ser substituida por outras funções interna do Clipper.

Um clip-abraço :)Pos
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Mensagem por Ricardo Sales Ribeiro »

Alo pessoal!
Agradeçço a colaboração dos amigos, más vou postar aqui o q tenho e o erro q estar dando, acredito q seja só um ajuste:

Minha linha de comando é essa:
Repl Vrunit with Val(Substr(Campo7,01,18))+Val(Substr(Campo7,20,2))/100

Este campo7 tem 21 caracteres, e o valor inicial dele é 1.122,30 qdo executo esta linha de comando o valor do VrUnit, já numerico fica, 1,42 porque?

Se o valor é até 999,99 dar certo se passar para casa de 1.000,00 dá problema, como poderia resolver?
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
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 »

Tente: Val(StrTran(Campo7,StrTran(Campo7,","),",","."))

[]'s
Maligno
http://www.buzinello.com/prg
Editado pela última vez por Maligno em 13 Abr 2007 09:53, em um total de 2 vezes.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Maligno, não deu certo seu exemplo.

Eu substituí a função CHARREM() pela sugerida pelo MALIGNO a StrTran()
e para mim está dando certo RICARDO, veja o meu exemplo:

Conteúdo do arquivo TESTE.TXT:

Código: Selecionar todos

ABCDEFGHIJKLMNOPQRS123.567,90TUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKL
E este o seu PRG:

Código: Selecionar todos

VTXT:=ALLTRIM(MEMOREAD("TESTE.TXT"))
VAR1:=VAL( StrTran(SUBSTR(VTXT,20,7),".")+"."+SUBSTR(VTXT,28,2) )
? VAR1
Funciona direitinho, RICARDO. experimente se é isso que você quer.

Um clip-abraço :)Pos
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Re: Converter parte de uma string em valor

Mensagem por Pablo César »

Ricardo Sales Ribeiro escreveu:Tenho um arquivo no formato txt, com linhas do tamanho de 100 caracteres ok. Na posição 20 até a 29 tenho o seguinte: 999.999,99
Na sua primeira msg você disse uma posição e na sua ultima msg você pega uma SUBSTRNG em OUTRA posição. Não estou entendendo...

Supondo que a posição da substring seja na posição original:
INTEIRO:= SUBSTR(VTXT,20,7)
DECIMAL:= SUBSTR(VTXT,28,2)

São duas operações que você tem que realizar:

1. Pegar em DUAS partes para formar uma SUBSTRING da STRING_TXT que você tem.
2. Remover dessa SUBSTRING obtida, o PONTO MILHAR que para o FORMATO INGLÊS representa o PONTO como DECIMAL. Viria ser o nosso PONTO representa a VÍRGULA para eles. Exemplo: 999.999,99 (assim modo brasileiro) e 999,999.99 (modo americano).

Depois é só converter a SUBSTRING obtida em variável NUMÉRICA. Assim você divide por 100, faz o que quiser. Deu pra entender ?.

Se não for o que eu estou te dizendo, então exemplifique de acordo com a msg original (posição da SUBTRING em questão).

Um clip-abraço :)Pos
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 »

Mas é só cortar a string e separar o número:

NUMERO_TODO := SubStr(Campo7, ... < ele sabe as posições > )

Depois, suprimir os pontos separadores e trocar a vírgula da fração por ponto, obtendo o número no padrão inglês. Eu só errei a supressão, colocando vírgula ao invés de ponto.

Val(StrTran(NUMERO_TODO,StrTran(NUMERO_TODO,"."),",","."))

Não se prenda com as posições. Certamente o colega sabe contar. :)

[]'s
Maligno
http://www.buzinello.com/prg
Grings
Usuário Nível 3
Usuário Nível 3
Mensagens: 340
Registrado em: 18 Ago 2004 13:51

Mensagem por Grings »

cVar:= 'APIUHGUIPHNSPREGHWR999.999,99VHNBJKHGJHG'
? cVar:=Stuff(SubStr(cVar,20,10),4,1,'')
? nVar:= Val(Stuff(cVar,7,1,'.'))
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Ainda não consegui

Mensagem por Ricardo Sales Ribeiro »

Ola Pessoal ainda não consegui acertar a conversão, segue em anexo meu código:

O Arquivo NewCol é gerado com os campos campo1, campo2, canpo3 e etc, até campo8 ok. Todos caracteres, os campos campo5 e campo7 tem 21 posições, alinhado pela direita contendo valores assim escritos 999.999,99

Já tentei de tres maneira, estas q estão com o (*), mas qdo o campo tem, tipo 1.999,88 ele vem truncado, ou seja, 1,99

Use NewCol Exclusive New
Zap
Appe from Cole7001.Txt Sdf
DbCloseAll()
Use NewCol Shared Alias a_NewCol New
Select a_NewCol
Do while !Eof()
@ 23,01 Say 'Atualizando ...'
If RLock()
Repl RefEst with Substr(Campo1,01,02)+Substr(Campo1,04,02)+Substr(Campo1,07,05)
Repl DesEst with Campo2
Repl TipEst with Substr(Campo2,01,20)
* Repl CusEst with Val(Substr(Campo5,01,18))+Val(Substr(Campo5,20,2))/100
* Repl Vrunit with Val(Substr(Campo7,01,18))+Val(Substr(Campo7,20,2))/100

* Repl CusEst with Val(StrTran(Substr(Campo5,10,07),".")+"."+Substr(Campo5,18,2))
* Repl Vrunit with Val(StrTran(Substr(Campo7,10,07),".")+"."+Substr(Campo7,18,2))

* Repl CusEst with Val(Campo5)
* Repl Vrunit with Val(Campo7)

DbUnlock()
DbCommit()
Endif
DbSkip()
Enddo
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Mensagem por Ricardo Sales Ribeiro »

Alo pessoal, o problema estar q na minha variavel, já contem ponto e virgula, eu teria q tirar os pontos e depois juntas a parte inteira com a decimal/100.

O Amigo maligno, deu a dica, só q não sei como funciona a função STRTRAN.

Minha variavel Campo7 contem 21 caracteres assim:

123456789012345678901
1.231.789,45

Como eu colocaria esta Função StrTan

Não existe uma função para retirar os pontos?
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
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 »

não sei como funciona a função STRTRAN.
Você não leu o NG. Mas é fácil: StrTran(<string>,<str_a_substituir>,<str_substituta>), sendo que <_str_substituta> é opcional e, não existindo, resultará no apagamento de str_a_substituir.
123456789012345678901
1.231.789,45

Como eu colocaria esta Função StrTan

Não existe uma função para retirar os pontos?
É como eu disse na outra mensagem:
Val(StrTran(NUMERO_TODO,StrTran(NUMERO_TODO,"."),",","."))

A StrTran() interna removerá os pontos e a StrTran mais externa trocará a vírgula pelo ponto, formando assim, uma string que representa um número. A função Val() transforma essa string em um número de fato.

Evidentemente, você sabe que NUMERO_TODO pode ser separado pela função SubStr(), já que você sabe onde esta string começa e qual seu tamanho.

Conselho de amigo: leia incansavelmente o NG. Você está se perdendo no básico. Aliás, pra quem trabalha com sistemas de informação, saber manipular strings é absolutamente primordial. Não ter esse domínio é o mesmo que feirante não saber gritar. Pode até vender alguma coisa, mas vai sofrer um bocado. :)

[]'s
Maligno
http://www.buzinello.com/prg
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Mensagem por Ricardo Sales Ribeiro »

Bom Dia Pessoal

Quero agradecer a ajuda de vcs e em especial ao Maligno pela ajuda e pelas dicas, consegui resolver, e entendi perfeitamente a função substr e as demasi, eu estava errando na ultima posição para resgatar os centavos, estava colocando posição 21 com 2 casas e na realidade seria 20 com 2 casas, por isso os centavos não batiam. Valeu.

Valeu mesmo
Obrigado a todos
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Mensagem por Pablo César »

Maligno escreveu:Não se prenda com as posições. Certamente o colega sabe contar. :)
Hehe... não se prenda ? As vezes o erro está numa simples coisinha de nada...

Mas a idéia que eu passei de capturar em duas partes, excluir os pontos e vírgula e converter em numérico... está correto.

Ricardo, eu tinha levantado uma questão na minha primeira mensagem:
Pablo escreveu:Eu armazenaria isto sem padrão algum, apenas o decimal (com ponto). Daí você faz com ele o que quiser. Mas se ja vem assim e não dá para mudar tal geração.
Você entendeu o que eu quis dizer ?. Não poderia ser gravado sem pformatação alguma ? Ou ja vem assim de algum outro aplicativo que não dá para mudar... ?

Um clip-abraço :)Pos
Avatar do usuário
Ricardo Sales Ribeiro
Usuário Nível 3
Usuário Nível 3
Mensagens: 279
Registrado em: 13 Jul 2004 18:06
Localização: Fortaleza-Ceara

Mensagem por Ricardo Sales Ribeiro »

Amigo Pablo

Eu realmente acabei resolvendo com a sua ideia, ou seja separando por parte, eliminando os pontos retirando os espaços e convertendo em valores a parte inteira. Da mesma forma fiz com a parte dos centavos, e na hora de somar a parte inteira com a dos centavos, eu antes dividi por 100 para pegar mesmo os centavos, e deu certo.

Eu só poderia fazer desse jeito mesmo, já q o arquivo .txt já vinha com a formatação brasileira, ou seja 999.999,99 aí foi so separa tirando os pontos, deu certo sim.

Talvez por já estar assim formatado, eu não tenha conseguido fazer com a função StrTram q o maligno tinha me orientado, más de qualquer forma deu certo e eu agradeço a vcs pela ajuda. Valeu mesmo.

Obrigado
Ricardo Sales
Fortaleza-Ce
lodara53@yahoo.com.br
lodara53@hotmail.com
Responder