SAP UI5 货币金额显示的格式化逻辑
2023-09-14 09:02:39 时间
先看一些实际的例子:
var oFormat = NumberFormat.getCurrencyInstance({
"currencyCode": false,
"customCurrencies": {
"BTC": {
"symbol": "\u0243",
"decimals": 3
}
}
});
oFormat.format(123.4567, "BTC"); // "Ƀ 123.457"
上面的例子,定义了一个名为 BTC 的自定义货币符号,同时用 decimals 指定小数点后的数位,以及货币符号的 unicode 编码值。
运行结果如下:
另一个例子:
var oFormat = NumberFormat.getCurrencyInstance({
"currencyCode": false,
"customCurrencies": {
"MyDollar": {
"isoCode": "USD",
"decimals": 3
},
"Bitcoin": {
"decimals": 2
}
}
});
// symbol looked up from global configuration
oFormat.format(123.4567, "MyDollar");
// "$123.457"
// no symbol available, custom currency key is rendered
oFormat.format(777.888, "Bitcoin"); // "Bitcoin 777.89"
我们来单步调试查看 format 函数的执行原理。
进入 Currency.js 的 formatValue 方法。输入参数为 87.2 和 EUR:
目标类型为 string 字符串,所以进入 case string 的分支:
*/
Currency.prototype.formatValue = function(vValue, sTargetType) {
var aValues = vValue;
if (vValue == undefined || vValue == null) {
return null;
}
if (this.oInputFormat) {
aValues = this.oInputFormat.parse(vValue);
}
if (!Array.isArray(aValues)) {
throw new FormatException("Cannot format currency: " + vValue + " has the wrong format");
}
if ((aValues[0] == undefined || aValues[0] == null) && this.bShowNumber) {
return null;
}
switch (this.getPrimitiveType(sTargetType)) {
case "string":
return this.oOutputFormat.format(aValues);
default:
throw new FormatException("Don't know how to format currency to " + sTargetType);
}
};
读取 EUR 对应的 digit 数位:
所有的格式都存储在 LocaleData 里:
找不到 EUR 对应的 digit 值:
于是读取 default 配置。如果 default 配置也为空,就返回默认的 2.
default 值维护在此处:2
此处把 87 和 2 使用小数点分隔开,放到不同的变量里分别存储:
iDotPos = sNumber.indexOf(".");
if (iDotPos > -1) {
sIntegerPart = sNumber.substr(0, iDotPos);
sFractionPart = sNumber.substr(iDotPos + 1);
} else {
sIntegerPart = sNumber;
}
最终的格式化结果:87.20
看另一个例子:9.99999 EUR
这里 preserveDecimals 的值为 true,因此 9.99999 小数点后的五个 9,会被保留下来。
如果我们把 preserveDecimals 的值改为 false,
最后显示的值就四舍五入变成了 10.00:
更多Jerry的原创文章,尽在:“汪子熙”:
相关文章
- 使用 SAP UI5 sap.ui.export.Spreadsheet API 进行 Excel 导出的一些限制
- 如何开发一个 SAP UI5 Tools 的自定义中间件扩展 - Custom Middleware Extension
- 通过一个实际例子,理解 SAP UI5 sap.ui.model.odata.v2.ODataModel API 中 BindingContext 绑定上下文的概念和用法试读版
- [ChatGPT 勘误] SAP ABAP 里 cl_r3standard_persistence 的用途?
- SAP 之SD模块常用权限检查
- 如何给 SAP ABAP ALV 报表的修改功能添加自定义校验逻辑试读版
- 「SAP ABAP」你真的了解OPEN SQL的DML语句吗 (附超详细案例讲解)
- 澄清一些对 SAP UI5 响应式表格 sap.m.Table 的常见理解误区试读版
- SAP UI5 响应式表格 sap.m.Table 根据不同宽度的屏幕动态决定显示或隐藏 Column 的实现源代码讲解试读版
- Oracle购买SAP: 开启新数据时代(oracle收购sap)
- SAP SMARTFORMS 打印 CNSAPWIN 不支持页格式详解编程语言
- SAP中日期时间函数总结详解编程语言
- SAP ALV中同一列的不同行显示不同的小数位,并能够总计,小计详解编程语言
- 如何在SAP系统中发布用户通知-SM02详解编程语言
- SAP MM 采购订单含税价实现方式详解编程语言
- SAP MM移动平均价和标准价逻辑详解编程语言
- SAP-MM知识精解-批次管理(02)- 批次级别及其影响详解编程语言
- SAP ABAP如何隐藏你写的程序代码(危险,请小心谨慎)详解编程语言
- sap自带samples详解编程语言
- 系统SAP在Linux系统上的开启之旅(sap启动linux)
- SAP在Linux系统的安装与使用(sap安装linux)
- 比较:Oracle与SAP的对比(oracle和sap)
- 系统Oracle公司收购SAP系统开启新的商业时代(Oracle公司sap)
- 跨界合作新模式 Oracle与SAP实现合并(oracle与sap合并)
- Oracle与SAP金蝶谁更具竞争力(oracle sap金蝶)
- Oracle与SAP的技术潜力比较(oracle sap比较)
- Oracle和SAP教程一步一步学习(oracle sap教程)
- 探索 Oracle 与 SAP 技术的开发可能性(oracle sap开发)