public int Add(string numbers)
        {
            if (ContainsNoNumbers(numbers))
            {
                return(0);
            }

            if (ContainsASingleNumber(numbers))
            {
                return(GetSingleNumber(numbers));
            }

            var formattedNumbers = new FormattedNumberString(numbers);

            var negativeNumbers = new NegativeNumbers(formattedNumbers);

            if (negativeNumbers.HasAny())
            {
                throw new NegativeException($"Negatives not allowed, {negativeNumbers}");
            }

            return(new Calculator(formattedNumbers).GetTotal());
        }
示例#2
0
        /// <summary>

        /// Converts numbers to words

        /// </summary>

        /// <param name="number"></param>

        /// <returns></returns>

        public static string NumberToWords(decimal number, string moneda)
        {
            if (number > 999999999)
            {
                return("Numero demasiado grande");
            }


            StringBuilder Words;
            string        FormattedNumberString;
            int           decimalSeparatorLocation;
            int           millionsPart;
            int           thousandsPart;
            int           hundredsPart;
            int           decimalsPart;
            int           hundreds;
            int           tens;
            int           units;
            int           ActualNumber = 0;



            Words = new StringBuilder();
            FormattedNumberString = number.ToString("000000000.00");
            char DecimalSeparator = Convert.ToChar((Convert.ToString(1.1)).Trim().Substring(1, 1));

            decimalSeparatorLocation = FormattedNumberString.IndexOf(DecimalSeparator);
            millionsPart             = Convert.ToInt32(FormattedNumberString.Substring(0, 3));
            thousandsPart            = Convert.ToInt32(FormattedNumberString.Substring(3, 3));
            hundredsPart             = Convert.ToInt32(FormattedNumberString.Substring(6, 3));
            decimalsPart             = Convert.ToInt32(FormattedNumberString.Substring(decimalSeparatorLocation + 1, 2));

            moneda = moneda.ToLower();

            for (int NumberPart = 1; NumberPart <= 4; NumberPart++)
            {
                switch (NumberPart)
                {
                case 1:
                {
                    ActualNumber = millionsPart;
                    if (millionsPart == 1)
                    {
                        Words.Append(_oneMillionWord);
                        Words.Append(' ');
                        continue;
                    }
                    break;
                }

                case 2:
                {
                    ActualNumber = thousandsPart;
                    if (millionsPart != 1 && millionsPart != 0)
                    {
                        Words.Append(_millionsWord);
                        Words.Append(' ');
                    }
                    if (thousandsPart == 1)
                    {
                        Words.Append(_oneThousandWord);
                        Words.Append(' ');
                        continue;
                    }
                    break;
                }

                case 3:
                {
                    ActualNumber = hundredsPart;
                    if (thousandsPart != 1 && thousandsPart != 0)
                    {
                        Words.Append(_thousandWord);
                        Words.Append(' ');
                    }
                    break;
                }

                case 4:
                {
                    ActualNumber = decimalsPart;
                    if (decimalsPart != 0)
                    {
                        if (millionsPart == 0 && thousandsPart == 0 && hundredsPart == 0)
                        {
                            Words.Append(moneda);
                            Words.Append(' ');
                            Words.Append(_zeroWithWord);
                            Words.Append(' ');
                        }
                        else
                        {
                            Words.Append(moneda);
                            Words.Append(' ');
                            Words.Append(_withWord);
                            Words.Append(' ');
                        }
                    }
                    else
                    {
                        Words.Append(moneda);
                    }
                    break;
                }
                }
                hundreds = (int)(ActualNumber / 100);
                tens     = (int)(ActualNumber - hundreds * 100) / 10;
                units    = (int)(ActualNumber - (hundreds * 100 + tens * 10));
                if (ActualNumber == 0)
                {
                    continue;
                }
                if (ActualNumber == 100)
                {
                    Words.Append(_hundredWord);
                    Words.Append(' ');
                    continue;
                }
                else
                {
                    if (ActualNumber == 101 && NumberPart != 3)
                    {
                        Words.Append(_oneHundredWord);
                        Words.Append(' ');
                        continue;
                    }
                    else
                    {
                        if (ActualNumber > 100)
                        {
                            Words.Append(_numbersInWords[hundreds + 35]);
                            Words.Append(' ');
                        }
                    }
                }
                if (tens < 3 && tens != 0)
                {
                    Words.Append(_numbersInWords[tens * 10 + units - 1]);
                    Words.Append(' ');
                }
                else
                {
                    if (tens > 2)
                    {
                        Words.Append(_numbersInWords[tens + 26]);
                        Words.Append(' ');
                        if (units == 0)
                        {
                            continue;
                        }
                        Words.Append(_andWord);
                        Words.Append(' ');
                        Words.Append(_numbersInWords[units - 1]);
                        Words.Append(' ');
                    }
                    else
                    {
                        if (tens == 0 && units != 0)
                        {
                            Words.Append(_numbersInWords[units - 1]);
                            Words.Append(' ');
                        }
                    }
                }
            }             // end for
            if (decimalsPart != 0)
            {
                Words.Append(_centWord);
            }
            // Resolve particular problems here.
            Words.Replace("uno mil", "un mil");
            return(Words.ToString().Trim());
        }