在Node.js中使用.toLocaleString()

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为有效的版本.

  • 老实说,我90%肯定我会选择定制的东西.为变通方法添加变通方法并不是最佳选择,除了固定的`.toLocaleString()方法之外,我没有得到`intl`的其他实际用途.感谢您对`intl`的提示. (4认同)
  • 不幸的是,`intl` 的`.toLocaleString()` 将“US”附加到返回金额的开头。(`50,000.00 美元`) (2认同)
  • 截至今天,运行Node v0.12.4,`intl`似乎没有替换`toLocaleString`.但是,当我执行`var us_format = require('intl')('en-US',{style:'currency',currency:'USD'})`和`us_format(12324.23)`返回时,我得到了预期的结果`$ 12,324.23` (2认同)

mar*_*ias 20

结果取决于 Node 使用的 ICU 数据。来自site.icu-project.org

ICU 是一套成熟的、广泛使用的 – – 库,为软件应用程序提供 Unicode 和全球化支持。ICU 具有广泛的可移植性,并在所有平台上为应用程序提供相同的结果 – –。

节点 13+

从 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 版本

节点 12 及更早版本

您需要手动安装和启用完整的 ICU 数据。就是这样:

  1. 运行npm install full-icu --save

  2. 同时运行npm install cross-env --save以支持 Windows 用户(可选但推荐)。

  3. 更新 的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


Alb*_*elB 5

以防其他人偶然发现这一点,以下是我在 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% 的情况下,您都希望避免这种情况;这更具体到我的特定实现。

我公然从这个问题中窃取了用于格式化逗号的正则表达式并根据我自己的意愿拼凑了十进制支持。里程可能会有所不同。