Limitar entrada de decimais
Estou trabalhando com Firebird 1.5, Delphi 7 e componentes IBX.
Em algumas telas com componentes DataControls (TDBEdit, por exemplo), quero restringir a entrada a 4 casas decimais no maximo. Meu campo na tabela é do tipo Double Precision, mas nao gostaria de trocar para Numeric(12,4) nesse momento, pois tem telas com tratamentos diferentes. Tentei no validate do campo (ClientDataSet) o seguinte codigo:
if (Frac(Sender.AsFloat * 10000) > 0) then
abort;
mas ele não funciona sempre, sendo que as vezes aparece um valor estranho (fracao) depois da funcao FRAC. O que estou fazendo de errado? É um bug do Delphi?
Valeu.
Em algumas telas com componentes DataControls (TDBEdit, por exemplo), quero restringir a entrada a 4 casas decimais no maximo. Meu campo na tabela é do tipo Double Precision, mas nao gostaria de trocar para Numeric(12,4) nesse momento, pois tem telas com tratamentos diferentes. Tentei no validate do campo (ClientDataSet) o seguinte codigo:
if (Frac(Sender.AsFloat * 10000) > 0) then
abort;
mas ele não funciona sempre, sendo que as vezes aparece um valor estranho (fracao) depois da funcao FRAC. O que estou fazendo de errado? É um bug do Delphi?
Valeu.
Drf
Curtidas 0
Respostas
Webjoel
08/04/2008
Olá!
A solução para seu problema é simples e rápida, mas também já tive este problema.
Use as seguintes formatções na propriedade DisplayFormat do ClientDataSet:
* 4 Casas Decimais:
* 2 Casas Decimais:
E dá-lhe F9![/code]
A solução para seu problema é simples e rápida, mas também já tive este problema.
Use as seguintes formatções na propriedade DisplayFormat do ClientDataSet:
* 4 Casas Decimais:
#,0.0000
* 2 Casas Decimais:
,0.00
E dá-lhe F9![/code]
GOSTEI 0
Drf
08/04/2008
webjoel, obrigado pela ajuda, mas essa configuração ja tenho no meu dataset, mas nao soluciona meu problema, na verdade, é apenas a mascara!
Se a mascara for ´#,0.0000´ e eu entrar com ´0,00001´ ele vai mostrar ´0,0000´ mas internamente estará gravando ´0,00001´ e justamente isso que nao quero, pois quero restringir a gravação e não o modo que é mostrado.
Tem mais alguma dica?
Obrigado.
Se a mascara for ´#,0.0000´ e eu entrar com ´0,00001´ ele vai mostrar ´0,0000´ mas internamente estará gravando ´0,00001´ e justamente isso que nao quero, pois quero restringir a gravação e não o modo que é mostrado.
Tem mais alguma dica?
Obrigado.
GOSTEI 0
Ffabiop
08/04/2008
Dá para forçar o descarte de casas decimais assim:
No caso, vamos deslocar a vírgula 4 casas a direita e descartar o restantes da decimais (int) e depois deslocar a vígula para seu lugar original. Pode fazer isso no onExit do campo ou no beforePost da tabela.
Valor := Int(valor*10000)/10000;
No caso, vamos deslocar a vírgula 4 casas a direita e descartar o restantes da decimais (int) e depois deslocar a vígula para seu lugar original. Pode fazer isso no onExit do campo ou no beforePost da tabela.
GOSTEI 0
Drf
08/04/2008
Agradeco a vc tb ffabiop, mas ainda nao é esse o meu problema. É que nao estou conseguindo ser claro.
Esse procedimento ignora as casas ´a mais´, mas na verdade preciso identificar qdo é digitado casas ´a mais´ e tomar uma decisao, e nao apenas ignora-las, por isso tentei com a funcao abaixo mas nao funcionou:
if (Frac(Sender.AsFloat * 10000) > 0) then
abort;
´Abort´ seria apenas um exemplo de uma decisao que poderia ser tomada.
Grato.
Esse procedimento ignora as casas ´a mais´, mas na verdade preciso identificar qdo é digitado casas ´a mais´ e tomar uma decisao, e nao apenas ignora-las, por isso tentei com a funcao abaixo mas nao funcionou:
if (Frac(Sender.AsFloat * 10000) > 0) then
abort;
´Abort´ seria apenas um exemplo de uma decisao que poderia ser tomada.
Grato.
GOSTEI 0
Joaoshi
08/04/2008
Colega, se o problema é quando esta recebendo os valores digitados poderia tentar:
- Atraves da funcao [b:7fb5146ecf]POS[/b:7fb5146ecf] verificar a posição do separador decimal
- A partir dai verificar quantos digitos após o separador decimal pela função [b:7fb5146ecf]LENGTH[/b:7fb5146ecf]
Parece meio gambiarra mas pode ser uma saída.
- Atraves da funcao [b:7fb5146ecf]POS[/b:7fb5146ecf] verificar a posição do separador decimal
- A partir dai verificar quantos digitos após o separador decimal pela função [b:7fb5146ecf]LENGTH[/b:7fb5146ecf]
Parece meio gambiarra mas pode ser uma saída.
GOSTEI 0