在现在这样一个全球化环境中因为在不同的语言中有很多不同的语法规则所以以前很多简单的任务现在都变得很困难你可以将一门特定的语言分成一组语法规则和针对这些规则的异常(以及一个基本词语)从而将这些任务一般化在一些编程语言(比如 Perl 和 Java)中有一些公共域(domain)模块可以用来对文本完成语言转换
下面给出一个稍微简单一点儿的例子假设我们要将一个数字转换成其拼写版本(例如需要填写支票和法律合同)这个诀窍在 Oracle 出现的早期已经有了一般都以如下方式使用
selectto_char(to_date(J)Jsp) from dual
Twelve Thousand Three Hundred FortyFive
TO_DATE 函数使用 Julian 日期格式将数字转换成一个日期然后TO_CHAR 接受一个日期参数并再次将其格式化为一个表示 Julian 日期的拼写数字版本的字符串但是这个决窍有一些限制
首先在 Oracle 中 Julian 日期的最大有效值是年所以日期的最大值只能取到而最小值是或BC而且因为没有第零年所以如果不额外使用一个 DECODE 或 CASE 语句就不可能生成文本零第三个大的限制是它会忽略掉你的 NLS 设置不管你使用的是哪种语言数字总是以美国英语拼写出一些简单的操作也存在这样的问题比如拼写出天例如尝试生成西班牙语短语Cinco de Mayo
alter session set nls_language = SPANISHselect to_char(to_date(MMDD)Ddspth Month) from dual
Fifth Mayo
在为大多数语言生成数字时涉及的语法实际上相当简单主体工作包括收集所有不同的语法规则并建立起足够的规则来生成正确的语法模式(现在我将回避涉及到匹配数字和性别的问题)
首先我将创建两个表第一个表保存基本的单词和异常第二个表保存用于生成文本的一些简单的模板模式如果在第一个表中有数字那么我的语言函数就返回那个文本对于其它每个数字我将试图在一系列模式中匹配它并应用一个模板来生成正确的文本
create table numwords(langvarchar()num integerwordvarchar()constraint numwords_pk primary key (langnum))
create table numrules(langvarchar()seq integerpintegerpintegertemp varchar()tempvarchar()constraint numrules_pk primary key (langseq))