Identificar casas após a vírgula. É possível?

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

trooper7
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 19 Fev 2010 12:22
Localização: Ribeirão Preto/SP

Identificar casas após a vírgula. É possível?

Mensagem por trooper7 »

Olá pessoal, boa tarde!

Preciso fazer com que meu programa identifique (conte) as casas decimais após a vírgula de um valor qualquer e, dependendo da quantidade de casas, imprima um valor na nota.

^o)

Melhorando a pergunta! haha'
Um determinado produto custa R$ 1,9976. No caso, possui 4 casas decimais após a vírgula.
Beleza!
No cadastro de produtos, este valor aparece exatamente dessa forma!
Porém, na Nota Fiscal, quando impressa, este valor é arredondado para R$ 2,00, devido ao espaço FIXO determinado de apenas 2 casas decimais.

Minha dúvida é a seguinte:
Teria como fazer com que o programa conte quantas casas decimais existem no valor e imprima essa quantidade na nota, não deixando um espaço fixo de caracteres após a vírgula?

Exemplo,
Se for R$ 1,99 - Imprime essas duas casas
Se for R$ 1,998 - Imprime essas três casas
Se for R$ 1,9985 - Imprime essas quatro casas

Não sei se ficou muito confuso... qualquer coisa melhoro a pergunta! rs

Agradeço desde já a todos! :)Pos

Abraços galera!
"É comum vermos os homens zombarem do que não podem compreender." (Goethe)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Identificar casas após a vírgula. É possível?

Mensagem por alxsts »

Olá!

Achei a questão estranha. Nunca vi nota fiscal com valores que tenham mais de duas casas decimais...

Em todo caso, se 1,9976 está sendo impresso como 2,00, certamente existe uma Picture ou Transform() fazendo isso.
Voce não informa se no DBF o campo é numérico. Presumo que sim. Então, é só usar a função Transform() mesmo.

Código: Selecionar todos

// Exemplos:
   Local nNumber 

   nNumber := 1.9976
   ? Transform( nNumber, "@E 999,999,999.9999999999" )  //    "          1,9976000000"

   nNumber := 2268921.99769
   ? Transform( nNumber, "@E 999,999,999.9999999999" )  //    "  2.268.921,9976900000"
Agora, se fizer questão de remover os zeros à direita, vai ter um trabalho a mais. E ainda complica para alinhar o campo impresso.
[]´s
Alexandre Santos (AlxSts)
anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

Re: Identificar casas após a vírgula. É possível?

Mensagem por anacatacombs »

Não sei se entendi direito..
Mas... você quer saberr quantas casas decimais tem para saber qual picture usar? é isso?
Algo parecido com:

Código: Selecionar todos

if decimais(numero) == 3
    @ lin,col SAY "Numero "+TRANSFORM(Numero,"@E 999,999.999)
ENDIF
É isso?
Cole um pedaço do fonte.. vamos ver se clareia um pouco.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Identificar casas após a vírgula. É possível?

Mensagem por alxsts »

Olá!

Veja se é isto:

Código: Selecionar todos

   LOCAL aNum := {}

   AAdd( aNum, 123.45 )
   AAdd( aNum, 2123.45 )
   AAdd( aNum, 123.456 )
   AAdd( aNum, 9123.4567 )
   AAdd( aNum, .0074567 )


   CLS

   ? PadR( Str( aNum[1] ), 20 )  + " ===> "+ Transform( Int( aNum[1] ), "@E 999,999,999" ) + "," + Substr( Str( aNum[1] ), Rat( ".", Str( aNum[1] ) ) + 1 )
   ? PadR( Str( aNum[2] ), 20 )  + " ===> "+ Transform( Int( aNum[2] ), "@E 999,999,999" ) + "," + Substr( Str( aNum[2] ), Rat( ".", Str( aNum[2] ) ) + 1 )
   ? PadR( Str( aNum[3] ), 20 )  + " ===> "+ Transform( Int( aNum[3] ), "@E 999,999,999" ) + "," + Substr( Str( aNum[3] ), Rat( ".", Str( aNum[3] ) ) + 1 )
   ? PadR( Str( aNum[4] ), 20 )  + " ===> "+ Transform( Int( aNum[4] ), "@E 999,999,999" ) + "," + Substr( Str( aNum[4] ), Rat( ".", Str( aNum[4] ) ) + 1 )
   ? PadR( Str( aNum[5] ), 20 )  + " ===> "+ Transform( Int( aNum[5] ), "@E 999,999,999" ) + "," + Substr( Str( aNum[5] ), Rat( ".", Str( aNum[5] ) ) + 1 )
Resultado:

Código: Selecionar todos

       123.45        ===>         123,45
      2123.45        ===>       2.123,45
       123.456       ===>         123,456
      9123.4567      ===>       9.123,4567
         0.0074567   ===>           0,0074567
C:\EDE\Teste>
[]´s
Alexandre Santos (AlxSts)
trooper7
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 19 Fev 2010 12:22
Localização: Ribeirão Preto/SP

Re: Identificar casas após a vírgula. É possível?

Mensagem por trooper7 »

Opaa, valeeu Alex, eu acho que mais ou menos o que eu preciso consta em sua segunda dica.

E pelo que etendi, tanto na sua primeira dica quanto na dica da Ana, a quantidade de casas decimais após a vírgula estão fixas, e qualquer numero e/ou valor que a função interpretar, irá transformar com aquele formato já determinado apenas.

Mas eu gostaria de fazer com que o programa identifique, conte, quantas casas decimais existem no valor que consta no DBF. (Campo númerico, aliás!)
A idéia de utilizar quatro casas na nota é que existem casos, onde o valor vem "quebrado" desse jeito (R$1,9967) e arredondando os números, o valor total final da nota é alterado.

Por exemplo, um produto com valor de R$ 1,9967 com 200 peças, tem o valor total de R$ 399,34 (Tirando os impostos, obviamente). Agora, se o sistema arrendondar o valor unitário da nota para R$ 2,00, o valor total será R$ 400,00. Centavos de diferença né, mas que causam um B.O tremendo por aqui... hahaha.

Mas eu acho que com sua segunda dica, Alex, eu consigo fazer o que pretendo. Só falta interpretá-la agora! hahaha

Agradeço a todos vocês pelas respostas! :D
Um grande abraço!

-EDIT

Alex, não consegui fazer do jeito que pretendia. Dessa forma que você me passou o programa ainda "não sabe identificar" quantas casas decimais existem depois da vírgula. :/
No caso, o que pretendo seria mais ou menos isso:
O programa vai olhar aquele valor.
Se ele encontrar 2 casas após a vírgula sua saída será com 2 casas após a vírgula. Se ele contar 3 casas, imprimirá 3 casas. E assim vai...
Não sei se isso é possível, ou se tem um jeito melhor para solucionar esse meu problema, mas me perdoem alguma eventual ignorância... rs
Agradeço desde já a todos!
Abs! ;D
"É comum vermos os homens zombarem do que não podem compreender." (Goethe)
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Identificar casas após a vírgula. É possível?

Mensagem por Maligno »

Minha dica: fixe uma quantidade limite de casas depois da vírgula. Digamos 4 (em NF dificilmente precisará mais que isso). Transforme o valor em string, conforme esse limite. Em seguida, pesquisa da direita pra esquerda por zeros e elimine cada um até que sobrem ao menos duas casas depois da vírgula.

Pra quem não sabe: em NF eventualmente se lida com valores muito pequenos. No valor unitário e no sub-total do ítem pode-se ter mais de duas casas depois da vírgula. No valor total dos produtos que é regra ter apenas duas casas.
[]'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!
anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

Re: Identificar casas após a vírgula. É possível?

Mensagem por anacatacombs »

Na verdade eu só estava tentando entender o que o colega tentou dizer :)
Mas o importante é o problema resolvido.
trooper7
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 19 Fev 2010 12:22
Localização: Ribeirão Preto/SP

Re: Identificar casas após a vírgula. É possível?

Mensagem por trooper7 »

Opa!
Obrigado pela atenção Ana, de coração!

Pois é, realmente eu tentei com as dicas e não funcionou corretamente.
Acredito que com essa idéia possa funcionar, maligno!!! Fixando uma qtde máxima de casas... perfeito!

Agora só uma pergunta, quais comandos utilizo para fazê-la, de fato? rs
Creio que existam várias maneiras, mas alguém poderia exemplificar uma delas para que eu possa aprendê-la?
Desculpem-me, sou iniciante neste mundo Clipper, e quanto mais ajuda melhor!

Agradeço a todos! Vocês são 10, galera! -:]

Abraços!
"É comum vermos os homens zombarem do que não podem compreender." (Goethe)
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Re: Identificar casas após a vírgula. É possível?

Mensagem por Maligno »

Aí é apenas manipulação de string. Poderia ser algo do tipo:

Código: Selecionar todos

function Conv(nValor)
local nCasas := 4
local cValor := Transf(nValor,"@E 99,999."+Replicate("9",nCasas))
local i
for i := 1 to nCasas-2
   if Right(cValor,1) != "0"
      exit
   end
   cValor := Stuff(cValor,Len(cValor),1,"")
next
return cValor
Código não testado. Mas a idéia é essa.
[]'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
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á

Identificar casas após a vírgula. É possível?

Mensagem por Pablo César »

Fiquei com a incerteza de que o colega ainda queria saber sobre quantidade dos decimais. Se ja foi resolvido, me desculpe e senão fica como exemplo no aprendizado.

Fiz este exemplo que demostra o tratamento com variaveis do tipo numerica e do tipo caracter. Claro que sempre é melhor tratamento com variáveis do tipo numérica, assim evita a confusão que dá quando é caracter e não se sabe se está do tipo decimal com "." ou com a vírgula. Claro que sabemos que no Brasil utiliza-se a vírgula, mas no caso do programador fornecer o conteúdo da variável ja transformado de numerica para caracter o que causaria algum transtorno. Então decidí tratar isso também.

Espero ter contribuído para melhor esclarecimento sobre dados numericos / caracter / decimais

Redição desta mensagem: Comecei a elaboração do meu fonte enquanto tinham os colegas respondido antes de terminar de postar. O meu intuito não é sobrepujar nenhuma idéia, apenas enriquecer o enunciado.
Anexos
teste15.zip
(76.13 KiB) Baixado 127 vezes
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

Re: Identificar casas após a vírgula. É possível?

Mensagem por rochinha »

Amiguinhos,

O Clipper como qualquer outra linguagem identica possui algums comandos de configuração do ambiente que além de necessários podem diminuir estas dores de cabeça.

São eles:
SET DECIMALS
SET FIXED

Com SET DECIMALS voce poderá mudar a qualquer momento a quantidade de casa decimais que podem aparecer em campos numéricos, desde que estes campos em variáveis ou tabelas tenham digitos suficientes para a manipulação.

Não adianta manipular variáveis com trocentas casas decimais se na sua tabela voce só possui algumas.

Fui a campo e fiz alguns testes para obtermos o resultado:

Código: Selecionar todos

SET FIXED OFF

?"SET FIXED OFF"
?""
nVariavel := 123456.789012

SET DECIMALS TO
? "SET DECIMALS TO ", nVariavel

SET DECIMALS TO 3
? "SET DECIMALS TO 3", nVariavel

SET DECIMALS TO 4
? "SET DECIMALS TO 4", nVariavel

SET DECIMALS TO 2
? "SET DECIMALS TO 2", nVariavel

?""

SET FIXED ON

?"SET FIXED ON"
?""
SET DECIMALS TO
? "SET DECIMALS TO ", nVariavel

SET DECIMALS TO 3
? "SET DECIMALS TO 3", nVariavel

SET DECIMALS TO 4
? "SET DECIMALS TO 4", nVariavel

SET DECIMALS TO 2
? "SET DECIMALS TO 2", nVariavel

?""
Resultado:

Código: Selecionar todos

SET FIXED OFF

SET DECIMALS TO    123456.789012
SET DECIMALS TO 3 123456.789012
SET DECIMALS TO 4 123456.789012
SET DECIMALS TO 2 123456.789012

SET FIXED ON

SET DECIMALS TO    123456
SET DECIMALS TO 3 123456.789
SET DECIMALS TO 4 123456.7890
SET DECIMALS TO 2 123456.79
Podemos notar que houve arredondamento.

Pelos exemplos apresentados pelo forense Pablo Cesar ele trabalhou diretamente com valores e transformações de texto para valores, etc.

Cabe então analisar como reforçar estes exemplos.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Re: Identificar casas após a vírgula. É possível?

Mensagem por alxsts »

Olá!
trooper7 escreveu:um produto com valor de R$ 1,9967 com 200 peças, tem o valor total de R$ 399,34 (Tirando os impostos, obviamente). Agora, se o sistema arrendondar o valor unitário da nota para R$ 2,00, o valor total será R$ 400,00.
Claro que é bom ter em mente as informações que o Rochinha postou.

Creio que o melhor para minimizar os problemas de arredondamento é fazer todos os cálculos e exibir o valor final (aí é que vai ocorrer tal arredondamento).
Por exemplo:

Código: Selecionar todos

? Transform( 1.9967, "@ e, 999.99 )
vai exibir 2,00.
Mas

Código: Selecionar todos

? Transform( 1.9967 * 200, "@ e, 999.99 )
vai exibir 334,00, o que é correto.

O assunto é realmente controverso. Lembro-me de um tópico do ano passado, onde foi mostrado também o método do banqueiro. Se alguém quiser ver ou rever, o tópico é este.
[]´s
Alexandre Santos (AlxSts)
trooper7
Usuário Nível 2
Usuário Nível 2
Mensagens: 53
Registrado em: 19 Fev 2010 12:22
Localização: Ribeirão Preto/SP

Re: Identificar casas após a vírgula. É possível?

Mensagem por trooper7 »

Opa, valeu galera!

Vou experimentar todas essas dicas e verificar qual se adequa melhor à minha situação!
Assim que obtiver resultados satisfatórios, postarei aqui! ;D

Mais uma vez, muito obrigado pessoal!

Um grande abraço a todos! :)Pos
"É comum vermos os homens zombarem do que não podem compreender." (Goethe)
Cezar
Usuário Nível 3
Usuário Nível 3
Mensagens: 189
Registrado em: 27 Mai 2006 14:03

Re: Identificar casas após a vírgula. É possível?

Mensagem por Cezar »

Ola,

Se eu entendi, voce tem preço de item com 2,3 e 4 casas decimais, na NF tem espaço pra 2 casas.

O que voce vai imprimir na Nf é o resultado do preço unit * qtde.

Sugestão, Ex:

precoNF = 1,9967*200
precoNF = 399,34

precoNF = 1,9967*333
precoNF = 664,9011

use

precoNF = int(precoNF*100)/100
O precoNF fica = 664,90

Não sei se resolve???
v_cez@yahoo.com.br
Responder