Comment convertir une chaîne monétaire en double avec jQuery ou Javascript?

237

J'ai une zone de texte qui contiendra une chaîne monétaire que je dois ensuite convertir cette chaîne en double pour effectuer certaines opérations dessus.

"$1,100.00"1100.00

Cela doit se produire du côté client. Je n'ai pas d'autre choix que de laisser la chaîne de devise en tant que chaîne de devise en entrée, mais je dois la convertir / la convertir en double pour permettre certaines opérations mathématiques.

Bobby Borszich
la source

Réponses:

480

Supprimer tous les non points / chiffres:

var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));
CMS
la source
4
Il semble que cela ne fonctionne que lorsqu'il y a une .00fuite. Sinon, des représentations valides de devises telles que "1100 $" et "1100 $". sera réduite de deux ordres de grandeur.
Brian M. Hunt
19
Gardez à l'esprit que cela dépend des paramètres régionaux, car les autres paramètres régionaux utilisent «,» pour les décimales (par exemple 1,100,00 €). Certains autres paramètres régionaux utilisent même un nombre standard de chiffres différent par groupe (comme 3 décimales).
smola
8
Pour gérer les nombres négatifs dans la chaîne, j'ai ajouté un '-' à la liste des caractères à accepter, c'est-à-dire .replace (/ [^ 0-9 - \.] + / G, "")
tonycoupland
4
Gardez également à l'esprit que certaines applications de comptabilité encapsulent les nombres entre parenthèses pour indiquer des valeurs négatives. Par exemple: (5,00 $) = - 5,00 $
Dave L
1
Je sais que j'ai peut-être plusieurs années de retard à répondre ici, mais vous devez également faire attention si "devise = 0". vous obtiendrez une erreur javascript indiquant que currency.replace n'est pas une fonction. Je viens d'ajouter une simple vérification si devise = 0 pour éviter cela.
Allen
23

accounting.js est la voie à suivre. Je l'ai utilisé lors d'un projet et j'ai eu une très bonne expérience de son utilisation.

accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99
accounting.unformat("€ 1.000.000,00", ","); // 1000000

Vous pouvez le trouver sur GitHub

Thomas Kremmel
la source
6
Mise à jour: Cette bibliothèque a 71 problèmes ouverts et n'a pas été modifiée depuis 5 mois, donc je ne lui fais pas confiance. github.com/openexchangerates/accounting.js/issues
Ryan
20

Utilisez une expression régulière pour supprimer le formatage (dollar et virgule) et utilisez parseFloat pour convertir la chaîne en nombre à virgule flottante. »

var currency = "$1,100.00";
currency.replace(/[$,]+/g,"");
var result = parseFloat(currency) + .05;
Jamie
la source
8
Il convient de noter que vous ne devez pas utiliser float pour des applications non «jouets» lorsque vous ajoutez de la monnaie. Vous vous retrouverez avec des totaux pas exacts.
Ally
6
Vous serez surpris et malheureux lorsque parseFloat ("151.20" * 100) vous donnera 15119.99999999999998 mais parseFloat ("151.40" * 100) vous donnera 15140. N'utilisez jamais parseFloat pour de l'argent. Utilisez des bibliothèques spécifiques pour gérer l'argent, telles que accounting.js ou l'une des autres suggérées ici.
bambery
15

Je sais que c'est une vieille question mais je voulais donner une option supplémentaire.

Le jQuery Globalize donne la possibilité d'analyser un format spécifique à une culture à un flottant.

https://github.com/jquery/globalize

Étant donné une chaîne "$ 13,042.00", et Globalize défini sur en-US:

Globalize.culture("en-US");

Vous pouvez analyser la valeur flottante comme suit:

var result = Globalize.parseFloat(Globalize.format("$13,042.00", "c"));

Cela vous donnera:

13042.00

Et vous permet de travailler avec d'autres cultures.

Phill
la source
10

Je sais que c'est une vieille question, mais la réponse de CMS semble avoir un tout petit défaut: cela ne fonctionne que si le format monétaire utilise "." comme séparateur décimal. Par exemple, si vous devez travailler avec des roubles russes, la chaîne ressemblera à ceci: "1 000,00 rub."

Ma solution est beaucoup moins élégante que celle de CMS, mais elle devrait faire l'affaire.

var currency = "1 000,00 rub."; //it works for US-style currency strings as well
var cur_re = /\D*(\d+|\d.*?\d)(?:\D+(\d{2}))?\D*$/;
var parts = cur_re.exec(currency);
var number = parseFloat(parts[1].replace(/\D/,'')+'.'+(parts[2]?parts[2]:'00'));
console.log(number.toFixed(2));

Hypothèses:

  • la valeur monétaire utilise la notation décimale
  • il n'y a pas de chiffres dans la chaîne qui ne font pas partie de la valeur monétaire
  • la valeur de la devise contient 0 ou 2 chiffres dans sa partie fractionnaire *

L'expression régulière peut même gérer quelque chose comme "1 999 dollars et 99 cents", bien que ce ne soit pas une fonctionnalité prévue et qu'il ne faut pas s'y fier.

J'espère que cela aidera quelqu'un.

Vindicar
la source
Je vous remercie. Meilleure réponse. Simple et puissant. Je l'utiliserais avec (\ D *) (\ d. *? \ D) (?: \ D + (\ d {2} | -))? (\ D *) $ pour obtenir la devise et - pour les cents. Ainsi, vous pouvez également analyser des chaînes comme 1.000, - €. La devise sera en parties [1] ou partie [4] et la partie [3] comprend des cents comme nombre ou -. Que vous pouvez normaliser la chaîne comme vous le souhaitez.
CyberAleks
C'est très mauvais et dangereux, cela multiplie les nombres inférieurs à 10 par 100. Je l'ai utilisé bêtement avant de tester tous les nombres avec lui :(
sheavens
@sheavens merci de l'avoir signalé. Toutes mes excuses pour avoir résolu le problème si tard, mais la nouvelle version fonctionne également pour ces sommes.
Vindicar
8

Cet exemple fonctionne bien

var currency = "$123,456.00";
var number = Number(currency.replace(/[^0-9\.]+/g,""));
alert(number);

http://jsbin.com/ecAviVOV/2/edit

PaVen Nguyen
la source
6

// "10.000.500,61 TL" price_to_number => 10000500.61

// "10000500.62" number_to_price => 10.000.500,62

JS FIDDLE: https://jsfiddle.net/Limitlessisa/oxhgd32c/

var price="10.000.500,61 TL";
document.getElementById("demo1").innerHTML = price_to_number(price);

var numberPrice="10000500.62";
document.getElementById("demo2").innerHTML = number_to_price(numberPrice);

function price_to_number(v){
    if(!v){return 0;}
    v=v.split('.').join('');
    v=v.split(',').join('.');
    return Number(v.replace(/[^0-9.]/g, ""));
}

function number_to_price(v){
    if(v==0){return '0,00';}
    v=parseFloat(v);
    v=v.toFixed(2).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");
    v=v.split('.').join('*').split(',').join('.').split('*').join(',');
    return v;
}
Limitless isa
la source
3

Je sais que vous avez trouvé une solution à votre question, je voulais juste recommander que vous examiniez peut-être le plugin jQuery plus étendu suivant pour les formats de nombres internationaux:

Formateur de numéro international

IEnumerator
la source
3

C'est ma fonction. Fonctionne avec toutes les devises ..

function toFloat(num) {
    dotPos = num.indexOf('.');
    commaPos = num.indexOf(',');

    if (dotPos < 0)
        dotPos = 0;

    if (commaPos < 0)
        commaPos = 0;

    if ((dotPos > commaPos) && dotPos)
        sep = dotPos;
    else {
        if ((commaPos > dotPos) && commaPos)
            sep = commaPos;
        else
            sep = false;
    }

    if (sep == false)
        return parseFloat(num.replace(/[^\d]/g, ""));

    return parseFloat(
        num.substr(0, sep).replace(/[^\d]/g, "") + '.' + 
        num.substr(sep+1, num.length).replace(/[^0-9]/, "")
    );

}

Utilisation: toFloat("$1,100.00")outoFloat("1,100.00$")

bycoder
la source
3

Vous pouvez essayer ceci

var str = "$1,112.12";
str = str.replace(",", "");
str = str.replace("$", "");
console.log(parseFloat(str));

Ólafur Waage
la source
2
jQuery.preferCulture("en-IN");
var price = jQuery.format(39.00, "c");

la sortie est: Rs. 39,00

use jquery.glob.js,
    jQuery.glob.all.js
Rajesh Kumar Maurya
la source
0
    $ 150.00
    Fr. 150.00
     689.00

J'ai testé plus de trois symboles monétaires. Vous pouvez également le faire pour d'autres.

    var price = Fr. 150.00;
    var priceFloat = price.replace(/[^\d\.]/g, '');

L'expression régulière ci-dessus supprimera tout ce qui n'est pas un chiffre ou un point. Vous pouvez donc obtenir la chaîne sans symbole monétaire, mais en cas de "Fr. 150,00" si vous consolez pour la sortie, vous obtiendrez le prix comme

    console.log('priceFloat : '+priceFloat);

    output will be like  priceFloat : .150.00

ce qui est faux donc vous vérifiez l'index de "." puis divisez cela et obtenez le bon résultat.

    if (priceFloat.indexOf('.') == 0) {
            priceFloat = parseFloat(priceFloat.split('.')[1]);
    }else{
            priceFloat = parseFloat(priceFloat);
    }
Jyotiranjan
la source
0
function NumberConvertToDecimal (number) {
    if (number == 0) {
       return '0.00'; 
    }
    number = parseFloat(number);
    number = number.toFixed(2).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1");
    number = number.split('.').join('*').split('*').join('.');
    return number;
}
Santosh Bharadwaj
la source
0
var parseCurrency = function (e) {
    if (typeof (e) === 'number') return e;
    if (typeof (e) === 'string') {
        var str = e.trim();
        var value = Number(e.replace(/[^0-9.-]+/g, ""));
        return str.startsWith('(') && str.endsWith(')') ? -value: value;
    }

    return e;
} 
Vladislav Kostenko
la source
0

Cette fonction devrait fonctionner quels que soient les paramètres régionaux et monétaires:

function getNumPrice(price, decimalpoint) {
    var p = price.split(decimalpoint);
    for (var i=0;i<p.length;i++) p[i] = p[i].replace(/\D/g,'');
    return p.join('.');
}

Cela suppose que vous connaissez le caractère décimal (dans mon cas, la locale est définie à partir de PHP, donc je l'obtiens <?php echo cms_function_to_get_decimal_point(); ?>).

Skippy le Grand Gourou
la source
0

Cela a fonctionné pour moi et couvre la plupart des cas marginaux :)

function toFloat(num) {
  const cleanStr = String(num).replace(/[^0-9.,]/g, '');
  let dotPos = cleanStr.indexOf('.');
  let commaPos = cleanStr.indexOf(',');

  if (dotPos < 0) dotPos = 0;

  if (commaPos < 0) commaPos = 0;

  const dotSplit = cleanStr.split('.');
  const commaSplit = cleanStr.split(',');

  const isDecimalDot = dotPos
    && (
      (commaPos && dotPos > commaPos)
      || (!commaPos && dotSplit[dotSplit.length - 1].length === 2)
    );

  const isDecimalComma = commaPos
    && (
      (dotPos && dotPos < commaPos)
      || (!dotPos && commaSplit[commaSplit.length - 1].length === 2)
    );

  let integerPart = cleanStr;
  let decimalPart = '0';
  if (isDecimalComma) {
    integerPart = commaSplit[0];
    decimalPart = commaSplit[1];
  }
  if (isDecimalDot) {
    integerPart = dotSplit[0];
    decimalPart = dotSplit[1];
  }

  return parseFloat(
    `${integerPart.replace(/[^0-9]/g, '')}.${decimalPart.replace(/[^0-9]/g, '')}`,
  );
}
toFloat('USD 1,500.00'); // 1500
toFloat('USD 1,500'); // 1500
toFloat('USD 500.00'); // 500
toFloat('USD 500'); // 500

toFloat('EUR 1.500,00'); // 1500
toFloat('EUR 1.500'); // 1500
toFloat('EUR 500,00'); // 500
toFloat('EUR 500'); // 500
melalj
la source