Identificar casas após a vírgula. É possível?
Moderador: Moderadores
-
trooper7
- 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?
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!
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

- 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?
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.
Agora, se fizer questão de remover os zeros à direita, vai ter um trabalho a mais. E ainda complica para alinhar o campo impresso.
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"
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
-
anacatacombs
- 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?
Não sei se entendi direito..
Mas... você quer saberr quantas casas decimais tem para saber qual picture usar? é isso?
Algo parecido com:
É isso?
Cole um pedaço do fonte.. vamos ver se clareia um pouco.
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
Cole um pedaço do fonte.. vamos ver se clareia um pouco.
-
alxsts
- 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?
Olá!
Veja se é isto:
Resultado:
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 )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)
Alexandre Santos (AlxSts)
-
trooper7
- 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?
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!
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
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!
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)
Re: Identificar casas após a vírgula. É possível?
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.
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!
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

- Mensagens: 472
- Registrado em: 12 Jul 2005 16:53
- Localização: Cianorte-Paraná
- Contato:
Re: Identificar casas após a vírgula. É possível?
Na verdade eu só estava tentando entender o que o colega tentou dizer 
Mas o importante é o problema resolvido.
Mas o importante é o problema resolvido.
-
trooper7
- 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?
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!
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)
Re: Identificar casas após a vírgula. É possível?
Aí é apenas manipulação de string. Poderia ser algo do tipo:
Código não testado. Mas a idéia é essa.
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[]'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!
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!
- Pablo César
- 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?
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.
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.
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.
- rochinha
- 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?
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:
Resultado:
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.
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
?""
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
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.
@braços : ? )
A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
-
alxsts
- 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?
Olá!
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: vai exibir 2,00.
Mas
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.
Claro que é bom ter em mente as informações que o Rochinha postou.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.
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 )Mas
Código: Selecionar todos
? Transform( 1.9967 * 200, "@ e, 999.99 )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)
Alexandre Santos (AlxSts)
-
trooper7
- 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?
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
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)
Re: Identificar casas após a vírgula. É possível?
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
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
