7

有谁知道将“第一个”、“第十个”和“百分之一”等单词转换为等效数字的方法?

样本:“第一”-> 1、“第二”-> 2、“第十”-> 10、“第一百”-> 100

任何算法都可以,但我是用 C# 编写的。

编辑

它不漂亮,一次只能用一个词,但它适合我的目的。也许有人可以改进它,但我没时间了。

 public static int GetNumberFromOrdinalString(string inputString)
    {
        string[] ordinalNumberWords = { "", "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth", "thirteenth", "fourteenth", "fifteenth", "sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth" };
        string[] ordinalNumberWordsTens = { "", "tenth", "twentieth", "thirtieth", "fortieth", "fiftieth", "sixtieth", "seventieth", "eightieth", "ninetieth" };
        string[] ordinalNumberWordsExtended = {"hundredth", "thousandth", "millionth", "billionth" };

        if (inputString.IsNullOrEmpty() || inputString.Length < 5 || inputString.Contains(" ")) return 0;

        if (ordinalNumberWords.Contains(inputString) || ordinalNumberWordsTens.Contains(inputString))
        {
            var outputMultiplier = ordinalNumberWords.Contains(inputString) ? 1 : 10;
            var arrayToCheck = ordinalNumberWords.Contains(inputString) ? ordinalNumberWords : ordinalNumberWordsTens;

            // Use the loop counter to get our output integer.
            for (int x = 0; x < arrayToCheck.Count(); x++)
            {
                if (arrayToCheck[x] == inputString)
                {
                    return x * outputMultiplier;
                }
            }
        }

        // Check if the number is one of our extended numbers and return the appropriate value.
        if (ordinalNumberWordsExtended.Contains(inputString))
        {
            return inputString == ordinalNumberWordsExtended[0] ? 100 : inputString == ordinalNumberWordsExtended[1] ? 1000 : inputString == ordinalNumberWordsExtended[2] ? 1000000 : 1000000000;
        }

        return 0;
    }
4

2 回答 2

2

除了我知道“和”这个词应该是从整数到小数的过渡之外,我从来没有考虑过这么多。喜欢

一百九十九美元和十美分

不是

一百九十九美元。

无论如何,任何潜在的解决方案都必须解析输入字符串,引发任何异常或以其他方式返回值。

但首先你必须知道“规则”这似乎非常武断并且基于传统,但这位绅士似乎是一个很好的起点:

问数学博士

于 2010-09-29T02:25:58.463 回答
0

我认为您最终可能不得不将字符串映射到您期望的最大范围内的值,然后按顺序解析字符串并按原样放置值。由于在数量级范围内和范围内几乎没有常规的命名约定,我认为没有一种优雅或简单的方法来解析一个单词以获取其数值。幸运的是,根据格式,您可能只需要映射每个数量级。例如,如果您只期望数字 0-100 并且它们被输入为“九十九”,那么您只需要映射 0-9,然后以 10 为步长映射 10-100。

于 2010-09-29T04:33:54.420 回答