Classe para conversão de valores em extenso


/ Published in: C#
Save to your folder(s)

Classe com método para conversão de porcentagem %, valor em Reais R$, e decimal em extenso.


Copy this code and paste it in your HTML
  1. public static class Extenso
  2. {
  3. public enum TipoValorExtenso
  4. {
  5. Monetario,
  6. Porcentagem,
  7. Decimal
  8. }
  9.  
  10. public static string toExtenso(double Valor, TipoValorExtenso tipoValorExtenso)
  11. {
  12. decimal valorEscrever = new decimal(Valor);
  13.  
  14. return toExtenso(valorEscrever, tipoValorExtenso);
  15. }
  16.  
  17. // O método toExtenso recebe um valor do tipo decimal
  18. public static string toExtenso(decimal valor, TipoValorExtenso tipoValorExtenso)
  19. {
  20. if (valor <= 0 | valor >= 1000000000000000)
  21. throw new ArgumentOutOfRangeException("Valor não suportado pelo sistema. Valor: " + valor);
  22.  
  23. string strValor = String.Empty;
  24. strValor = valor.ToString("000000000000000.00#");
  25. //strValor = valor.ToString("{0:0.00#}");
  26. string valor_por_extenso = string.Empty;
  27. int qtdCasasDecimais =
  28. strValor.Substring(strValor.IndexOf(',') + 1, strValor.Length - (strValor.IndexOf(',') + 1)).Length;
  29. bool existemValoresAposDecimal = Convert.ToInt32(strValor.Substring(16, qtdCasasDecimais)) > 0;
  30.  
  31. for (int i = 0; i <= 15; i += 3)
  32. {
  33. var parte = strValor.Substring(i, 3);
  34. // se parte contém vírgula, pega a substring com base na quantidade de casas decimais.
  35. if (parte.Contains(','))
  36. {
  37. parte = strValor.Substring(i+1, qtdCasasDecimais);
  38. }
  39. valor_por_extenso += escreva_parte(Convert.ToDecimal(parte));
  40. if (i == 0 & valor_por_extenso != string.Empty)
  41. {
  42. if (Convert.ToInt32(strValor.Substring(0, 3)) == 1)
  43. valor_por_extenso += " TRILHÃO" +
  44. ((Convert.ToDecimal(strValor.Substring(3, 12)) > 0)
  45. ? " E "
  46. : string.Empty);
  47. else if (Convert.ToInt32(strValor.Substring(0, 3)) > 1)
  48. valor_por_extenso += " TRILHÕES" +
  49. ((Convert.ToDecimal(strValor.Substring(3, 12)) > 0)
  50. ? " E "
  51. : string.Empty);
  52. }
  53. else if (i == 3 & valor_por_extenso != string.Empty)
  54. {
  55. if (Convert.ToInt32(strValor.Substring(3, 3)) == 1)
  56. valor_por_extenso += " BILHÃO" +
  57. ((Convert.ToDecimal(strValor.Substring(6, 9)) > 0)
  58. ? " E "
  59. : string.Empty);
  60. else if (Convert.ToInt32(strValor.Substring(3, 3)) > 1)
  61. valor_por_extenso += " BILHÕES" +
  62. ((Convert.ToDecimal(strValor.Substring(6, 9)) > 0)
  63. ? " E "
  64. : string.Empty);
  65. }
  66. else if (i == 6 & valor_por_extenso != string.Empty)
  67. {
  68. if (Convert.ToInt32(strValor.Substring(6, 3)) == 1)
  69. valor_por_extenso += " MILHÃO" +
  70. ((Convert.ToDecimal(strValor.Substring(9, 6)) > 0)
  71. ? " E "
  72. : string.Empty);
  73. else if (Convert.ToInt32(strValor.Substring(6, 3)) > 1)
  74. valor_por_extenso += " MILHÕES" +
  75. ((Convert.ToDecimal(strValor.Substring(9, 6)) > 0)
  76. ? " E "
  77. : string.Empty);
  78. }
  79. else if (i == 9 & valor_por_extenso != string.Empty)
  80. if (Convert.ToInt32(strValor.Substring(9, 3)) > 0)
  81. valor_por_extenso += " MIL" +
  82. ((Convert.ToDecimal(strValor.Substring(12, 3)) > 0)
  83. ? " E "
  84. : string.Empty);
  85.  
  86. if (i == 12)
  87. {
  88. if (valor_por_extenso.Length > 8)
  89. if (valor_por_extenso.Substring(valor_por_extenso.Length - 6, 6) == "BILHÃO" |
  90. valor_por_extenso.Substring(valor_por_extenso.Length - 6, 6) == "MILHÃO")
  91. valor_por_extenso += " DE";
  92. else if (valor_por_extenso.Substring(valor_por_extenso.Length - 7, 7) == "BILHÕES" |
  93. valor_por_extenso.Substring(valor_por_extenso.Length - 7, 7) == "MILHÕES" |
  94. valor_por_extenso.Substring(valor_por_extenso.Length - 8, 7) == "TRILHÕES")
  95. valor_por_extenso += " DE";
  96. else if (valor_por_extenso.Substring(valor_por_extenso.Length - 8, 8) == "TRILHÕES")
  97. valor_por_extenso += " DE";
  98.  
  99. if (Convert.ToInt64(strValor.Substring(0, 15)) == 1)
  100. {
  101. switch (tipoValorExtenso)
  102. {
  103. case TipoValorExtenso.Monetario:
  104. valor_por_extenso += " REAL";
  105. break;
  106. case TipoValorExtenso.Porcentagem:
  107. if (existemValoresAposDecimal == false)
  108. valor_por_extenso += " PORCENTO";
  109. break;
  110. case TipoValorExtenso.Decimal:
  111. break;
  112. default:
  113. throw new ArgumentOutOfRangeException("tipoValorExtenso");
  114. }
  115. }
  116.  
  117. else if (Convert.ToInt64(strValor.Substring(0, 15)) > 1)
  118. {
  119. switch (tipoValorExtenso)
  120. {
  121. case TipoValorExtenso.Monetario:
  122. valor_por_extenso += " REAIS";
  123. break;
  124. case TipoValorExtenso.Porcentagem:
  125. if (existemValoresAposDecimal == false)
  126. valor_por_extenso += " PORCENTO";
  127. break;
  128. case TipoValorExtenso.Decimal:
  129. break;
  130. default:
  131. throw new ArgumentOutOfRangeException("tipoValorExtenso");
  132. }
  133. }
  134.  
  135. if (Convert.ToInt32(strValor.Substring(16, 2)) > 0 && valor_por_extenso != string.Empty)
  136. {
  137. switch (tipoValorExtenso)
  138. {
  139. case TipoValorExtenso.Monetario:
  140. valor_por_extenso += " E ";
  141. break;
  142. case TipoValorExtenso.Porcentagem:
  143. valor_por_extenso += " VÍRGULA ";
  144. break;
  145. case TipoValorExtenso.Decimal:
  146. break;
  147. default:
  148. throw new ArgumentOutOfRangeException("tipoValorExtenso");
  149. }
  150. }
  151. }
  152.  
  153. if (i == 15)
  154. if (Convert.ToInt32(strValor.Substring(16, qtdCasasDecimais)) == 1)
  155. {
  156. switch (tipoValorExtenso)
  157. {
  158. case TipoValorExtenso.Monetario:
  159. valor_por_extenso += " CENTAVO";
  160. break;
  161. case TipoValorExtenso.Porcentagem:
  162. valor_por_extenso += " CENTAVO";
  163. break;
  164. case TipoValorExtenso.Decimal:
  165. break;
  166. default:
  167. throw new ArgumentOutOfRangeException("tipoValorExtenso");
  168. }
  169. }
  170.  
  171. else if (Convert.ToInt32(strValor.Substring(16, qtdCasasDecimais)) > 1)
  172. {
  173. switch (tipoValorExtenso)
  174. {
  175. case TipoValorExtenso.Monetario:
  176. valor_por_extenso += " CENTAVOS";
  177. break;
  178. case TipoValorExtenso.Porcentagem:
  179. valor_por_extenso += " PORCENTO";
  180. break;
  181. case TipoValorExtenso.Decimal:
  182. break;
  183. default:
  184. throw new ArgumentOutOfRangeException("tipoValorExtenso");
  185. }
  186. }
  187. }
  188. return valor_por_extenso;
  189. }
  190.  
  191. private static string escreva_parte(decimal valor)
  192. {
  193. if (valor <= 0)
  194. return string.Empty;
  195. else
  196. {
  197. string montagem = string.Empty;
  198. if (valor > 0 & valor < 1)
  199. {
  200. valor *= 100;
  201. }
  202. string strValor = valor.ToString("000");
  203. int a = Convert.ToInt32(strValor.Substring(0, 1));
  204. int b = Convert.ToInt32(strValor.Substring(1, 1));
  205. int c = Convert.ToInt32(strValor.Substring(2, 1));
  206.  
  207. if (a == 1) montagem += (b + c == 0) ? "CEM" : "CENTO";
  208. else if (a == 2) montagem += "DUZENTOS";
  209. else if (a == 3) montagem += "TREZENTOS";
  210. else if (a == 4) montagem += "QUATROCENTOS";
  211. else if (a == 5) montagem += "QUINHENTOS";
  212. else if (a == 6) montagem += "SEISCENTOS";
  213. else if (a == 7) montagem += "SETECENTOS";
  214. else if (a == 8) montagem += "OITOCENTOS";
  215. else if (a == 9) montagem += "NOVECENTOS";
  216.  
  217. if (b == 1)
  218. {
  219. if (c == 0) montagem += ((a > 0) ? " E " : string.Empty) + "DEZ";
  220. else if (c == 1) montagem += ((a > 0) ? " E " : string.Empty) + "ONZE";
  221. else if (c == 2) montagem += ((a > 0) ? " E " : string.Empty) + "DOZE";
  222. else if (c == 3) montagem += ((a > 0) ? " E " : string.Empty) + "TREZE";
  223. else if (c == 4) montagem += ((a > 0) ? " E " : string.Empty) + "QUATORZE";
  224. else if (c == 5) montagem += ((a > 0) ? " E " : string.Empty) + "QUINZE";
  225. else if (c == 6) montagem += ((a > 0) ? " E " : string.Empty) + "DEZESSEIS";
  226. else if (c == 7) montagem += ((a > 0) ? " E " : string.Empty) + "DEZESSETE";
  227. else if (c == 8) montagem += ((a > 0) ? " E " : string.Empty) + "DEZOITO";
  228. else if (c == 9) montagem += ((a > 0) ? " E " : string.Empty) + "DEZENOVE";
  229. }
  230. else if (b == 2) montagem += ((a > 0) ? " E " : string.Empty) + "VINTE";
  231. else if (b == 3) montagem += ((a > 0) ? " E " : string.Empty) + "TRINTA";
  232. else if (b == 4) montagem += ((a > 0) ? " E " : string.Empty) + "QUARENTA";
  233. else if (b == 5) montagem += ((a > 0) ? " E " : string.Empty) + "CINQUENTA";
  234. else if (b == 6) montagem += ((a > 0) ? " E " : string.Empty) + "SESSENTA";
  235. else if (b == 7) montagem += ((a > 0) ? " E " : string.Empty) + "SETENTA";
  236. else if (b == 8) montagem += ((a > 0) ? " E " : string.Empty) + "OITENTA";
  237. else if (b == 9) montagem += ((a > 0) ? " E " : string.Empty) + "NOVENTA";
  238.  
  239. if (strValor.Substring(1, 1) != "1" & c != 0 & montagem != string.Empty) montagem += " E ";
  240.  
  241. if (strValor.Substring(1, 1) != "1")
  242. if (c == 1) montagem += "UM";
  243. else if (c == 2) montagem += "DOIS";
  244. else if (c == 3) montagem += "TRÊS";
  245. else if (c == 4) montagem += "QUATRO";
  246. else if (c == 5) montagem += "CINCO";
  247. else if (c == 6) montagem += "SEIS";
  248. else if (c == 7) montagem += "SETE";
  249. else if (c == 8) montagem += "OITO";
  250. else if (c == 9) montagem += "NOVE";
  251.  
  252. return montagem;
  253. }
  254. }
  255. }

URL: http:\\www.gabrielrb.net

Report this snippet


Comments

RSS Icon Subscribe to comments

You need to login to post a comment.