【问题标题】:Is there a simple method of converting an ordinal numeric string to its matching numeric value?有没有一种简单的方法可以将序数数字字符串转换为其匹配的数值?
【发布时间】:2011-04-18 14:37:32
【问题描述】:

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

样品: “第一个”-> 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;
    }

【问题讨论】:

  • 您的意思是,将231 转换为1 + 30 + 200
  • @Ruel,不,我认为 OP 的意思是 1 -> “第一”,10 -> “第十”,100 -> “百分之一”
  • 你想用这个多高?
  • 我明白了,我不知道任何现有的类/算法。这会很痛苦,但必须有人编写代码。
  • @Kirk 我认为 OP 想要反过来

标签: c# string algorithm numeric ordinals


【解决方案1】:

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

一百九十九美元和十美分

不是

一百九十九美元。

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

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

Ask Dr. Math

【讨论】:

  • 如果您规定“and”仅用于转换为小数,那么当您尝试在旧世界销售您的软件时,您将遇到一大堆问题!在英国,我们通常说“一百零一磅和十九便士”,甚至是“距离我生日还有 206 天”——“一百一”对我们来说听起来很美国化。
  • 是的,任意的和传统的基础。顺便说一句,感谢伟大的语言。我们只需要对其进行一些更改。 :-)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2013-02-21
    相关资源
    最近更新 更多