- SAP UI5 货币金额显示的格式化逻辑
- SAP UI5 视图里的 OverflowToolbar 控件
- 关于 SAP UI5 参数 $$updateGroupId 前面
- SAP UI5 ObjectPageLayout 控件使用方法分
- 关于使用NumberFormatter整数位0被省略的情况
- 通过 FileUploader 的初始化,了解 SAP UI5
- SAP UI5 设备类型检测 Device API 的工作原理
- SAP UI5 日期类型 sap.ui.model.type.D
- SAP UI5 日期类型 sap.ui.model.type.D
- 如何通过 ABAP 代码给 SAP OData 元数据增添注解试
先看一些实际的例子:
var oFormat = NumberFormat.getCurrencyInstance({
"currencyCode": false,
"customCurrencies": {
"BTC": {
"symbol": "\u0243",
"decimals": 3
}
}
});
oFormat.format(123.4567, "BTC"); // "Ƀ 123.457"
上面的例子,定义了一个名为 BTC 的自定义货币符号,同时用 decimals 指定小数点后的数位,以及货币符号的 unicode 编码值。
运行结果如下:
![](https://img.haomeiwen.com/i2085791/8691337f1c08aec7.png)
另一个例子:
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:
![](https://img.haomeiwen.com/i2085791/1164dd0d1243f09a.png)
目标类型为 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);
}
};
![](https://img.haomeiwen.com/i2085791/68329413baaf7cd8.png)
![](https://img.haomeiwen.com/i2085791/ce610a2e74789908.png)
读取 EUR 对应的 digit 数位:
![](https://img.haomeiwen.com/i2085791/d130cb2aa27a9de0.png)
所有的格式都存储在 LocaleData 里:
![](https://img.haomeiwen.com/i2085791/fc58e3e5864d2398.png)
![](https://img.haomeiwen.com/i2085791/67898e67bc2bb2f6.png)
找不到 EUR 对应的 digit 值:
![](https://img.haomeiwen.com/i2085791/7942c9bf159349e3.png)
于是读取 default 配置。如果 default 配置也为空,就返回默认的 2.
![](https://img.haomeiwen.com/i2085791/7ecc3a0a923bb73c.png)
default 值维护在此处:2
![](https://img.haomeiwen.com/i2085791/c30b7005ee8f5d19.png)
此处把 87 和 2 使用小数点分隔开,放到不同的变量里分别存储:
![](https://img.haomeiwen.com/i2085791/ced325dd32a95e24.png)
iDotPos = sNumber.indexOf(".");
if (iDotPos > -1) {
sIntegerPart = sNumber.substr(0, iDotPos);
sFractionPart = sNumber.substr(iDotPos + 1);
} else {
sIntegerPart = sNumber;
}
最终的格式化结果:87.20
![](https://img.haomeiwen.com/i2085791/86e3c8e4d7a36612.png)
看另一个例子:9.99999 EUR
![](https://img.haomeiwen.com/i2085791/cceee8134848ab77.png)
这里 preserveDecimals 的值为 true,因此 9.99999 小数点后的五个 9,会被保留下来。
![](https://img.haomeiwen.com/i2085791/4086c0eb81b7208c.png)
如果我们把 preserveDecimals 的值改为 false,
![](https://img.haomeiwen.com/i2085791/a4480830d2e8d497.png)
最后显示的值就四舍五入变成了 10.00:
![](https://img.haomeiwen.com/i2085791/0d4f1d386cc6e22e.png)
更多Jerry的原创文章,尽在:"汪子熙":
![](https://img.haomeiwen.com/i2085791/97c4752c0e619c44.png)
网友评论