在Node.js中使用.toLocaleString()

时间:2014-04-21 14:58:48

标签: 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
}) );

如果您在浏览器中运行此功能,则会打印$6,000.00。如果您在Node.js REPL或应用程序中运行此代码段,它将返回6000作为字符串。

猜猜这是Node.js的错误?你可以在这里做一些工作吗?

4 个答案:

答案 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)

这是解决此问题的一种方法:

  1. 运行Content-Type : application/json 。根据{{​​3}}:

      

    什么是ICU?

         

    ICU是成熟的,广泛使用的C / C ++和Java库集,可为软件应用程序提供Unicode和全球化支持。 ICU具有广泛的可移植性,可以在所有平台上以及C / C ++和Java软件之间为应用程序提供相同的结果。

  2. (可选)也运行npm install full-icu --save以支持Windows用户。

  3. 更新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服务器端日期本地化问题。尚未验证货币本地化,但到目前为止这么好。我建议试一试。