Alb*_*elB 21 javascript node.js
所以我正在编写一个小帮手方法,将数字转换为有效的货币格式($xx,xxx.xx).toLocaleString().在Chrome中使用它时,一切都按预期工作,但在Node.js中使用时似乎完全坏了.
例:
var n = 6000
console.log( n.toLocaleString('USD', {
style: 'currency',
currency: "USD",
minimumFractionDigits : 2,
maximumFractionDigits : 2
}) );
Run Code Online (Sandbox Code Playgroud)
如果您在浏览器中运行它,它会打印出来$6,000.00.如果您在Node.js REPL或应用程序中运行此代码段,它将返回6000为String.
猜猜这是Node.js的一个错误?你可以在这附近做一些工作吗?
Aar*_*our 26
根据这个问题,似乎决定运送带有国际化的node.js会使它太大.您可以npm install intl并且要求它,它将替换toLocaleString为有效的版本.
mar*_*ias 20
结果取决于 Node 使用的 ICU 数据。来自site.icu-project.org:
ICU 是一套成熟的、广泛使用的 – – 库,为软件应用程序提供 Unicode 和全球化支持。ICU 具有广泛的可移植性,并在所有平台上为应用程序提供相同的结果 – –。
从 13.0.0 版本开始,Node 默认提供完整的 ICU 支持。这意味着格式化数字在 Node 中(从版本 13 开始)应该像在浏览器中一样自动工作。
从v13 更新日志:
Node.js 版本现在使用默认的 full-icu 支持构建。这意味着现在包括 ICU 支持的所有语言环境,并且与 Intl 相关的 API 可能返回与以前不同的值 (Richard Lau) #29887。
Issue #19214也有相关的讨论。
注意:v13 不是 LTS(长期支持)版本,但 v14 是,因此 v14 是更好的选择。请参阅Node.js 版本。
您需要手动安装和启用完整的 ICU 数据。就是这样:
运行npm install full-icu --save。
同时运行npm install cross-env --save以支持 Windows 用户(可选但推荐)。
更新 的scripts部分package.json以设置环境变量NODE_ICU_DATA。例如:
{
"scripts": {
// Before
"start": "react-scripts start",
"test": "react-scripts test",
// After (omit "cross-env" if you didn't install the package in step two)
"start": "react-scripts start",
"test": "cross-env NODE_ICU_DATA=node_modules/full-icu react-scripts test"
}
}
Run Code Online (Sandbox Code Playgroud)
这样,当您运行 时npm test,Node 将从 加载完整的 ICU 数据node_modules/full-icu,并且您应该在浏览器和服务器环境之间获得一致的结果。
您也可以修改start脚本,但这可能是不必要的;取决于脚本的作用。在上面的例子中,脚本打开一个浏览器,所以修改它是不必要的。
免责声明:我还没有测试这是否会影响性能。就我而言,我这样做是为了修复在浏览器中运行的应用程序的 Jest 测试,因此在运行测试时性能下降是可以接受的。
有关更多详细信息,请参阅Node (v12) 文档中的“国际化支持”。
在这里对 Rndmax 的回答表示敬意:节点中的日期 toLocaleDateString
以防其他人偶然发现这一点,以下是我在 Node.js 环境中将数字格式化为有效美元字符串的方法。
Number.prototype.toMoney = function() {
var integer = this.toString().split('.')[0];
var decimal = this.getDecimal();
integer = integer.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
if( !decimal || !decimal.length ) {
decimal = "00";
} else if ( decimal.length === 1) {
decimal += '0';
} else if ( decimal.length > 2 ) {
decimal = decimal.substr(0, 2);
}
return '$' + integer + '.' + decimal;
};
Number.prototype.getDecimal = function() {
var n = Math.abs(this);
var dec = n - Math.floor(n);
dec = ( Math.round( dec * 100 ) / 100 ).toString();
if( dec.split('.').length ) {
return dec.split('.')[1];
} else return "";
};
Run Code Online (Sandbox Code Playgroud)
这里有一些嘘声,即扩展原生Number原型。在 90% 的情况下,您都希望避免这种情况;这更具体到我的特定实现。
我公然从这个问题中窃取了用于格式化逗号的正则表达式。并根据我自己的意愿拼凑了十进制支持。里程可能会有所不同。
| 归档时间: |
|
| 查看次数: |
15625 次 |
| 最近记录: |