所以我正在编写一个小帮助方法,使用$xx,xxx.xx
将数字转换为有效的货币格式(.toLocaleString()
)。在Chrome中使用它时,一切都按预期工作,但在Node.js中使用时似乎完全破坏了。
示例:
var n = 6000
console.log( n.toLocaleString('USD', {
style: 'currency',
currency: "USD",
minimumFractionDigits : 2,
maximumFractionDigits : 2
}) );
如果您在浏览器中运行此功能,则会打印$6,000.00
。如果您在Node.js REPL或应用程序中运行此代码段,它将返回6000
作为字符串。
猜猜这是Node.js的错误?你可以在这里做一些工作吗?
答案 0 :(得分:21)
根据this issue,似乎确定运送带有国际化的node.js会使其太大。您可以npm install intl
并要求它,并将toLocaleString
替换为有效的版本。
答案 1 :(得分:3)
以防万一其他人偶然发现这一点,以下是我在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 "";
};
这里有一些boo-boo,即扩展原生Number
原型。你会想要避免这种情况是90%的时间;这更具体到我的特定实现。
我公然偷走了正则表达式来格式化来自this question.的逗号,并将我自己意志的小数支持一并入侵。里程可能会有所不同。
答案 2 :(得分:1)
这是解决此问题的一种方法:
运行Content-Type : application/json
。根据{{3}}:
什么是ICU?
ICU是成熟的,广泛使用的C / C ++和Java库集,可为软件应用程序提供Unicode和全球化支持。 ICU具有广泛的可移植性,可以在所有平台上以及C / C ++和Java软件之间为应用程序提供相同的结果。
(可选)也运行npm install full-icu --save
以支持Windows用户。
更新npm install cross-env --save
的{{1}}部分,例如:
scripts
这样,当您运行package.json
时,将激活完整的ICU数据,并且应该在浏览器和服务器环境之间获得一致的结果。
免责声明:我尚未测试这是否会影响性能。就我而言,我用它来修复在浏览器上运行的应用程序的Jest测试,因此对性能的影响很小。
对Rndmax的回答表示敬意:site.icu-project.org
答案 3 :(得分:0)
所以要为面临同样问题的任何人更新此内容......
我们在服务器端呈现时使用intl作为我们的本地化解决方案,但我们最近要求将if((include'../../../include/config.php') == true){
echo "Config loaded succesfully<br>";
}else{
echo "There was a Big Time Error loading the Config!<br>";
}
添加到{timeZoneName: 'short'}
选项中,并且不支持此字段。
来自intl.js的源代码:
.toLocaleString()
此外,最新补丁版本发生了重大变化,迫使我们将版本锁定为1.2.4。
最终,我们放弃intl的使用,转而使用full-icu。只需将它添加到我们的yarn.lock解决了我们所有的Node.js服务器端日期本地化问题。尚未验证货币本地化,但到目前为止这么好。我建议试一试。