Comment puis-je formater des devises dans une composante Vue?

mon composant Vue est comme ceci :

<template>
    <div>
        <div class="panel-group"v-for="item in list">
            <div class="col-md-8">
                <small>
                   Total: <b>{{ item.total }}</b>
                </small>
            </div>
        </div>
    </div>
</template>

<script>
    export default {
        ...
        computed: {
            list: function() {
                return this.$store.state.transaction.list
            },
            ...
        }
    }
</script>

le résultat de {{ item.total }} est

26000000

mais je veux que le format soit comme ceci:

26.000.000,00

en jQuery ou javascript, je peux le faire

mais, comment le faire en vue composante?

26
demandé sur Mridang Agarwalla 2017-04-04 16:01:15

6 réponses

j'écrirais la méthode pour cela, et alors où vous devez formater le prix, vous pouvez juste mettre la méthode dans le modèle et passer la valeur vers le bas

methods: {
    formatPrice(value) {
        let val = (value/1).toFixed(2).replace('.', ',')
        return val.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ".")
    }
}

et ensuite dans le modèle:

<template>
    <div>
        <div class="panel-group"v-for="item in list">
            <div class="col-md-8">
                <small>
                   Total: <b>{{ formatPrice(item.total) }}</b>
                </small>
            </div>
        </div>
    </div>
</template>

BTW-Je n'ai pas mis trop de soin sur le remplacement et l'expression régulière.Elle pourrait être améliorée.

36
répondu Belmin Bedak 2017-04-04 13:20:46

j'ai créé un filtre. Le filtre peut être utilisé dans n'importe quelle page.

Vue.filter('toCurrency', function (value) {
    if (typeof value !== "number") {
        return value;
    }
    var formatter = new Intl.NumberFormat('en-US', {
        style: 'currency',
        currency: 'USD',
        minimumFractionDigits: 0
    });
    return formatter.format(value);
});

alors je peux utiliser ce filtre comme ceci:

        <td class="text-right">
            {{ invoice.fees | toCurrency}}
        </td>

j'ai utilisé ces réponses connexes pour aider à la mise en œuvre du filtre:

42
répondu Jess 2018-01-31 19:55:44

Vous pouvez formater la monnaie d'écrire votre propre code, mais c'est juste pour l'instant - lorsque votre application va grandir, vous pouvez avoir besoin d'autres devises.

il y a un autre problème avec ceci:

  1. Pour EN-us - dollar signe est toujours à la veille de la devise - $2.00,
  2. pour PL sélectionné vous retournez signe après montant comme 2,00 zł.

je pense que la meilleure option est d'utiliser des complexes solution pour l'internationalisation par exemple library vue-i18n( http://kazupon.github.io/vue-i18n / ).

j'utilise ce plugin et je n'ai pas à vous soucier de telles choses. Veuillez consulter la documentation - c'est vraiment simple:

http://kazupon.github.io/vue-i18n/guide/number.html

vous n'avez qu'à utiliser:

<div id="app">
  <p>{{ $n(100, 'currency') }}</p>
</div>

et mis EN-us pour obtenir $100.00 :

<div id="app">
  <p>0.00</p>
</div>

ou PL pour obtenir 100,00 zł :

<div id="app">
  <p>100,00 zł</p>
</div>

ce plugin fournit également différentes fonctionnalités comme les traductions et le formatage de date.

6
répondu Arkowsky 2018-07-31 09:02:49

le commentaire de @RoyJ a une grande suggestion. Dans le modèle, vous pouvez simplement utiliser des chaînes de caractères localisées:

<small>
     Total: <b>{{ item.total.toLocaleString() }}</b>
</small>

ce n'est pas pris en charge dans certains des navigateurs plus anciens, mais si vous ciblez IE 11 et plus tard, vous devriez être très bien.

4
répondu AaronBaker 2017-06-02 17:49:17

avec vuejs 2, Vous pouvez utiliser VUE2-filters qui a d'autres goodies ainsi.

npm install vue2-filters


import Vue from 'vue'
import Vue2Filters from 'vue2-filters'

Vue.use(Vue2Filters)

alors utilisez - le comme ceci:

{{ amount | currency }} // 12345 => ,345.00

Ref: https://www.npmjs.com/package/vue2-filters

4
répondu Yao Liu 2018-03-30 01:41:51

il y a des problèmes avec la précision de la réponse acceptée.

la fonction ronde(valeur, décimales) dans ce travail d'essai. contrairement à l'exemple simple à corriger.

il s'agit d'un test de la méthode toFixed vs round.

http://www.jacklmoore.com/notes/rounding-in-javascript /

  Number.prototype.format = function(n) {
      return this.toFixed(Math.max(0, ~~n));
  };
  function round(value, decimals) {
    return Number(Math.round(value+'e'+decimals)+'e-'+decimals);
  }

  // can anyone tell me why these are equivalent for  50.005, and 1050.005 through 8150.005 (increments of 50)

  var round_to = 2;
  var maxInt = 1500000;
  var equalRound = '<h1>BEGIN HERE</h1><div class="matches">';
  var increment = 50;
  var round_from = 0.005;
  var expected = 0.01;
  var lastWasMatch = true;

  for( var n = 0; n < maxInt; n=n+increment){
    var data = {};
    var numberCheck = parseFloat(n + round_from);
    data.original = numberCheck * 1;
    data.expected =  Number(n + expected) * 1;
    data.formatIt = Number(numberCheck).format(round_to) * 1;
    data.roundIt = round(numberCheck, round_to).toFixed(round_to) * 1;
    data.numberIt = Number(numberCheck).toFixed(round_to) * 1;
    //console.log(data);

    if( data.roundIt !== data.formatIt || data.formatIt !== data.numberIt ||
       data.roundIt !== data.numberIt || data.roundIt != data.expected
      ){
        if(lastWasMatch){
          equalRound = equalRound + '</div><div class="errors"> <hr/> Did Not Round UP <hr/>' ;
            document.write(' <h3>EXAMPLE: Did Not Round UP: ' + numberCheck + '</h3><br /><hr/> ');
            document.write('expected: '+data.expected + ' :: ' + (typeof data.expected)  + '<br />');
            document.write('format: '+data.formatIt + ' :: ' + (typeof data.formatIt)  + '<br />');
            document.write('round : '+data.roundIt + ' :: ' + (typeof data.roundIt)  + '<br />');
            document.write('number: '+data.numberIt + ' :: ' + (typeof data.numberIt)  + '<br />');
            lastWasMatch=false;
        }
        equalRound = equalRound + ', ' + numberCheck;
    } else {
        if(!lastWasMatch){
          equalRound = equalRound + '</div><div class="matches"> <hr/> All Rounded UP! <hr/>' ;
        } {
            lastWasMatch=true;
        }
        equalRound = equalRound + ', ' + numberCheck;
    }
  }
  document.write('equalRound: '+equalRound + '</div><br />');

mixin exemple

  export default {
    methods: {
      roundFormat: function (value, decimals) {
        return Number(Math.round(value+'e'+decimals)+'e-'+decimals).toFixed(decimals);
      },
      currencyFormat: function (value, decimals, symbol='$') {
        return symbol + this.roundFormat(value,2);
      }
    }
  }
1
répondu Artistan 2017-07-19 18:21:10