{"id":1921,"date":"2022-07-15T15:47:45","date_gmt":"2022-07-15T18:47:45","guid":{"rendered":"https:\/\/gladiston.net.br\/?page_id=1921"},"modified":"2022-09-14T17:51:43","modified_gmt":"2022-09-14T20:51:43","slug":"como-converter-um-numero-para-texto-formatado","status":"publish","type":"page","link":"https:\/\/gladiston.net.br\/en\/banco-de-dados\/como-converter-um-numero-para-texto-formatado\/","title":{"rendered":"Como converter um numero para texto formatado"},"content":{"rendered":"\n<p>Uma das coisas mais b\u00e1sicas que encontramos na programa\u00e7\u00e3o \u00e9 a convers\u00e3o de n\u00famero para texto formatado. Isto muitas vezes ocorre porque queremos mostrar ao usu\u00e1rio um n\u00famero f\u00e1cil de entender separando-o com casas de milhar e decimal. Mas no mundo do SQL infelizmente queries s\u00f3 sabem mostrar o n\u00famero do jeito que ele \u00e9 processado, ou seja, 123456789.0987654 n\u00e3o pode ser exibido assim 123.456.789,10 do lado do servidor.<\/p>\n\n\n\n<p>A SQL Function abaixo resolve este problema, ela possui quadro par\u00e2metros de entrada, sendo tr\u00eas deles opcionais:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Par\u00e2metro 1:<\/strong> Valor, por exemplo,  123456789.0987654<\/li><li><strong>Par\u00e2metro 2:<\/strong> Se for usado, indica o numero de casas para arredondamento, ex: GET_FORMAT_FLOAT(123456789.0987654, 2) retornar\u00e1 123.456.789,10. Se usar numero negativo, o arredondamento passar\u00e1 a ser feito na por\u00e7\u00e3o inteira do numero, ex: GET_FORMAT_FLOAT(123456789.0987654, -2) retornar\u00e1 123.456.800 (sem parte fra\u00e7\u00e3o).<\/li><li><strong>Par\u00e2metro 3:<\/strong> Se for usado, indicar\u00e1 o separador de milhar, ex: &#8216;.&#8217;.<\/li><li><strong>Par\u00e2metro 4:<\/strong> Se for usado, indicar\u00e1 o separador de decimal, ex: &#8216;.&#8217;.<\/li><\/ul>\n\n\n\n<p>Se gostou dela, pode usufruir:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:false,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;sql&quot;,&quot;mime&quot;:&quot;text\/x-sql&quot;,&quot;theme&quot;:&quot;default&quot;,&quot;lineNumbers&quot;:true,&quot;styleActiveLine&quot;:true,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;&quot;,&quot;TrpContentRestriction&quot;:{&quot;restriction_type&quot;:&quot;exclude&quot;,&quot;selected_languages&quot;:[],&quot;panel_open&quot;:true},&quot;language&quot;:&quot;SQL&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;sql&quot;}\">create or alter function GET_FORMAT_FLOAT (\n    P_VALUE double precision,\n    P_ROUND integer = -255,\n    P_SEP_MILHAR varchar(1)='.',\n    P_SEP_DECIMAL varchar(1)=',')\nreturns varchar(255)\nas\ndeclare variable lvalue_as_text varchar(255);\ndeclare variable ltemp_var varchar(255);\ndeclare variable i int;\ndeclare variable lchar varchar(1);\ndeclare variable ltext_int varchar(255);\ndeclare variable ltext_decimal varchar(255);\nbegin\n  \/* essa fun\u00e7\u00e3o retorna uma string com numero formatado a partir de um valor\n     qualquer, por exemplo, 123456789.0987654 retorna '123.456.789,0987654'.\n   O segundo parametro P_ROUND \u00e9 para indicar arredondamento de casas, ex:\n   a=GET_FORMAT_FLOAT(123456789.0987654, 2); -- retorna '123.456.789,10'\n   Se o segundo parametro for negativo ent\u00e3o o arredondamento ser\u00e1 a partir\n   dos numeros inteiros e n\u00e3o h\u00e1 mais fra\u00e7\u00e3o, ex:\n   a=GET_FORMAT_FLOAT(123456789.0987654, -2); -- retorna '123.456.800'\n   Os parametros P_SEP_MILHAR e P_SEP_DECIMAL servem para indicar o separador\n   de milhar e decimal. Exceto o parametro de valor, todos os demais s\u00e3o opcionais\n   by gladiston.santana[em]gmail.com\n  *\/\n  if (:p_round&lt;&gt;-255) then\n  begin\n    lvalue_as_text=trim(cast(round(p_value, p_round) as varchar(255)));\n  end\n  else\n  begin\n    lvalue_as_text=trim(cast(p_value as varchar(255)));\n  end\n  -- a parte decimal deve estar separada, geralmente o decimal \u00e9 '.' nessas\n  -- convers\u00f5es, mas hipoteticamente se n\u00e3o encontrar ent\u00e3o procura por ','\n  -- antes de decidir que se trata dum numero inteiro\n  ltext_decimal='';\n  i=position ('.' in lvalue_as_text);\n  if (i=0) then\n    i=position (',' in lvalue_as_text);\n  if (i&gt;0) then\n  begin\n    -- separando a parte fracionaria\n    ltext_decimal=right(lvalue_as_text, char_length(lvalue_as_text)-i);\n    lvalue_as_text=left(lvalue_as_text, i-1);\n  end\n  -- Iniciar\u00e1 um loop do primeiro ao ultimo caractere na parte inteira\n  -- acrescentando a milhar a cada 3 caracteres\n  ltext_int='';\n  ltemp_var=reverse(lvalue_as_text);\n  i=0;\n  while (i&lt;char_length(ltemp_var)) do\n  begin\n    i=i+1;\n    lchar=substring(ltemp_var from i for 1);\n    ltext_int=ltext_int||lchar;\n    if (mod(i,3)=0)then\n    begin\n      -- n\u00e3o coloco milhar quando coincidir com o ultimo caractere\n      if (i&lt;&gt;char_length(ltemp_var))\n        then ltext_int=ltext_int||p_sep_milhar;\n    end\n  end\n  lvalue_as_text=reverse(ltext_int);\n  if (ltext_decimal&lt;&gt;'')\n    then lvalue_as_text=lvalue_as_text||p_sep_decimal||ltext_decimal;\n\n  return :lvalue_as_text;\nend<\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Uma das coisas mais b\u00e1sicas que encontramos na programa\u00e7\u00e3o \u00e9 a convers\u00e3o de n\u00famero para texto formatado. Isto muitas vezes ocorre porque queremos mostrar ao usu\u00e1rio um n\u00famero f\u00e1cil de entender separando-o com casas de milhar e decimal. Mas no mundo do SQL infelizmente queries s\u00f3 sabem mostrar o n\u00famero do jeito que ele \u00e9 [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":1109,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"templates\/template-full-width.php","meta":{"footnotes":""},"class_list":["post-1921","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1921","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/comments?post=1921"}],"version-history":[{"count":7,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1921\/revisions"}],"predecessor-version":[{"id":2048,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1921\/revisions\/2048"}],"up":[{"embeddable":true,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1109"}],"wp:attachment":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/media?parent=1921"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}