Página 1 de 1

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

Enviado: 08 Abr 2010 17:23
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!

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

Enviado: 08 Abr 2010 18:44
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.

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

Enviado: 08 Abr 2010 19:35
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.

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

Enviado: 08 Abr 2010 21:05
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>

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

Enviado: 09 Abr 2010 08:31
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

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

Enviado: 09 Abr 2010 08:59
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.

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

Enviado: 09 Abr 2010 09:05
por anacatacombs
Na verdade eu só estava tentando entender o que o colega tentou dizer :)
Mas o importante é o problema resolvido.

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

Enviado: 09 Abr 2010 09:17
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!

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

Enviado: 09 Abr 2010 09:29
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.

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

Enviado: 09 Abr 2010 10:30
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.

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

Enviado: 09 Abr 2010 19:14
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.

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

Enviado: 09 Abr 2010 20:08
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.

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

Enviado: 12 Abr 2010 08:24
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

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

Enviado: 14 Abr 2010 17:13
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