{"id":1452,"date":"2022-05-05T16:36:09","date_gmt":"2022-05-05T19:36:09","guid":{"rendered":"https:\/\/gladiston.net.br\/?page_id=1452"},"modified":"2022-09-14T10:53:20","modified_gmt":"2022-09-14T13:53:20","slug":"converter-um-texto-em-numeric184-ou-numeric182","status":"publish","type":"page","link":"https:\/\/gladiston.net.br\/en\/banco-de-dados\/converter-um-texto-em-numeric184-ou-numeric182\/","title":{"rendered":"Converter um texto em NUMERIC(18,4) ou NUMERIC(18,2)"},"content":{"rendered":"\n<p>Uma das coisas mais b\u00e1sicas que encontramos na programa\u00e7\u00e3o \u00e9 a convers\u00e3o de texto para n\u00famero. Isto muitas vezes ocorre porque extra\u00edmos o valor de que precisamos de um texto, mas enquanto o valor ainda for do tipo texto n\u00e3o poderemos fazer opera\u00e7\u00f5es matem\u00e1ticas como somar ou subtrair. Para resolver o problema \u00e9 preciso fazer a convers\u00e3o.<\/p>\n\n\n\n<p>A SQL Function abaixo resolve este problema, ela possui dois parametros de entrada:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>String com o valor: Por exemplo &#8216;R$ 1.123,4567&#8217;<\/li><li>Valor assumido caso a convers\u00e3o falhe: Assume zero, mas voc\u00ea pode trocar o valor.<\/li><\/ul>\n\n\n\n<p>E retorna NUMERIC(18,4), mas eu sei que muitos de voc\u00eas preferem valores com 2 casas decimais, portanto onde v\u00ea NUMERIC(18,4) no c\u00f3digo psql basta trocar por NUMERIC(18,2):<\/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 STR_TO_NUMERIC4 (\n    P_VALUE_AS_TEXT varchar(30),\n    P_VALUE_DEFAULT_IF_FAILS numeric(18,4) = 0)\nreturns numeric(18,4)\nas\nBEGIN\n  \/* essa procedure\/fun\u00e7\u00e3o retorna um numeric(18, 4) a partir de um tipo\n     texto exibido como numero, por exemplo, '1.234,5678'\n   O resultado ser\u00e1 o numeric(18,4) 1234.5678 j\u00e1 no formato SQL decimal\n   O segundo parametro \u00e9 o valor que dever\u00e1 ser retornado caso o texto n\u00famerico\n     n\u00e3o seja v\u00e1lido, ex:\n   a=STR_TO_NUMERIC4('R$ 1.234,5678', 0);\n   Visto que nesse exemplo o R$ n\u00e3o deveria existir ent\u00e3o retornar\u00e1 zero.\n   O sistema analisa a string da direita para a esquerda  a fim de\n     determinar qual \u00e9 o sinal de decimal, se ele encontrar primeiro a\n     virgula, ent\u00e3o a virgula ser\u00e1 o decimal, se ele encontrar o ponto\n     ent\u00e3o o ponto ser\u00e1 o decimal e o inverso ser\u00e1 o separador de milhar\n   by gladiston.santana[em]gmail.com\n  *\/\n  P_VALUE_AS_TEXT=trim(:P_VALUE_AS_TEXT);\n  if (:P_VALUE_AS_TEXT is null) then\n    P_VALUE_AS_TEXT=cast(P_VALUE_DEFAULT_IF_FAILS as varchar(30));\n  P_VALUE_AS_TEXT=trim(:P_VALUE_AS_TEXT);\n  if (:P_VALUE_AS_TEXT='') then\n    P_VALUE_AS_TEXT=cast(P_VALUE_DEFAULT_IF_FAILS as varchar(30));\n  if (position (',' in :P_VALUE_AS_TEXT)&amp;gt;0) then\n  begin\n    P_VALUE_AS_TEXT=replace (:P_VALUE_AS_TEXT,  ',', '.');\n  end\n\n  P_VALUE_AS_TEXT=trim(:P_VALUE_AS_TEXT);\n  return cast(P_VALUE_AS_TEXT AS numeric(18,4));\nEND<\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Modo de Usar<\/h2>\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;}\">s='12.345,6789';\nn=STR_TO_NUMERIC4(s, 0);\n-- retorna 12345.6789\ns='R$ 12.345,6789';\nn=STR_TO_NUMERIC4(s, 0);\n-- retorna zero porque R$ tornar\u00e1 o n\u00famero inv\u00e1lido<\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>O exemplo acima com pouca modifica\u00e7\u00e3o voc\u00ea pode deixar o numero de casas decimais din\u00e2mico. ou at\u00e9 mesmo permitir que &#8216;R$&#8217; seja ignorado dentro de uma string, o ponto \u00e9, temos agora uma maneira simples de converter um texto para um numero.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma das coisas mais b\u00e1sicas que encontramos na programa\u00e7\u00e3o \u00e9 a convers\u00e3o de texto para n\u00famero. Isto muitas vezes ocorre porque extra\u00edmos o valor de que precisamos de um texto, mas enquanto o valor ainda for do tipo texto n\u00e3o poderemos fazer opera\u00e7\u00f5es matem\u00e1ticas como somar ou subtrair. Para resolver o problema \u00e9 preciso fazer [&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-1452","page","type-page","status-publish","hentry"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1452","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=1452"}],"version-history":[{"count":2,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1452\/revisions"}],"predecessor-version":[{"id":2022,"href":"https:\/\/gladiston.net.br\/en\/wp-json\/wp\/v2\/pages\/1452\/revisions\/2022"}],"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=1452"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}