Как отформатировать число в varchar с разделителем тысяч? Как оракул to_char()

Кто знает, как в Firebird 3 число в формате varchar с разделителем тысяч? Подобно оракулу to_char() выберите to_char(1234325234234.55,'999G999G999G999G999D00') nn из двойного -- 1 234 325 234 234,55


person Good Bit    schedule 19.07.2018    source источник
comment
write - это хранимая функция FB3, в основном вам нужно преобразовать float в varchar, а затем вставить пробелы (или любой другой разделитель тысяч, который вы бы использовали)   -  person Arioch 'The    schedule 20.07.2018


Ответы (2)


В Firebird такой возможности нет. Если вам нужно что-то подобное, вам нужно будет создать его самостоятельно как UDF (или найти существующий сторонний UDF, который делает это) или как хранимую функцию (Firebird 3+).

person Mark Rotteveel    schedule 20.07.2018
comment
Можете ли вы помочь преобразовать эту UDF F_FIXEDPOINTLANG из функции freeadhocudf.org в функцию psql Firebird 3? - person Good Bit; 20.07.2018
comment
@GoodBit Нет, извините, я не могу. - person Mark Rotteveel; 20.07.2018

Вот это может помочь. Извините за испанские комментарии, я закодировал это для своей работы.

ваше здоровье!

SET TERM ^ ;

create or alter procedure FN_FORMATEA_NUMERO_MILES (
    PVALOR numeric(14,2))
returns (
    NUMERO_FORMATEADO varchar(20))
as
declare variable VDECIMALES varchar(2);
declare variable VENTEROS varchar(20);
declare variable VNUMERO_BASE varchar(20);
declare variable VCONTEO smallint;
declare variable VDIGITOS smallint;
begin
  /* Convierte el numero a caracter */
  vnumero_base = trim(cast(pvalor as varchar(20)));
  /* Separa el segmendo decimal del segmento de enteros */
  vdecimales = substring(vnumero_base from position('.', vnumero_base) + 1 for 2);
  venteros = substring(vnumero_base from 1 for position('.', vnumero_base) - 1);
  /* Inicializa el resultado */
  numero_formateado = '.' || vdecimales;
  /* Integra los enteros en grupos de 3 */
  vconteo = char_length(venteros);
  vdigitos = 0;
  while (vconteo > 0) do
  begin
    numero_formateado = substring(venteros from vconteo for 1) || numero_formateado;
    vconteo = vconteo - 1;
    vdigitos = vdigitos + 1;
    if ((vdigitos = 3) and (vconteo > 0) and (substring(venteros from vconteo for 1) <> '-')) then
    begin
      vdigitos = 0;
      numero_formateado = ',' || numero_formateado;
    end
  end
  /* Regresa el numero formateado */
  suspend;
end^

SET TERM ; ^

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE FN_FORMATEA_NUMERO_MILES TO SYSDBA;
person Jesus Beltran    schedule 12.05.2021