Advertisement
ferrarisp

doc_extenso.txt

Aug 21st, 2015
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.35 KB | None | 0 0
  1. Documentação do GUtils
  2.  
  3.  
  4.  
  5. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  6.  
  7. Contents
  8.  
  9. Package GUtils Procedural Elements 2
  10. GExtenso.php 2
  11. Package GUtils Classes 3
  12. Class GExtenso 3
  13. Class Constant GENERO_FEM 4
  14. Class Constant GENERO_MASC 4
  15. Class Constant NUM_PLURAL 4
  16. Class Constant NUM_SING 4
  17. Class Constant POS_GENERO 4
  18. Class Constant VALOR_MAXIMO 4
  19. Method moeda 4
  20. Method numero 5
  21. Appendices 6
  22. Appendix A - Class Trees 7
  23. GUtils 7
  24. Appendix C - Source Code 8
  25. Package GUtils 9
  26. source code: GExtenso.php 10
  27.  
  28. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  29.  
  30. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  31.  
  32. Page 1 of 15
  33.  
  34. Package GUtils Procedural Elements
  35.  
  36.  
  37. GExtenso.php
  38.  
  39. GExtenso class file
  40.  
  41.  
  42. Package GUtils
  43. Author Fausto Gonçalves Cintra (goncin) < goncin@gmail.com>
  44. Link http://twitter.com/g0nc1n
  45. Link http://devfranca.ning.com
  46. Filesource Source Code for this file
  47. License http://creativecommons.org/licenses/LGPL/2.1/deed.pt
  48. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  49.  
  50. Page 2 of 15
  51.  
  52. Package GUtils Classes
  53.  
  54.  
  55. Class GExtenso
  56.  
  57. [line 50]
  58.  
  59. GExtenso é uma classe que gera a representação por extenso de um número ou valor
  60. monetário.
  61.  
  62. Sua implementação foi feita como prova de conceito, utilizando:
  63.  
  64.  
  65. Métodos estáticos, implementando o padrão de projeto (design pattern) SINGLETON;
  66. Chamadas recursivas a métodos, minimizando repetições e mantendo o código enxuto;
  67. Uso de pseudoconstantes ('private static') diante das limitações das constantes de classe;
  68. Tratamento de erros por intermédio de exceções; e
  69. Utilização do phpDocumentor (http://www.phpdoc.org) para documentação do código fonte e
  70. geração automática de documentação externa.
  71. EXEMPLOS DE USO
  72.  
  73. Para obter o extenso de um número, utilize GExtenso:: numero. echo
  74. GExtenso::numero(832); // oitocentos e trinta e dois
  75. echo GExtenso::numero(832, GExtenso::GENERO_FEM) // oitocentas e trinta e duas
  76.  
  77. Para obter o extenso de um valor monetário, utilize GExtenso:: moeda. // IMPORTANTE:
  78.  
  79. veja nota sobre o parâmetro 'valor' na documentação do método!
  80. echo GExtenso::moeda(15402); // cento e cinquenta e quatro reais e dois centavos
  81. echo GExtenso::moeda(47); // quarenta e sete centavos
  82. echo GExtenso::moeda(357082, 2,
  83.  
  84. array('peseta', 'pesetas', GExtenso::GENERO_FEM),
  85. array('cêntimo', 'cêntimos', GExtenso::GENERO_MASC));
  86. // três mil, quinhentas e setenta pesetas e oitenta e dois cêntimos
  87.  
  88.  
  89.  
  90. Package GUtils
  91.  
  92. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  93.  
  94. Page 3 of 15
  95.  
  96. Author Fausto Gonçalves Cintra (goncin) < goncin@gmail.com>
  97. Version 0.1 2010-03-02
  98. GExtenso::GENERO_FEM
  99.  
  100. = 1 [line 56]
  101.  
  102. GExtenso::GENERO_MASC
  103.  
  104. = 0 [line 55]
  105.  
  106. GExtenso::NUM_PLURAL
  107.  
  108. = 1 [line 53]
  109.  
  110. GExtenso::NUM_SING
  111.  
  112. = 0 [line 52]
  113.  
  114. GExtenso::POS_GENERO
  115.  
  116. = 2 [line 54]
  117.  
  118. GExtenso::VALOR_MAXIMO
  119.  
  120. = 999999999 [line 58]
  121.  
  122. string function GExtenso::moeda($valor, [$casasDecimais = 2], [$infoUnidade = array('real', 'reais',
  123. self::GENERO_MASC)], [$infoFracao = array('centavo', 'centavos', self::GENERO_MASC)]) [line 285]
  124.  
  125. Function Parameters:
  126.  
  127.  
  128. int $valor O valor monetário cujo extenso se deseja gerar. ATENÇÃO: PARA EVITAR OS
  129. CONHECIDOS PROBLEMAS DE ARREDONDAMENTO COM NÚMEROS DE PONTO
  130. FLUTUANTE, O VALOR DEVE SER PASSADO JÁ DEVIDAMENTE MULTIPLICADO POR 10
  131. ELEVADO A $casasDecimais (o que equivale, normalmente, a passar o valor com centavos
  132. multiplicado por 100)
  133. int $casasDecimais (Opcional; valor padrão: 2) Número de casas decimais a serem
  134. consideradas como parte fracionária (centavos)
  135. array $infoUnidade (Opcional; valor padrão: array('real', 'reais', GExtenso::GENERO_MASC))
  136. Fornece informações sobre a moeda a ser utilizada. O primeiro valor da matriz corresponde ao
  137. nome da moeda no singular, o segundo ao nome da moeda no plural e o terceiro ao gênero
  138. gramatical do nome da moeda (GExtenso::GENERO_MASC ou GExtenso::GENERO_FEM)
  139. array $infoFracao (Opcional; valor padrão: array('centavo', 'centavos', self::GENERO_MASC))
  140. Provê informações sobre a parte fracionária da moeda. O primeiro valor da matriz corresponde
  141. ao nome da parte fracionária no singular, o segundo ao nome da parte fracionária no plural e
  142. o terceiro ao gênero gramatical da parte fracionária (GExtenso::GENERO_MASC ou
  143. GExtenso::GENERO_FEM)
  144. Gera a representação por extenso de um valor monetário, maior que zero e menor ou
  145. igual a GExtenso::VALOR_MAXIMO.
  146.  
  147. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  148.  
  149. Page 4 of 15
  150.  
  151. Since 0.1 2010-03-02
  152. Static
  153. Access public
  154. string function GExtenso::numero($valor, [$genero = self::GENERO_MASC]) [line 167]
  155.  
  156. Function Parameters:
  157.  
  158.  
  159. int $valor O valor numérico cujo extenso se deseja gerar
  160. int $genero (Opcional; valor padrão: GExtenso::GENERO_MASC) O gênero gramatical
  161. (GExtenso::GENERO_MASC ou GExtenso::GENERO_FEM) do extenso a ser gerado. Isso
  162. possibilita distinguir, por exemplo, entre 'duzentos e dois homens' e 'duzentas e duas mulheres'.
  163. Gera a representação por extenso de um número inteiro, maior que zero e menor ou
  164. igual a GExtenso::VALOR_MAXIMO.
  165.  
  166.  
  167. Since 0.1 2010-03-02
  168. Static
  169. Access public
  170. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  171.  
  172. Page 5 of 15
  173.  
  174. Appendices
  175.  
  176.  
  177. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  178.  
  179. Page 6 of 15
  180.  
  181. Appendix A - Class Trees
  182.  
  183. Package GUtils
  184.  
  185. GExtenso
  186.  
  187.  
  188. GExtenso
  189. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  190.  
  191. Page 7 of 15
  192.  
  193. Appendix C - Source Code
  194.  
  195.  
  196. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  197.  
  198. Page 8 of 15
  199.  
  200. Package GUtils
  201.  
  202.  
  203. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  204.  
  205. Page 9 of 15
  206.  
  207. File Source for GExtenso.php
  208.  
  209.  
  210. Documentation for this file is available at GExtenso.php
  211.  
  212. 1 <?php
  213. 2 /**
  214. 3 * GExtenso class file
  215. 4 *
  216. 5 * @author Fausto Gonçalves Cintra (goncin) <goncin@gmail.com>
  217. 6 * @link http://devfranca.ning.com
  218. 7 * @link http://twitter.com/g0nc1n
  219. 8 * @license http://creativecommons.org/licenses/LGPL/2.1/deed.pt
  220. 9 */
  221.  
  222.  
  223. 11 /**
  224. 12 * GExtenso é uma classe que gera a representação por extenso de um número ou valor monetário.
  225. 13 *
  226. 14 * Sua implementação foi feita como prova de conceito, utilizando:
  227. 15 *
  228. 16 * <ul>
  229. 17 * <li>Métodos estáticos, implementando o padrão de projeto (<i>design
  230. pattern</i>) <b>SINGLETON</b>;</li>
  231. 18 * <li>Chamadas recursivas a métodos, minimizando repetições e mantendo o código
  232. enxuto;</li>
  233. 19 * <li>Uso de pseudoconstantes ('private static') diante das limitações das constantes de
  234. classe;</li>
  235.  
  236.  
  237. * <li>Tratamento de erros por intermédio de exceções; e</li>
  238. 21 * <li>Utilização do phpDocumentor ( {@link http://www.phpdoc.org}) para documentação do código
  239. fonte e
  240. 22 * geração automática de documentação externa.</li>
  241. 23 * </ul>
  242. 24 *
  243. 25 * <b>EXEMPLOS DE USO</b>
  244. 26 *
  245. 27 * Para obter o extenso de um número, utilize GExtenso::{@link numero}.
  246. 28 * <pre>
  247. 29 * echo GExtenso::numero(832); // oitocentos e trinta e dois
  248. * echo GExtenso::numero(832, GExtenso::GENERO_FEM) // oitocentas e trinta e duas
  249. 31 * </pre>
  250. 32 *
  251. 33 * Para obter o extenso de um valor monetário, utilize GExtenso::{@link moeda}.
  252. 34 * <pre>
  253. 35 * // IMPORTANTE: veja nota sobre o parâmetro 'valor' na documentação do método!
  254. 36 * echo GExtenso::moeda(15402); // cento e cinquenta e quatro reais e dois centavos
  255. 37 * echo GExtenso::moeda(47); // quarenta e sete centavos
  256. 38 * echo GExtenso::moeda(357082, 2,
  257. 39 * array('peseta', 'pesetas', GExtenso::GENERO_FEM),
  258. * array('cêntimo', 'cêntimos', GExtenso::GENERO_MASC));
  259. 41 * // três mil, quinhentas e setenta pesetas e oitenta e dois cêntimos
  260. 42 * </pre>
  261. 43 *
  262. 44 * @author Fausto Gonçalves Cintra (goncin) <goncin@gmail.com>
  263. 45 * @version 0.1 2010-03-02
  264. 46 * @package GUtils
  265. 47 *
  266. 48 */
  267. 49
  268. class GExtenso {
  269. 51
  270. 52 const NUM_SING = 0;
  271. 53 const NUM_PLURAL = 1;
  272. 54 const POS_GENERO = 2;
  273. 55 const GENERO_MASC = 0;
  274. 56 const GENERO_FEM = 1;
  275. 57
  276. 58 const VALOR_MAXIMO = 999999999;
  277. 59
  278.  
  279.  
  280. /* Uma vez que o PHP não suporta constantes de classe na forma de matriz (array),
  281. 61 a saída encontrada foi declarar as strings numéricas como 'private static'.
  282. 62 */
  283. 63
  284.  
  285.  
  286. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  287.  
  288. Page 10 of 15
  289.  
  290. /* As unidades 1 e 2 variam em gênero, pelo que precisamos de dois conjuntos de strings
  291.  
  292.  
  293. (masculinas e femininas) para as unidades */
  294.  
  295.  
  296. 65 private static $UNIDADES = array(
  297. 66 self::GENERO_MASC => array(
  298. 67 1 => 'um',
  299. 68 2 => 'dois',
  300. 69 3 => 'três',
  301. 70 4 => 'quatro',
  302. 71 5 => 'cinco',
  303. 72 6 => 'seis',
  304. 73 7 => 'sete',
  305. 74 8 => 'oito',
  306. 75 9 => 'nove'
  307. 76 ),
  308. 77 self::GENERO_FEM => array(
  309. 78 1 => 'uma',
  310. 79 2 => 'duas',
  311. 80 3 => 'três',
  312. 81 4 => 'quatro',
  313. 82 5 => 'cinco',
  314. 83 6 => 'seis',
  315. 84 7 => 'sete',
  316. 85 8 => 'oito',
  317. 86 9 => 'nove'
  318. 87 )
  319. 88 );
  320. 89
  321. 90 private static $DE11A19 = array(
  322. 91 11 => 'onze',
  323. 92 12 => 'doze',
  324. 93 13 => 'treze',
  325. 94 14 => 'quatorze',
  326. 95 15 => 'quinze',
  327. 96 16 => 'dezesseis',
  328. 97 17 => 'dezessete',
  329. 98 18 => 'dezoito',
  330. 99 19 => 'dezenove'
  331. 100 );
  332. 101
  333. 102 private static $DEZENAS = array(
  334. 103 10 => 'dez',
  335. 104 20 => 'vinte',
  336. 105 30 => 'trinta',
  337. 106 40 => 'quarenta',
  338. 107 50 => 'cinquenta',
  339. 108 60 => 'sessenta',
  340. 109 70 => 'setenta',
  341. 110 80 => 'oitenta',
  342. 111 90 => 'noventa'
  343. 112 );
  344. 113
  345. 114 private static $CENTENA_EXATA = 'cem';
  346. 115
  347. 116 /* As centenas, com exceção de 'cento', também variam em gênero. Aqui também se faz
  348. 117 necessário dois conjuntos de strings (masculinas e femininas).
  349. 118 */
  350. 119
  351. 120 private static $CENTENAS = array(
  352. 121 self::GENERO_MASC => array(
  353. 122 100 => 'cento',
  354. 123 200 => 'duzentos',
  355. 124 300 => 'trezentos',
  356. 125 400 => 'quatrocentos',
  357. 126 500 => 'quinhentos',
  358. 127 600 => 'seiscentos',
  359. 128 700 => 'setecentos',
  360. 129 800 => 'oitocentos',
  361. 130 900 => 'novecentos'
  362. 131 ),
  363. 132 self::GENERO_FEM => array(
  364. 133 100 => 'cento',
  365. 134 200 => 'duzentas',
  366. 135 300 => 'trezentas',
  367. 136 400 => 'quatrocentas',
  368. 137 500 => 'quinhentas',
  369. 138 600 => 'seiscentas',
  370. 139 700 => 'setecentas',
  371. 140 800 => 'oitocentas',
  372. 141 900 => 'novecentas'
  373. 142 )
  374.  
  375.  
  376. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  377.  
  378. Page 11 of 15
  379.  
  380. 143 );
  381. 144
  382. 145 /* 'Mil' é invariável, seja em gênero, seja em número */
  383. 146 private static $MILHAR = 'mil';
  384. 147
  385. 148 private static $MILHOES = array(
  386. 149 self::NUM_SING => 'milhão',
  387. 150 self::NUM_PLURAL => 'milhões'
  388. 151 );
  389. 152
  390. 153
  391. 154
  392. 155 /**
  393. 156 * Gera a representação por extenso de um número inteiro, maior que zero e menor ou igual a
  394. GExtenso::VALOR_MAXIMO.
  395. 157 *
  396. 158 * @param int O valor numérico cujo extenso se deseja gerar
  397. 159 *
  398. 160 * @param int (Opcional; valor padrão: GExtenso::GENERO_MASC) O gênero gramatical
  399. (GExtenso::GENERO_MASC ou GExtenso::GENERO_FEM)
  400. 161 * do extenso a ser gerado. Isso possibilita distinguir, por exemplo, entre 'duzentos e dois
  401. homens' e 'duzentas e duas mulheres'.
  402. 162 *
  403. 163 * @return string O número por extenso
  404. 164 *
  405. 165 * @since 0.1 2010-03-02
  406. 166 */
  407. 167 public static function numero($valor, $genero = self::GENERO_MASC) {
  408. 168
  409. 169 /* ----- VALIDAÇÃO DOS PARÂMETROS DE ENTRADA ---- */
  410. 170
  411. 171 if(!is_numeric($valor))
  412. 172 throw new Exception(" [Exceção em GExtenso::numero] Parâmetro \$valor não é numérico
  413. (recebido: '$valor')" );
  414. 173
  415. 174 else if($valor <= 0)
  416. 175 throw new Exception(" [Exceção em GExtenso::numero] Parâmetro \$valor igual a ou menor que
  417. zero (recebido: '$valor')" );
  418. 176
  419. 177 else if($valor > self::VALOR_MAXIMO)
  420. 178 throw new Exception('[Exceção em GExtenso::numero] Parâmetro $valor deve ser um inteiro entre 1
  421. e ' . self::VALOR_MAXIMO . " (recebido: '$valor')" );
  422. 179
  423. 180 else if($genero != self::GENERO_MASC && $genero != self::GENERO_FEM)
  424. 181 throw new Exception(" Exceção em GExtenso: valor incorreto para o parâmetro \$genero
  425. (recebido: '$genero')." );
  426. 182
  427. 183 /* ----------------------------------------------- */
  428. 184
  429. 185 else if($valor >= 1 && $valor <= 9)
  430. 186 return self::$UNIDADES[$genero][$valor]; // As unidades 'um' e 'dois' variam segundo o gênero
  431. 187
  432. 188 else if($valor == 10)
  433. 189 return self::$DEZENAS[$valor];
  434. 190
  435. 191 else if($valor >= 11 && $valor <= 19)
  436. 192 return self::$DE11A19[$valor];
  437. 193
  438. 194 else if($valor >= 20 && $valor <= 99) {
  439. 195 $dezena = $valor -($valor % 10);
  440. 196 $ret = self::$DEZENAS[$dezena];
  441. 197 /* Chamada recursiva à função para processar $resto se este for maior que zero.
  442. 198 * O conectivo 'e' é utilizado entre dezenas e unidades.
  443. 199 */
  444. 200 if($resto = $valor -$dezena) $ret .= ' e ' . self::numero($resto, $genero);
  445. 201 return $ret;
  446. 202 }
  447. 203
  448. 204 else if($valor == 100) {
  449. 205 return self::$CENTENA_EXATA;
  450. 206 }
  451. 207
  452. 208 else if($valor >= 101 && $valor <= 999) {
  453. 209 $centena = $valor -($valor % 100);
  454. 210 $ret = self::$CENTENAS[$genero][$centena]; // As centenas (exceto 'cento') variam em gênero
  455. 211 /* Chamada recursiva à função para processar $resto se este for maior que zero.
  456. 212 * O conectivo 'e' é utilizado entre centenas e dezenas.
  457. 213 */
  458. 214 if($resto = $valor -$centena) $ret .= ' e ' . self::numero($resto, $genero);
  459. 215 return $ret;
  460.  
  461.  
  462. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  463.  
  464. Page 12 of 15
  465.  
  466. 216 }
  467. 217
  468. 218 else if($valor >= 1000 && $valor <= 999999) {
  469. 219 /* A função 'floor' é utilizada para encontrar o inteiro da divisão de $valor por 1000,
  470. 220 * assim determinando a quantidade de milhares. O resultado é enviado a uma chamada recursiva
  471. 221 * da função. A palavra 'mil' não se flexiona.
  472. 222 */
  473. 223 $milhar = floor($valor / 1000);
  474. 224 $ret = self::numero($milhar, self::GENERO_MASC) . ' ' . self::$MILHAR; // 'Mil' é do gênero
  475.  
  476.  
  477. masculino
  478.  
  479.  
  480. 225 $resto = $valor % 1000;
  481. 226 /* Chamada recursiva à função para processar $resto se este for maior que zero.
  482. 227 * O conectivo 'e' é utilizado entre milhares e números entre 1 e 99, bem como antes de
  483. centenas exatas.
  484. 228 */
  485. 229 if($resto && (( $resto >= 1 && $resto <= 99) || $resto % 100 == 0))
  486. 230 $ret .= ' e ' . self::numero($resto, $genero);
  487. 231 /* Nos demais casos, após o milhar é utilizada a vírgula. */
  488. 232 else if ($resto)
  489. 233 $ret .= ', ' . self::numero($resto, $genero);
  490. 234 return $ret;
  491. 235 }
  492. 236
  493. 237 else if($valor >= 100000 && $valor <= self::VALOR_MAXIMO) {
  494. 238 /* A função 'floor' é utilizada para encontrar o inteiro da divisão de $valor por 1000000,
  495. 239 * assim determinando a quantidade de milhões. O resultado é enviado a uma chamada recursiva
  496. 240 * da função. A palavra 'milhão' flexiona-se no plural.
  497. 241 */
  498. 242 $milhoes = floor($valor / 1000000);
  499. 243 $ret = self::numero($milhoes, self::GENERO_MASC) . ' '; // Milhão e milhões são do gênero
  500.  
  501.  
  502. masculino
  503.  
  504.  
  505. 244
  506. 245 /* Se a o número de milhões for maior que 1, deve-se utilizar a forma flexionada no plural */
  507. 246 $ret .= $milhoes == 1 ? self::$MILHOES[self::NUM_SING] : self::$MILHOES[self::NUM_PLURAL];
  508. 247
  509. 248 $resto = $valor % 1000000;
  510. 249
  511. 250 /* Chamada recursiva à função para processar $resto se este for maior que zero.
  512. 251 * O conectivo 'e' é utilizado entre milhões e números entre 1 e 99, bem como antes de
  513. centenas exatas.
  514. 252 */
  515. 253 if($resto && (( $resto >= 1 && $resto <= 99) || $resto % 100 == 0))
  516. 254 $ret .= ' e ' . self::numero($resto, $genero);
  517. 255 /* Nos demais casos, após o milhão é utilizada a vírgula. */
  518. 256 else if ($resto)
  519. 257 $ret .= ', ' . self::numero($resto, $genero);
  520. 258 return $ret;
  521. 259 }
  522. 260
  523. 261 }
  524. 262
  525. 263 /**
  526. 264 * Gera a representação por extenso de um valor monetário, maior que zero e menor ou igual a
  527. GExtenso::VALOR_MAXIMO.
  528. 265 *
  529. 266 * @param int O valor monetário cujo extenso se deseja gerar.
  530. 267 * ATENÇÃO: PARA EVITAR OS CONHECIDOS PROBLEMAS DE ARREDONDAMENTO COM NÚMEROS DE PONTO FLUTUANTE, O
  531. VALOR DEVE SER PASSADO
  532. 268 * JÁ DEVIDAMENTE MULTIPLICADO POR 10 ELEVADO A $casasDecimais (o que equivale, normalmente, a
  533. passar o valor com centavos
  534. 269 * multiplicado por 100)
  535. 270 *
  536. 271 * @param int (Opcional; valor padrão: 2) Número de casas decimais a serem consideradas como parte
  537. fracionária (centavos)
  538. 272 *
  539. 273 * @param array (Opcional; valor padrão: array('real', 'reais', GExtenso::GENERO_MASC)) Fornece
  540. informações sobre a moeda a ser
  541. 274 * utilizada. O primeiro valor da matriz corresponde ao nome da moeda no singular, o segundo ao
  542. nome da moeda no plural e o terceiro
  543. 275 * ao gênero gramatical do nome da moeda (GExtenso::GENERO_MASC ou GExtenso::GENERO_FEM)
  544. 276 *
  545. 277 * @param array (Opcional; valor padrão: array('centavo', 'centavos', self::GENERO_MASC)) Provê
  546. informações sobre a parte fracionária
  547. 278 * da moeda. O primeiro valor da matriz corresponde ao nome da parte fracionária no singular, o
  548. segundo ao nome da parte fracionária no plural
  549. 279 * e o terceiro ao gênero gramatical da parte fracionária (GExtenso::GENERO_MASC ou
  550. GExtenso::GENERO_FEM)
  551. 280 *
  552. 281 * @return string O valor monetário por extenso
  553. 282 *
  554.  
  555.  
  556. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  557.  
  558. Page 13 of 15
  559.  
  560. 283 * @since 0.1 2010-03-02
  561. 284 */
  562. 285 public static function moeda(
  563. 286 $valor,
  564. 287 $casasDecimais = 2,
  565. 288 $infoUnidade = array('real', 'reais', self::GENERO_MASC),
  566. 289 $infoFracao = array('centavo', 'centavos', self::GENERO_MASC)
  567. 290 ) {
  568. 291
  569. 292 /* ----- VALIDAÇÃO DOS PARÂMETROS DE ENTRADA ---- */
  570. 293
  571. 294 if(!is_numeric($valor))
  572. 295 throw new Exception(" [Exceção em GExtenso::moeda] Parâmetro \$valor não é numérico
  573. (recebido: '$valor')" );
  574. 296
  575. 297 else if($valor <= 0)
  576. 298 throw new Exception(" [Exceção em GExtenso::moeda] Parâmetro \$valor igual a ou menor que
  577. zero (recebido: '$valor')" );
  578. 299
  579. 300 else if(!is_numeric($casasDecimais) || $casasDecimais < 0)
  580. 301 throw new Exception(" [Exceção em GExtenso::moeda] Parâmetro \$casasDecimais não é numérico
  581. ou é menor que zero (recebido: '$casasDecimais')" );
  582. 302
  583. 303 else if(!is_array($infoUnidade) || count($infoUnidade) < 3) {
  584. 304 $infoUnidade = print_r($infoUnidade, true);
  585. 305 throw new Exception(" [Exceção em GExtenso::moeda] Parâmetro \$infoUnidade não é uma matriz
  586. com 3 (três) elementos (recebido: '$infoUnidade')" );
  587. 306 }
  588. 307
  589. 308 else if($infoUnidade[self::POS_GENERO] != self::GENERO_MASC &&
  590. $infoUnidade[self::POS_GENERO] != self::GENERO_FEM)
  591. 309 throw new Exception(" Exceção em GExtenso: valor incorreto para o parâmetro
  592. \$infoUnidade[self::POS_GENERO] (recebido: '{$infoUnidade[self::POS_GENERO]}')." );
  593.  
  594.  
  595. 310
  596. 311 else if(!is_array($infoFracao) || count($infoFracao) < 3) {
  597. 312 $infoFracao = print_r($infoFracao, true);
  598. 313 throw new Exception(" [Exceção em GExtenso::moeda] Parâmetro \$infoFracao não é uma matriz
  599. com 3 (três) elementos (recebido: '$infoFracao')" );
  600. 314 }
  601. 315
  602. 316 else if($infoFracao[self::POS_GENERO] != self::GENERO_MASC &&
  603. $infoFracao[self::POS_GENERO] != self::GENERO_FEM)
  604. 317 throw new Exception(" Exceção em GExtenso: valor incorreto para o parâmetro
  605. \$infoFracao[self::POS_GENERO] (recebido: '{$infoFracao[self::POS_GENERO]}')." );
  606.  
  607.  
  608. 318
  609. 319 /* ----------------------------------------------- */
  610. 320
  611. 321 /* A parte inteira do valor monetário corresponde ao $valor passado dividido por 10 elevado a
  612. $casasDecimais, desprezado o resto.
  613. 322 * Assim, com o padrão de 2 $casasDecimais, o $valor será dividido por 100 (10^2), e o resto é
  614. descartado utilizando-se floor().
  615. 323 */
  616. 324 $parteInteira = floor($valor / pow(10, $casasDecimais));
  617. 325
  618. 326 /* A parte fracionária ('centavos'), por seu turno, corresponderá ao resto da divisão do $valor
  619. por 10 elevado a $casasDecimais.
  620. 327 * No cenário comum em que trabalhamos com 2 $casasDecimais, será o resto da divisão do $valor
  621. por 100 (10^2).
  622. 328 */
  623. 329 $fracao = $valor % pow(10, $casasDecimais);
  624. 330
  625. 331 /* O extenso para a $parteInteira somente será gerado se esta for maior que zero. Para tanto,
  626. utilizamos
  627. 332 * os préstimos do método GExtenso::numero().
  628. 333 */
  629. 334 if($parteInteira) {
  630. 335 $ret = self::numero($parteInteira, $infoUnidade[self::POS_GENERO]) . ' ';
  631. 336 $ret .= $parteInteira == 1 ? $infoUnidade[self::NUM_SING] : $infoUnidade[self::NUM_PLURAL];
  632. 337 }
  633. 338
  634. 339 /* De forma semelhante, o extenso da $fracao somente será gerado se esta for maior que zero. */
  635. 340 if($fracao) {
  636. 341 /* Se a $parteInteira for maior que zero, o extenso para ela já terá sido gerado. Antes de
  637. juntar os
  638. 342 * centavos, precisamos colocar o conectivo 'e'.
  639. 343 */
  640. 344 if ($parteInteira) $ret .= ' e ';
  641. 345 $ret .= self::numero($fracao, $infoFracao[self::POS_GENERO]) . ' ';
  642. 346 $ret .= $parteInteira == 1 ? $infoFracao[self::NUM_SING] : $infoFracao[self::NUM_PLURAL];
  643. 347 }
  644.  
  645.  
  646. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  647.  
  648. Page 14 of 15
  649.  
  650. 348
  651. 349 return $ret;
  652. 350
  653. 351 }
  654. 352
  655. 353 }
  656. 354 ?>
  657.  
  658.  
  659. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  660.  
  661. Page 15 of 15
  662.  
  663. Index
  664.  
  665.  
  666. G
  667.  
  668.  
  669. GExtenso::VALOR_MAXIMO 4
  670. GExtenso::moeda() 4
  671.  
  672. Gera a representação por extenso de um valor monetário, maior que zero e menor ou igual a
  673. GExtenso::VALOR_MAXIMO.
  674.  
  675. GExtenso::numero() 5
  676.  
  677. Gera a representação por extenso de um número inteiro, maior que zero e menor ou igual a
  678.  
  679. GExtenso::VALOR_MAXIMO.
  680. GExtenso.php 10
  681. Source code
  682. GExtenso::POS_GENERO 4
  683. GExtenso::NUM_SING 4
  684. GExtenso 3
  685.  
  686. GExtenso é uma classe que gera a representação por extenso de um número ou valor
  687. monetário.
  688.  
  689. GExtenso::GENERO_FEM 4
  690. GExtenso::GENERO_MASC 4
  691. GExtenso::NUM_PLURAL 4
  692. GExtenso.php 2
  693.  
  694. GExtenso class file
  695.  
  696. Generated by phpDocumentor v1.4.3 http://www.phpdoc.org - http://pear.php.net/package/PhpDocumentor - http://www.sourceforge.net/projects/phpdocu
  697.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement