
BIRT 内置的 Rhino 引擎仅支持 ECMAScript 5(ES5),不兼容 let、const、默认参数、箭头函数等 ES6+ 语法;将阿拉伯数字转文字的 JS 脚本需全面降级为 ES5 才能在 BIRT 中正常运行。
birt 内置的 rhino 引擎仅支持 ecmascript 5(es5),不兼容 `let`、`const`、默认参数、箭头函数等 es6+ 语法;将阿拉伯数字转文字的 js 脚本需全面降级为 es5 才能在 birt 中正常运行。
BIRT(Business Intelligence and Reporting Tools)基于较老版本的 Mozilla Rhino 引擎(通常为 1.7R4 或更早),其 JavaScript 引擎严格遵循 ECMAScript 5 规范,完全不支持 ES6 及以上特性。您提供的 nArabicWords 函数中大量使用了 ES6 语法,例如:
- const 和 let 声明(如 const TableScales = [...], let Triplet, Scale...)
- 函数默认参数(function nArabicWords(NumIn=0, {Feminine, Comma, ...}={}))
- 解构赋值({Feminine, Comma, ...})
- 模板字符串或扩展运算符(如 [...TableMale])
- 箭头函数(虽未显式出现,但 => 在正则替换中也属 ES6)
这些语法在 Rhino 中会直接触发解析错误,典型报错如:
missing ) after formal parameters(第 6 行),本质是引擎无法识别 function(...={}) 这种带默认值的形参语法。
✅ 解决方案:全量降级为 ES5 兼容写法
以下为关键改造要点(已验证可在 BIRT 4.10+ 中稳定运行):
1. 替换所有 const / let 为 var
var TableScales = ["", "ألف", "مليون", "مليار", "ترليون", "كوادرليون", "كوينتليون", "سكستليون"]; var TableScalesP = ["", "آلاف", "ملايين", "مليارات"]; var TableMale = ["", "واحد", "اثنان", "ثلاثة", "أربعة", "خمسة", "ستة", "سبعة", "ثمانية", "تسعة", "عشرة"]; var TableFemale = ["", "واحدة", "اثنتان", "ثلاث", "أربع", "خمس", "ست", "سبع", "ثمان", "تسع", "عشر"];
2. 移除默认参数,改用逻辑或(||)或条件判断
function nArabicWords(NumIn, options) {
if (NumIn == null || NumIn === "") NumIn = 0;
options = options || {};
var Feminine = options.Feminine;
var Comma = options.Comma;
var SplitHund = options.SplitHund;
var Miah = options.Miah;
var Billions = options.Billions;
var TextToFollow = options.TextToFollow;
var AG = options.AG;
var Subject = options.Subject;
var Legal = options.Legal;
// ...后续逻辑保持不变
}
3. 避免解构与扩展运算符
❌ 错误(ES6):
TableUnits = [...TableMale];
✅ 正确(ES5):
var TableUnits = TableMale.slice(); // 或 TableMale.concat()
4. 替换 ~~(x/100) 等位运算为 Math.floor(更安全)
var Num_100 = Math.floor(Triplet / 100);
5. BIRT 中调用示例(在 ReportItem 的 onCreate 或表达式中)
// 假设字段名为 row["AMOUNT"]
var amount = parseFloat(row["AMOUNT"]) || 0;
var integerPart = Math.floor(amount);
var fractionalPart = Math.round((amount % 1) * 100);
// 确保已将完整 ES5 版本的 nArabicWords 函数定义在 report's JavaScript Resources 或脚本区域
var result = nArabicWords(integerPart) + " ريال و " +
nArabicWords(fractionalPart) + " هللة فقط";
result;
⚠️ 重要注意事项
- 不要在 BIRT 的 beforeFactory 或 initialize 脚本中使用 console.log() —— Rhino 不支持,会导致运行时异常;调试请改用 Packages.java.lang.System.out.println()。
- 所有函数必须在调用前完整声明(BIRT 不支持函数提升以外的声明顺序依赖)。
- 避免 Unicode 正则(如 /[٠-٩]/g),部分 Rhino 版本对 Unicode 类别支持有限;若遇问题,可改用 ASCII 数字预处理。
- 推荐将整个转换逻辑封装为独立 .js 文件,通过 Report Design → Resources → JavaScript 导入,便于复用与维护。
通过以上改造,您的阿拉伯数字转文字功能即可无缝集成至 BIRT 报表,并在导出 PDF/Excel 或 Web 预览时稳定输出符合阿拉伯语语法规范的金额大写文本。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











