/fontes/module/Application/src/Application/Util/FormataNumero.php

https://gitlab.com/sejainfo/aesbe · PHP · 281 lines · 220 code · 21 blank · 40 comment · 50 complexity · 115a20e0c56af45314d8c93878050653 MD5 · raw file

  1. <?php
  2. namespace Application\Util;
  3. class FormataNumero
  4. {
  5. /**
  6. * Metodo responsavel em formatar numero acresentando 2 casas decimais para valores que nao tem casa
  7. * decimais ou retira o ponto para quem tem casa decimal
  8. *
  9. * @param float $valor
  10. * @return string null
  11. */
  12. public function formataNumeroParaAgenteFinanceiro($valor)
  13. {
  14. if (empty($valor)) {
  15. return null;
  16. }
  17. if (strpos($valor, '.') === false) {
  18. $valor = $valor . '00';
  19. } else {
  20. $valor = str_replace('.', '', $valor);
  21. }
  22. return $valor;
  23. }
  24. /**
  25. * Formatar valor numerico para NUMBER do Oracle
  26. *
  27. * @param float|int $valor
  28. * @return float int
  29. */
  30. public static function formatarFloatBanco($valor)
  31. {
  32. $valor = str_replace('.', '', $valor);
  33. $valor = str_replace(',', '.', $valor);
  34. return $valor;
  35. }
  36. /**
  37. * Formata um Número para Real
  38. *
  39. * @param float $valor
  40. * @param boolean $semCifrao
  41. * @param boolean $semDivisaoMilhares
  42. * @return float
  43. */
  44. public static function formatarParaReal($valor, $semCifrao = false, $semDivisaoMilhares = false)
  45. {
  46. if ($semDivisaoMilhares) {
  47. $valor = number_format($valor, 2, ",", "");
  48. } else {
  49. $valor = number_format($valor, 2, ",", ".");
  50. }
  51. if (!$semCifrao) {
  52. $valor = "R$" . $valor;
  53. }
  54. return $valor;
  55. }
  56. /**
  57. * Exibe a string de um texto por número por extenso
  58. *
  59. * @param number $numero
  60. * @return string
  61. */
  62. public static function valorPorExtenso($numero = 0)
  63. {
  64. $arrValores = self::retornaArrayValores();
  65. // Separação de reais e centavos
  66. $n = explode(".", $numero);
  67. // A construção é dividida por centenas, e a primeira centena sempre deve ter 3 dígitos.
  68. $qnt = ceil(strlen($n[0]) / 3);
  69. $qnt_digitos = ceil(strlen($n[0]) / 3) * 3;
  70. $u = sprintf("%0{$qnt_digitos}s", $n[0]);
  71. $inteiros = array();
  72. if ($u != '000') {
  73. // Constrói cada centena, da primeira à última.
  74. $inteiros = self::montaInteiros($u, $qnt, $arrValores);
  75. }
  76. $centavos = '';
  77. if (isset($n[1]) && $n[1] != '00') {
  78. // Caso os centavos venham escritos com apenas uma unidade (".1" invés de ".10")
  79. if (strlen($n[1]) == 1) {
  80. $n[1] .= '0';
  81. }
  82. $rest = $n[1];
  83. $dezena = substr($rest, - 2, 1);
  84. if ($arrValores['Dezenas'][$dezena]) {
  85. $centavos .= " E " . $arrValores['Dezenas'][$dezena];
  86. }
  87. $unid = substr($rest, - 2);
  88. if ($unid < 20) {
  89. $unid = substr($rest, - 2);
  90. if ($arrValores['unidades'][(int) $unid]) {
  91. $centavos .= " E " . $arrValores['unidades'][(int) $unid];
  92. }
  93. } else {
  94. $unid = substr($rest, - 1);
  95. if ($arrValores['unidades'][$unid]) {
  96. $centavos .= " E " . $arrValores['unidades'][$unid];
  97. }
  98. }
  99. if ($rest == "01") {
  100. $centavos .= " CENTAVO";
  101. } elseif ($centavos) {
  102. $centavos .= " CENTAVOS";
  103. }
  104. }
  105. $parteFinal = array_pop($inteiros);
  106. // Quando a última centena é 000, a moeda aparece sozinha e deve ser ligada à centena anterior.
  107. if ($parteFinal == " REAIS" || $parteFinal == " REAL") {
  108. // Ocorre apenas em números iguais a 10^(6+)
  109. if (substr($u, - 6) == '000000') {
  110. $parteFinal = " DE " . $parteFinal;
  111. }
  112. $parteFinal = array_pop($inteiros) . $parteFinal;
  113. }
  114. // Ocorre apenas em números maiores que 10^3 que não são iguais a 10^(6+)
  115. if ((bool) $inteiros) {
  116. $parteFinal = " E " . $parteFinal;
  117. }
  118. $parteInicial = implode(", ", $inteiros);
  119. $texto = $parteInicial . $parteFinal . $centavos;
  120. return $texto;
  121. }
  122. private static function montaInteiros($u, $qnt, $arrValores)
  123. {
  124. for ($i = $qnt; $i > 0; $i --) {
  125. $nfinal = '';
  126. $rest = substr($u, - 3 * $i, 3);
  127. if ($rest) {
  128. $centena = substr($rest, - 3, 1);
  129. if ($arrValores['Centenas'][$centena]) {
  130. if ($nfinal) {
  131. $nfinal .= " E ";
  132. }
  133. $nfinal = $arrValores['Centenas'][$centena];
  134. }
  135. $dezena = substr($rest, - 2, 1);
  136. if ($arrValores['Dezenas'][$dezena]) {
  137. if ($nfinal) {
  138. $nfinal .= " E ";
  139. }
  140. $nfinal .= $arrValores['Dezenas'][$dezena];
  141. }
  142. $unid = substr($rest, - 2);
  143. if ($unid < 20) {
  144. $unid = substr($rest, - 2);
  145. if ($arrValores['unidades'][(int) $unid]) {
  146. if ($nfinal) {
  147. $nfinal .= " E ";
  148. }
  149. $nfinal .= $arrValores['unidades'][(int) $unid];
  150. }
  151. } else {
  152. $unid = substr($rest, - 1);
  153. if ($arrValores['unidades'][$unid]) {
  154. if ($nfinal) {
  155. $nfinal .= " E ";
  156. }
  157. $nfinal .= $arrValores['unidades'][$unid];
  158. }
  159. }
  160. // Centenas particulares
  161. if ($rest == "100") {
  162. $nfinal = "CEM";
  163. }
  164. if ($rest == "001") {
  165. $nfinal .= " " . $arrValores['unidSing'][$i];
  166. } elseif (($rest != "000") || ($i == 1)) {
  167. $nfinal .= " " . $arrValores['unidade'][$i];
  168. }
  169. // Apenas centenas que serão escritas vão no array $inteiros
  170. if ($nfinal != "") {
  171. $inteiros[] = $nfinal;
  172. }
  173. }
  174. }
  175. return $inteiros;
  176. }
  177. public static function retornaArrayValores()
  178. {
  179. $unidades = array(
  180. "",
  181. "UM",
  182. "DOIS",
  183. "TRÊS",
  184. "QUATRO",
  185. "CINCO",
  186. "SEIS",
  187. "SETE",
  188. "OITO",
  189. "NOVE",
  190. "DEZ",
  191. "ONZE",
  192. "DOZE",
  193. "TREZE",
  194. "QUATORZE",
  195. "QUINZE",
  196. "DEZESSEIS",
  197. "DEZESSETE",
  198. "DEZOITO",
  199. "DEZENOVE"
  200. );
  201. $Dezenas = array(
  202. "",
  203. "",
  204. "VINTE",
  205. "TRINTA",
  206. "QUARENTA",
  207. "CINQUENTA",
  208. "SESSENTA",
  209. "SETENTA",
  210. "OITENTA",
  211. "NOVENTA"
  212. );
  213. $Centenas = array(
  214. "",
  215. "CENTO",
  216. "DUZENTOS",
  217. "TREZENTOS",
  218. "QUATROCENTOS",
  219. "QUINHENTOS",
  220. "SEISCENTOS",
  221. "SETECENTOS",
  222. "OITOCENTOS",
  223. "NOVECENTOS"
  224. );
  225. $unidade = array(
  226. "",
  227. "REAIS",
  228. "MIL",
  229. "MILHÕES",
  230. "BILHÕES",
  231. "TRILHÕES"
  232. );
  233. $unidSing = array(
  234. "",
  235. "REAL",
  236. "MIL",
  237. "MILHÃO",
  238. "BILHÃO",
  239. "TRILHÃO"
  240. );
  241. return array(
  242. 'unidades' => $unidades,
  243. 'Dezenas' => $Dezenas,
  244. 'Centenas' => $Centenas,
  245. 'unidade' => $unidade,
  246. 'unidSing' => $unidSing,
  247. );
  248. }
  249. /**
  250. * Formata valor retirando ponto e adicionando virgula.
  251. * @param string $val
  252. */
  253. public function formataValoresPontoVirgula($val)
  254. {
  255. if (floatval($val) == '0') {
  256. return '0';
  257. }
  258. return number_format(floatval($val), 2, ',', '.');
  259. }
  260. }