Skip to content

Utilisation de .toLocaleString() dans Node.js

Solution:

Sur la base de ce problème, il semble qu’il a été décidé que l’expédition de node.js avec l’internationalisation le rendrait trop volumineux. Vous pouvez npm install intl et l’exiger, et il remplacera toLocaleString avec une version qui fonctionne.

Les résultats dépendent des données ICU utilisées par Node. Depuis site.icu-project.org :

ICU est un ensemble mature et largement utilisé de – – bibliothèques offrant une prise en charge d’Unicode et de la mondialisation pour les applications logicielles. ICU est largement portable et donne aux applications les mêmes résultats sur toutes les plateformes – –.

Nœud 13+

À partir de la version 13.0.0, Node est livré par défaut avec une prise en charge complète de l’ICU. Cela signifie que le formatage des nombres devrait fonctionner automatiquement de la même manière dans Node (à partir de la version 13) que dans les navigateurs.

À partir du journal des modifications v13 :

Les versions de Node.js sont désormais conçues avec une prise en charge complète par défaut de l’icu. Cela signifie que toutes les locales prises en charge par ICU sont désormais incluses et que les API liées à Intl peuvent renvoyer des valeurs différentes de celles d’avant (Richard Lau) #29887.

Le numéro 19214 a également une discussion pertinente à ce sujet.

Remarque : la v13 n’est pas une version LTS (support à long terme), mais la v14 l’est, donc la v14 est un meilleur choix. Voir les versions de Node.js.

Nœud 12 et versions antérieures

Vous devez installer et activer manuellement toutes les données ICU. Voici comment:

  1. Courir npm install full-icu --save.

  2. Courir aussi npm install cross-env --save pour prendre en charge les utilisateurs Windows (facultatif mais recommandé).

  3. Mettre à jour le scripts section de package.json pour définir la variable d’environnement NODE_ICU_DATA. Par exemple:

    {
      "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"
      }
    }
    

De cette façon, quand tu cours npm test, Node chargera toutes les données ICU à partir de node_modules/full-icu, et vous devriez obtenir des résultats cohérents entre les environnements de navigateur et de serveur.

Vous pouvez également modifier le start script, mais cela pourrait être inutile ; dépend de ce que fait le script. Dans l’exemple ci-dessus, le script ouvre un navigateur, il serait donc inutile de le modifier.

Avis de non-responsabilité : je n’ai pas testé si cela affecte les performances. Dans mon cas, j’ai fait cela pour corriger les tests Jest d’une application qui s’exécute dans le navigateur, donc un petit impact sur les performances lors de l’exécution des tests aurait été acceptable.

Pour plus de détails, consultez « Prise en charge de l’internationalisation » dans la documentation de Node (v12).

Félicitations à la réponse de Rndmax ici : Date toLocaleDateString in node

Juste au cas où quelqu’un d’autre tomberait sur cela, voici comment j’ai formaté un nombre en une chaîne valide en dollars américains dans un environnement 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 "";
};

Il y a quelques bobos ici, à savoir étendre le natif Number prototype. Vous voudrez éviter cela 90 % du temps ; c’est plus spécifique à ma mise en œuvre particulière.

J’ai carrément volé l’expression régulière pour le formatage des virgules de cette question. et piraté ensemble le support décimal de ma propre volonté. Le kilométrage peut varier.



Articles Similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.