Converter parte de uma string em valor
Moderador: Moderadores
- Ricardo Sales Ribeiro
- 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
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
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
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
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
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
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
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?
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?
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
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:
E este o seu PRG:
Funciona direitinho, RICARDO. experimente se é isso que você quer.
Um clip-abraço :)Pos
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,90TUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLCódigo: Selecionar todos
VTXT:=ALLTRIM(MEMOREAD("TESTE.TXT"))
VAR1:=VAL( StrTran(SUBSTR(VTXT,20,7),".")+"."+SUBSTR(VTXT,28,2) )
? VAR1Um clip-abraço :)Pos
- Pablo César
- 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
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...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
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
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
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
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
Ainda não consegui
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
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 Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
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?
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?
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.não sei como funciona a função STRTRAN.
É como eu disse na outra mensagem:123456789012345678901
1.231.789,45
Como eu colocaria esta Função StrTan
Não existe uma função para retirar os pontos?
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
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
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
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
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Hehe... não se prenda ? As vezes o erro está numa simples coisinha de nada...Maligno escreveu:Não se prenda com as posições. Certamente o colega sabe contar.
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:
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... ?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.
Um clip-abraço :)Pos
- Ricardo Sales Ribeiro
- Usuário Nível 3

- Mensagens: 279
- Registrado em: 13 Jul 2004 18:06
- Localização: Fortaleza-Ceara
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
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

