有没有人知道将“第一”,“第十”和“第一百”之类的单词转换为数字等价的方法?
样品: “第一” - > 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;
}
答案 0 :(得分:2)
除了我知道单词“和”应该是从整数到小数的转换之外,我从来没有考虑过这么多。像
一百九十九美元和十美分
不
一百九十九美元。
无论如何,任何潜在的解决方案都必须解析输入字符串,引发任何异常或返回值。
但首先你必须知道“规则”这似乎是非常随意的,并且基于传统,但这位先生似乎是一个好的开始:
答案 1 :(得分:0)
我认为您可能最终必须将字符串映射到您期望的最大范围内的值,然后按顺序解析字符串并放置值。由于在数量级上有很少的常规命名约定,我认为没有一种优雅或简单的方法来解析单词以获得其数值。幸运的是,根据格式,您可能只需映射每个数量级。例如,如果您只期望数字0-100并且它们输入为“九十九”那么您只需要映射0-9,然后以10到100步骤为10.