通俗易懂的单词拼写问题 [英] Currency to words mispelling problems

查看:93
本文介绍了通俗易懂的单词拼写问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是下面的代码,用于将数字转换为单词。到底是什么问题?一切都用英语写得很好,但在我的国家(罗马尼亚),有几个不同的拼写让我们在几个例子中说明清楚:

This is the code below for converting numbers to words. What is the exactly problem ? Everything is great in English but in my country (Romania) there is different spelling let's make that clear in a few examples :

Ex。 1-英语,一美元,一千,一百,两百,这就是您写
的方式罗马尼亚语,联合国美元,O mie,O suta,Doua Sute,Trei Sute,在单词上有一个复数形式,在英语,几乎在罗马尼亚,您会用到One来完成所有更改,而我不知道如何解决这种复数形式。谢谢

Ex. 1 - English, One dollar,One thousand, One hundred, Two hundred that's how you write Romanian, Un dollar, O mie, O suta, Doua Sute, Trei Sute, there is a plural changing on the words, In English you use One for everything almost in Romanian this changes and I don't know how to fix it this plural.Thank you

private static string[] _ones =
            {
                "",
                "unu",
                "doua",
                "trei",
                "patru",
                "cinci",
                "sase",
                "sapte",
                "opt",
                "noua"
            };

            private static string[] _teens =
            {
                "zece",
                "unsprezece",
                "doisprezece",
                "treisprezece",
                "paisprezece",
                "cincisprezece",
                "saisprezece",
                "saptisprezece",
                "optsprezece",
                "nouasprezece"
            };

            private static string[] _tens =
            {
                "",
                "zece",
                "douazeci",
                "treizeci",
                "patruzeci",
                "cincizeci",
                "saizeci",
                "saptezeci",
                "optzeci",
                "nouazeci"
            };

            // US Nnumbering:
            private static string[] _thousands =
            {
                "",
                "mie",
                "milion",
                "miliard",
                "trilion",
                "catralion"
            };
    string digits, temp;
                bool showThousands = false;
                bool allZeros = true;

                // Use StringBuilder to build result
                StringBuilder builder = new StringBuilder();
                // Convert integer portion of value to string
                digits = ((long)value).ToString();
                // Traverse characters in reverse order
                for (int i = digits.Length - 1; i >= 0; i--)
                {
                    int ndigit = (int)(digits[i] - '0');
                    int column = (digits.Length - (i + 1));

                    // Determine if ones, tens, or hundreds column
                    switch (column % 3)
                    {
                        case 0:        // Ones position
                            showThousands = true;
                            if (i == 0)
                            {
                                // First digit in number (last in loop)
                                temp = String.Format("{0} ", _ones[ndigit]);
                            }
                            else if (digits[i - 1] == '1')
                            {
                                // This digit is part of "teen" value
                                temp = String.Format("{0} ", _teens[ndigit]);
                                // Skip tens position
                                i--;
                            }
                            else if (ndigit != 0)
                            {
                                // Any non-zero digit
                                temp = String.Format("{0} ", _ones[ndigit]);
                            }
                            else
                            {
                                // This digit is zero. If digit in tens and hundreds
                                // column are also zero, don't show "thousands"
                                temp = String.Empty;
                                // Test for non-zero digit in this grouping
                                if (digits[i - 1] != '0' || (i > 1 && digits[i - 2] != '0'))
                                    showThousands = true;
                                else
                                    showThousands = false;
                            }

                            // Show "thousands" if non-zero in grouping
                            if (showThousands)
                            {
                                if (column > 0)
                                {
                                    temp = String.Format("{0}{1}{2}",
                                        temp,
                                        _thousands[column / 3],
                                        allZeros ? " " : ", ");
                                }
                                // Indicate non-zero digit encountered
                                allZeros = false;
                            }
                            builder.Insert(0, temp);
                            break;

                        case 1:        // Tens column
                            if (ndigit > 0)
                            {
                                temp = String.Format("{0}{1}",
                                    _tens[ndigit],
                                    (digits[i + 1] != '0') ? " si " : " ");
                                builder.Insert(0, temp);
                            }
                            break;

                        case 2:        // Hundreds column
                            if (ndigit > 0)
                            {
                                temp = String.Format("{0} sute ", _ones[ndigit]);
                                builder.Insert(0, temp);
                            }
                            break;
                    }
                }

                builder.AppendFormat("lei si {0:00} bani", (value - (long)value) * 100);


                // Capitalize first letter
                return String.Format("{0}{1}",
                    Char.ToUpper(builder[0]),
                    builder.ToString(1, builder.Length - 1));


推荐答案

您已经说过,只有两种可能的条件成千上万:

You've stated there are only 2 possible conditions for hundreds and thousands:


数百:1 = suta /大于1 = sute

Hundreds: 1 = suta / more than 1 = sute

:1 = mie /大于1 = mii

Thousands: 1 = mie / more than 1 = mii

在两种情况下,如果为单数,则为 o;使用 Unu代替 unu。表示一个

In both cases, if singular, then "o" is used instead of "unu" to mean "one"

基于此,您可以轻松地在代码中添加正确的条件。

Based on this you can easily add the right conditions in the code.

我个人将重构该代码,但是由于这不是重点,因此我为您提供了一个解决方案。

I personally would refactor this code but since that's not the point here, I've included a solution for you.

数百个:

而不是

case 2:        // Hundreds column
    if (ndigit > 0)
    {
        temp = String.Format("{0} sute ", _ones[ndigit]);
        builder.Insert(0, temp);
    }

添加条件以检查数字并使用sute或suta:

Add the condition to check on digit and use sute or suta:

case 2:        // Hundreds column
    if (ndigit > 0)
    {
        temp = String.Format("{0} {1} ", ndigit == 1 ? "o" : _ones[ndigit], ndigit == 1 ? "suta" : "sute");
        builder.Insert(0, temp);
    }

数千

...

// Show "thousands" if non-zero in grouping
if (showThousands)
{
    if (column > 0)
    {
        temp = String.Format("{0}{1}{2}",
            temp,
            _thousands[column / 3],
            allZeros ? " " : ", ");
    }
    // Indicate non-zero digit encountered
    allZeros = false;
}

应为:

// Show "thousands" if non-zero in grouping
if (showThousands)
{
    if (column > 0)
    {
        bool isFirstThoussand = _thousands[column / 3] == _thousands[1] && ndigit == 1;

        temp = String.Format("{0}{1}{2}",
        isFirstThoussand ? "o " : temp,
        isFirstThoussand ? _thousands[1] : "mii",
        allZeros ? " " : ", ");
    }
    // Indicate non-zero digit encountered
    allZeros = false;
}

...

这将产生所需的结果

这是您的整个代码(包含此答案的更新)和一些测试内容:

Here's your whole code (with the updates from this answer) and some test stuff:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RomanianNumberToWords
{
    class Program
    {
        private static string[] _ones =
        {
            "",
            "unu",
            "doua",
            "trei",
            "patru",
            "cinci",
            "sase",
            "sapte",
            "opt",
            "noua"
        };

        private static string[] _teens =
        {
            "zece",
            "unsprezece",
            "doisprezece",
            "treisprezece",
            "paisprezece",
            "cincisprezece",
            "saisprezece",
            "saptisprezece",
            "optsprezece",
            "nouasprezece"
        };

        private static string[] _tens =
        {
            "",
            "zece",
            "douazeci",
            "treizeci",
            "patruzeci",
            "cincizeci",
            "saizeci",
            "saptezeci",
            "optzeci",
            "nouazeci"
        };

        // US Nnumbering:
        private static string[] _thousands =
        {
            "",
            "mie",
            "milion",
            "miliard",
            "trilion",
            "catralion"
        };

        
        static string MakeWordFromNumbers(decimal value)
        {
            string digits, temp;
            bool showThousands = false;
            bool allZeros = true;

            // Use StringBuilder to build result
            StringBuilder builder = new StringBuilder();
            // Convert integer portion of value to string
            digits = ((long)value).ToString();
            // Traverse characters in reverse order
            for (int i = digits.Length - 1; i >= 0; i--)
            {
                int ndigit = (int)(digits[i] - '0');
                int column = (digits.Length - (i + 1));

                // Determine if ones, tens, or hundreds column
                switch (column % 3)
                {
                    case 0:        // Ones position
                        showThousands = true;
                        if (i == 0)
                        {
                            // First digit in number (last in loop)
                            temp = String.Format("{0} ", _ones[ndigit]);
                        }
                        else if (digits[i - 1] == '1')
                        {
                            // This digit is part of "teen" value
                            temp = String.Format("{0} ", _teens[ndigit]);
                            // Skip tens position
                            i--;
                        }
                        else if (ndigit != 0)
                        {
                            // Any non-zero digit
                            temp = String.Format("{0} ", _ones[ndigit]);
                        }
                        else
                        {
                            // This digit is zero. If digit in tens and hundreds
                            // column are also zero, don't show "thousands"
                            temp = String.Empty;
                            // Test for non-zero digit in this grouping
                            if (digits[i - 1] != '0' || (i > 1 && digits[i - 2] != '0'))
                                showThousands = true;
                            else
                                showThousands = false;
                        }

                        // Show "thousands" if non-zero in grouping
                        if (showThousands)
                        {
                            if (column > 0)
                            {
                                bool isFirstThoussand = _thousands[column / 3] == _thousands[1] && ndigit == 1;

                                temp = String.Format("{0}{1}{2}",
                                    isFirstThoussand ? "o " : temp,
                                    isFirstThoussand ? _thousands[1] : "mii",
                                    allZeros ? " " : ", ");
                            }
                            // Indicate non-zero digit encountered
                            allZeros = false;
                        }
                        builder.Insert(0, temp);
                        break;

                    case 1:        // Tens column
                        if (ndigit > 0)
                        {
                            temp = String.Format("{0}{1}",
                                _tens[ndigit],
                                (digits[i + 1] != '0') ? " si " : " ");
                            builder.Insert(0, temp);
                        }
                        break;

                    case 2:        // Hundreds column
                        if (ndigit > 0)
                        {
                            temp = String.Format("{0} {1} ", ndigit == 1 ? "o" : _ones[ndigit], ndigit == 1 ? "suta" : "sute");
                            builder.Insert(0, temp);
                        }
                        break;
                }
            }

            // You always need "lei" right?
            builder.AppendFormat("lei");

            // This code simply divides the decimal value by 1; and only adds "si NN bani" if there's a remainder
            if (Decimal.Remainder(value, 1) > 0) {
                builder.AppendFormat(" si {0:00} bani", (value - (long)value) * 100);
            }

            // Capitalize first letter
            return String.Format("{0}{1}",
                Char.ToUpper(builder[0]),
                builder.ToString(1, builder.Length - 1));
        }

        static void Main(string[] args)
        {
            Console.WriteLine(MakeWordFromNumbers(1127.00M));
            Console.WriteLine(MakeWordFromNumbers(2227.00M));

            Console.WriteLine(MakeWordFromNumbers(127.00M));
            Console.WriteLine(MakeWordFromNumbers(227.00M));

            Console.ReadKey();
        }

    }    
}

这篇关于通俗易懂的单词拼写问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆