Criando a versão FloatToStr em PL/Sql no Firebird 2.5
Ao tentar criar uma trigger de LOG no Firebird 2.5, percebi que quando usava valores de campos numeric ou double precision, na string desse log, o valor ficava com as casas decimais representativas, como por exemplo, ao usar num campo de Quantidade:
0,5 ficava 0.500
1000 ficava 1000.00
1 ficava 1000
então para resolver criei essa função.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| CREATE OR ALTER PROCEDURE FLOAT_TO_STR (
IFLOAT DOUBLE PRECISION)
RETURNS (
RETORNO VARCHAR(30))
AS
DECLARE VARIABLE VRET VARCHAR(30);
DECLARE VARIABLE VDEC CHAR(1) = ',';
BEGIN
VRET = TRIM(LEADING FROM CAST(:IFLOAT AS VARCHAR(30)));
VRET = REPLACE(:VRET, '.', :VDEC);
WHILE (RIGHT(:VRET, 1) = '0') DO
VRET = LEFT(:VRET, CHAR_LENGTH(:VRET) -1);
IF (RIGHT(:VRET, 1) = :VDEC) THEN
VRET = LEFT(:VRET, CHAR_LENGTH(:VRET) -1);
RETORNO = :VRET;
SUSPEND;
END |
CREATE OR ALTER PROCEDURE FLOAT_TO_STR (
IFLOAT DOUBLE PRECISION)
RETURNS (
RETORNO VARCHAR(30))
AS
DECLARE VARIABLE VRET VARCHAR(30);
DECLARE VARIABLE VDEC CHAR(1) = ',';
BEGIN
VRET = TRIM(LEADING FROM CAST(:IFLOAT AS VARCHAR(30)));
VRET = REPLACE(:VRET, '.', :VDEC);
WHILE (RIGHT(:VRET, 1) = '0') DO
VRET = LEFT(:VRET, CHAR_LENGTH(:VRET) -1);
IF (RIGHT(:VRET, 1) = :VDEC) THEN
VRET = LEFT(:VRET, CHAR_LENGTH(:VRET) -1);
RETORNO = :VRET;
SUSPEND;
END
Para usar chame assim:
select retorno from FLOAT_TO_STR(1000.00) from rdb$databse;
O retorno será uma string no formato ‘1000’
select retorno from FLOAT_TO_STR((select quantidade from estoque where codigo = 10)) from rdb$databse;
O retorno será uma string no formato ‘1’ e não mais ‘1.000’
-
Ivan Cesar
-
2.347 views
- 0 comentários
- 14 de julho de 2016
Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!
Posts Relacionados - Continue Aprendendo