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