コード例 #1
0
ファイル: FabricaBlocos.cs プロジェクト: saitodisse/extenso
        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;
        }
コード例 #2
0
ファイル: NumeroExtenso.cs プロジェクト: saitodisse/extenso
        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());
        }
コード例 #3
0
ファイル: ClasseNumerica.cs プロジェクト: soaresbest/extenso
        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));
            }
        }
コード例 #4
0
ファイル: ClasseNumerica.cs プロジェクト: soaresbest/extenso
        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));
            }
        }
コード例 #5
0
ファイル: NumeroExtenso.cs プロジェクト: soaresbest/extenso
        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());
        }