jQueryまたはJavaScriptで通貨文字列をdoubleに変換する方法


237

通貨文字列を含むテキストボックスがあり、その文字列をdoubleに変換して、いくつかの操作を実行する必要があります。

"$1,100.00"1100.00

これはすべてのクライアント側で発生する必要があります。私は通貨文字列を入力として通貨文字列のままにする以外に選択肢はありませんが、いくつかの数学演算を可能にするために、それをdoubleにキャスト/変換する必要があります。

回答:


480

ドット/数字以外をすべて削除します。

var currency = "-$4,400.50";
var number = Number(currency.replace(/[^0-9.-]+/g,""));

4
これは、.00末尾がある場合にのみ機能するようです。それ以外の場合は、「1100ドル」や「1100ドル」などの通貨の有効な表現。2桁減少します。
Brian M. Hunt

19
他のロケールは小数に「、」を使用するため、これはロケールに依存することに注意してください(例:1.100,00€)。他の一部のロケールでは、グループごとに異なる標準の桁数(小数点以下3桁など)を使用しています。
smola 2013年

8
文字列の負の数を処理するために、受け入れる文字のリストに「-」を追加しました。つまり、.replace(/ [^ 0-9-\。] + / g、 "")
tonycoupland

4
また、一部の会計アプリでは負の値を示すために数値を括弧で囲んでいることに注意してください。例:($ 5.00)=-$ 5.00
Dave L

1
私はここで返信するのに数年遅れる可能性があることを知っていますが、「通貨= 0」の場合も注意する必要があります。currency.replaceは関数ではないことを示すJavaScriptエラーが発生します。これを回避するために通貨= 0の場合の簡単なチェックを追加しました。
アレン、

23

これは、accounting.jsが適しています。私はプロジェクトでそれを使用し、それを使用する非常に良い経験がありました。

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

GitHubで見つけることができます


6
更新:そのライブラリには71の未解決の問題があり、5か月間編集されていないため、私はそれを信頼していません。github.com/openexchangerates/accounting.js/issues
Ryan

20

正規表現を使用してフォーマット(ドルとコンマ)を削除し、parseFloatを使用して文字列を浮動小数点数に変換します。`

var currency = "$1,100.00";
currency.replace(/[$,]+/g,"");
var result = parseFloat(currency) + .05;

8
通貨を追加するときは、「Toy」以外のアプリケーションではfloatを使用しないでください。正確な合計にはなりません
アリー

6
parseFloat( "151.20" * 100)が15119.999999999998を返すのに驚いて不幸になりますが、parseFloat( "151.40" * 100)は15140を返します。parseFloatをお金のために使用しないでください。お金を扱うために、accounting.jsやここで提案されている他のライブラリなど、特定のライブラリを使用します。
バンバリー、2015年

15

これは古い質問ですが、追加のオプションを提供したいと考えています。

jQuery Globalizeは、カルチャー固有の形式をフロートに解析する機能を提供します。

https://github.com/jquery/globalize

文字列 "$ 13,042.00"が与えられ、Globalizeがen-USに設定されているとします。

Globalize.culture("en-US");

次のように、float値を解析できます。

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

これはあなたに与えるでしょう:

13042.00

そして、あなたは他の文化で働くことができます。


10

私はこれが古い質問であることを知っていますが、CMSの回答には小さな欠点が1つあるようです。通貨形式で「。」が使用されている場合にのみ機能します。小数点として。たとえば、ロシアルーブルで作業する必要がある場合、文字列は「1 000,00 rub」のようになります。

私のソリューションはCMSのソリューションよりもエレガントではありませんが、うまくいくはずです。

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));

仮定:

  • 通貨値は10進表記を使用します
  • 文字列に通貨値の一部ではない数字はありません
  • 通貨の値の小数部に0または2桁が含まれています*

正規表現は「1,999ドルと99セント」のようなものも処理できますが、これは意図された機能ではなく、これに依存することはできません。

これが誰かを助けることを願っています。


ありがとうございました。ベストアンサー。シンプルで強力です。(\ D *)(\ d。*?\ d)(?:\ D +(\ d {2} |-))?(\ D *)$と組み合わせて通貨を取得し、セントの場合は-を使用します。したがって、1.000、-€のような文字列も解析できます。通貨は、parts [1]またはpart [4]になり、part [3]には、セントまたは数値または-が含まれます。あなたが望むようにあなたは文字列を正規化することができますより。
Cyber​​Aleks 16

これは非常に悪く危険です。これにより、10未満の数値が100倍になります。すべての数値をテストする前に、私は愚かに使用しました:(
sheavens

@sheavensそれを報告してくれてありがとう。修正が遅いことをお詫びしますが、新しいバージョンは実際にはこれらの合計でも機能します。
Vindicar 2018


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;
}

3

あなたがあなたの質問に対する解決策を見つけたのを知っています、多分あなたが多分以下の国際的な数値フォーマットのためのより広範なjQueryプラグインを見ることをお勧めしたいと思いました:

国際番号フォーマッター


3

これは私の機能です。すべての通貨で動作します。

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]/, "")
    );

}

使用法:toFloat("$1,100.00")またはtoFloat("1,100.00$")




0
    $ 150.00
    Fr. 150.00
     689.00

上記の3つの通貨記号をテストしました。他の通貨記号も同じように使用できます。

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

上記の正規表現は、数字やピリオド以外のすべてを削除します。したがって、通貨記号なしの文字列を取得できますが、「Fr. 150.00」の場合、出力用にコンソールすると、次のように価格を取得します。

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

    output will be like  priceFloat : .150.00

これは間違っているので、「。」のインデックスを確認します。次に、それを分割して適切な結果を取得します。

    if (priceFloat.indexOf('.') == 0) {
            priceFloat = parseFloat(priceFloat.split('.')[1]);
    }else{
            priceFloat = parseFloat(priceFloat);
    }

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;
}

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;
} 

0

この関数は、ロケールと通貨の設定に関係なく機能します。

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('.');
}

これは、小数点文字がわかっていることを前提としています(私の場合、ロケールはPHPから設定されるため、で取得します<?php echo cms_function_to_get_decimal_point(); ?>)。


0

これは私にとってはうまくいき、ほとんどのエッジケースをカバーしています:)

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.