我正在寻找与Is there an easy way to create ordinals in C#?有些相关的解决方案,但反过来。
我想自动执行以下转换:
首先 - >第一
第二 - >第二
第三 - >第三
第九十九 - >第99等等。
答案 0 :(得分:1)
通常,通过使用数字词典解析数字最容易做到这一点。规则是:
将字符串转换为小写,并根据空格,逗号和/或短划线将字符串拆分为单词。删除空条目(对应于相邻的多个分隔符)。
从字符串的第一个单词开始。这应该是对应于前十九个自然数字之一的词 - “一”,“二”,“三”,......,“十七”,“十八”,“十九” - 或者来自“十”的倍数二十“到”九十“。请记住,因为你必须考虑序数,你要找的数字都是先前的形式和以“st”,“nd”,“rd”或“th”结尾的形式;不同的是,如果您看到任何单词的序数版本,您应该完成。在任何情况下,在查找包含您的数字和相应值的预定义Dictionary<string, int>
中的数字(并希望找到一个值)后,请记住此数字作为您的“工作价值”。
现在开始迭代单词。如果下一个单词也是这些自然数字中的一个,请将其添加到“工作值”的值中,但不要将该值添加到“运行总计”中。
如果下一个单词是一个数量级指标(百,千,百万,十亿,万亿),则将您的工作值乘以数量级。然后,“偷看”下一个字;如果它也是一个OOM词(主要词是“十万”),但英国英语也允许“千万”作为我们所知的“十亿”的同义词,并且一些非常大的口头数字可以说是重复较小的OOM比如“百万美元”),保留你所拥有的并继续迭代;否则,将当前工作值添加到运行总计中,并在继续之前将工作值归零。
当您到达数字字符串的最后一个单词时,请将您工作价值中的任何内容添加到运行总计中。
您的运行总计现在是您刚刚解析的数字的数字表示。要再次使它成为数字序数,只需在此数字上调用ToString,然后如果某个地方的值为“1”则添加“st”,如果是“2”则添加“nd”,如果是“3”则添加“rd”,如果是其他任何数字,则为“th”。
答案 1 :(得分:0)
在英语中,唯一带有特殊术语的数字是1-20而10的倍数是90(20,30,40等),例如“第四十”(特别令人烦恼,因为它不是“第十四”)或“第十九”。
如果您解析这些特殊情况,其他所有内容通常都表示为数字&lt; 100乘法器,在最后一个表达式之前的可选“和”,以及在整个短语之后的“th”,例如“((四)(百))[和](五十)(六)[th]”。
答案 2 :(得分:0)
在我看来,最简单的方法是为第一个和第二个数字生成数组(通过使用正常/非反向转换代码),然后在该数组中进行搜索。
100之后你只需要加上“一百,一千”等等。
提示:从那个方向读取结尾的单词:
<--------- <----------
one hundred twenty first
4 3 2 1