public static Blocos GerarBlocos(string numeroTexto) { List<Centena> centenas = QuebrarCentenas(numeroTexto); var blocos = new Blocos(); for (int i = 0; i < centenas.Count; i++) { int ordem = centenas.Count - i; var bloco = new Bloco(centenas[i], ordem); blocos.Add(bloco); } return blocos; }
private static string ColocarSeparadorDeCentena(Bloco bloco, Blocos blocos) { // - Array do bloco atual int indiceBloco = blocos.IndexOf(bloco); // - Array do bloco atual bool primeiroBloco = indiceBloco == 0; // - Array do bloco atual bool ultimoBloco = indiceBloco == blocos.Count - 1; // - Não é o primeiro bloco, então haverá separador bool jaEstaPreenchido = indiceBloco > 0; // - Tem dezena zerada: Para não separar os blocos de centena em caso de: // - 1.000.200 = "um milhão e duzentos" // possui "e" // - 1.000.201 = "um milhão duzentos e um" // não possui "e" bool temDezenaZerada = bloco.Centena.Dezena.ToInt() == 0; // - Centena menor que cem: // - "mil e setenta" // possui "e" bool centenaMenorQueCem = bloco.Centena.ToInt() < 100; // - Todas as centenas pra frente estão zeradas, // acabou de descrever o número // - "um milhão" // "1.000.000" pára no primeiro bloco // - "um milhão e cem mil" // "1.100.000" pára no segundo bloco bool proximasCentenasZeradas = ProximasCentenasZeradas(blocos, indiceBloco); // - Bloco zerado é ignorado var blocoZerado = bloco.Centena.ToInt() == 0; if (blocoZerado) { return string.Empty; } // - O primeiro bloco não possui separados if (primeiroBloco) { return string.Empty; } // - Só possui um bloco então não precisa de separador var possuiApenasUmBloco = blocos.Count == 1; if (possuiApenasUmBloco) { return string.Empty; } // - Último bloco com valor, então o separador é "e" if (jaEstaPreenchido && (proximasCentenasZeradas || ultimoBloco)) { return " e "; } // - Último bloco com valor, então o separador é "e" if (jaEstaPreenchido) { return ", "; } var sb = new StringBuilder(); sb.AppendLine("Regra para SEPARADOR não encontrada!"); sb.AppendLine(blocos.ToString()); sb.AppendFormat("bloco atual:{0}", bloco); throw new Exception(sb.ToString()); }
public static string SufixoDe(Bloco bloco) { int centenaNum = bloco.Centena.ToInt(); if (centenaNum == 0) { return(string.Empty); } bool plural = centenaNum > 1; switch (bloco.Ordem) { case 1: return(string.Empty); case 2: return("mil"); case 3: if (plural) { return("milhões"); } return("milhão"); case 4: if (plural) { return("bilhões"); } return("bilhão"); case 5: if (plural) { return("trilhões"); } return("trilhão"); case 6: if (plural) { return("quatrilhões"); } return("quatrilhão"); case 7: if (plural) { return("quintilhões"); } return("quintilhão"); case 8: if (plural) { return("sextilhões"); } return("sextilhão"); case 9: if (plural) { return("septilhões"); } return("septilhão"); case 10: if (plural) { return("octilhões"); } return("octilhão"); case 11: if (plural) { return("nonilhões"); } return("nonilhão"); case 12: if (plural) { return("decilhões"); } return("decilhão"); case 13: if (plural) { return("undecilhões"); } return("undecilhão"); case 14: if (plural) { return("doudecilhões"); } return("doudecilhão"); case 15: if (plural) { return("tredecilhões"); } return("tredecilhão"); default: throw new Exception(string.Format("classe númerica não suportada: {0}", bloco.Ordem)); } }
public static string SufixoDe(Bloco bloco) { int centenaNum = bloco.Centena.ToInt(); if (centenaNum == 0) { return string.Empty; } bool plural = centenaNum > 1; switch (bloco.Ordem) { case 1: return string.Empty; case 2: return "mil"; case 3: if (plural) return "milhões"; return "milhão"; case 4: if (plural) return "bilhões"; return "bilhão"; case 5: if (plural) return "trilhões"; return "trilhão"; case 6: if (plural) return "quatrilhões"; return "quatrilhão"; case 7: if (plural) return "quintilhões"; return "quintilhão"; case 8: if (plural) return "sextilhões"; return "sextilhão"; case 9: if (plural) return "septilhões"; return "septilhão"; case 10: if (plural) return "octilhões"; return "octilhão"; case 11: if (plural) return "nonilhões"; return "nonilhão"; case 12: if (plural) return "decilhões"; return "decilhão"; case 13: if (plural) return "undecilhões"; return "undecilhão"; case 14: if (plural) return "doudecilhões"; return "doudecilhão"; case 15: if (plural) return "tredecilhões"; return "tredecilhão"; default: throw new Exception(string.Format("classe númerica não suportada: {0}", bloco.Ordem)); } }
private static string ColocarSeparadorDeCentena(Bloco bloco, Blocos blocos) { // - Array do bloco atual int indiceBloco = blocos.IndexOf(bloco); // - Array do bloco atual bool primeiroBloco = indiceBloco == 0; // - Array do bloco atual bool ultimoBloco = indiceBloco == blocos.Count - 1; // - Não é o primeiro bloco, então haverá separador bool jaEstaPreenchido = indiceBloco > 0; // - Tem dezena zerada: Para não separar os blocos de centena em caso de: // - 1.000.200 = "um milhão e duzentos" // possui "e" // - 1.000.201 = "um milhão duzentos e um" // não possui "e" bool temDezenaZerada = bloco.Centena.Dezena.ToInt() == 0; // - Centena menor que cem: // - "mil e setenta" // possui "e" bool centenaMenorQueCem = bloco.Centena.ToInt() < 100; // - Todas as centenas pra frente estão zeradas, // acabou de descrever o número // - "um milhão" // "1.000.000" pára no primeiro bloco // - "um milhão e cem mil" // "1.100.000" pára no segundo bloco bool proximasCentenasZeradas = ProximasCentenasZeradas(blocos, indiceBloco); // - Bloco zerado é ignorado var blocoZerado = bloco.Centena.ToInt() == 0; if (blocoZerado) { return(string.Empty); } // - O primeiro bloco não possui separados if (primeiroBloco) { return(string.Empty); } // - Só possui um bloco então não precisa de separador var possuiApenasUmBloco = blocos.Count == 1; if (possuiApenasUmBloco) { return(string.Empty); } // - Último bloco com valor, então o separador é "e" if (jaEstaPreenchido && (proximasCentenasZeradas || ultimoBloco)) { return(" e "); } // - Último bloco com valor, então o separador é "e" if (jaEstaPreenchido) { return(", "); } var sb = new StringBuilder(); sb.AppendLine("Regra para SEPARADOR não encontrada!"); sb.AppendLine(blocos.ToString()); sb.AppendFormat("bloco atual:{0}", bloco); throw new Exception(sb.ToString()); }