Bagaimana cara mengubah string mata uang menjadi ganda dengan jQuery atau Javascript?


237

Saya memiliki kotak teks yang akan memiliki string mata uang di dalamnya yang kemudian saya perlu mengkonversi string itu menjadi ganda untuk melakukan beberapa operasi di atasnya.

"$1,100.00"1100.00

Ini perlu terjadi di semua sisi klien. Saya tidak punya pilihan selain meninggalkan string mata uang sebagai string mata uang sebagai input tetapi perlu melemparkan / mengubahnya menjadi ganda untuk memungkinkan beberapa operasi matematika.

Jawaban:


480

Hapus semua yang bukan titik / digit:

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

4
Sepertinya ini hanya berfungsi di mana ada .00jejak. Representasi mata uang yang valid seperti "$ 1100" dan "$ 1100." akan berkurang dua kali lipat.
Brian M. Hunt

19
Ingatlah bahwa ini bergantung pada lokal, karena lokal lain menggunakan ',' untuk desimal (mis. 1.100,00 €). Beberapa lokal lain bahkan menggunakan jumlah digit standar yang berbeda per grup (seperti 3 desimal).
smola

8
Untuk menangani angka negatif dalam string, saya menambahkan tanda '-' ke daftar karakter yang akan diterima, yaitu .replace (/ [^ 0-9 - \.] + / G, "")
tonycoupland

4
Perlu diingat juga bahwa beberapa aplikasi akuntansi membungkus angka dalam tanda kurung untuk menunjukkan nilai negatif. misalnya: ($ 5,00) = - $ 5,00
Dave L

1
Saya tahu saya mungkin terlambat membalas beberapa tahun di sini, tetapi Anda juga harus berhati-hati jika "mata uang = 0." Anda akan mendapatkan kesalahan javascript yang mengatakan bahwa currency.replace bukan fungsi. Saya baru saja menambahkan cek sederhana jika mata uang = 0 untuk menghindari ini.
Allen

23

accounting.js adalah cara untuk pergi. Saya menggunakannya di sebuah proyek dan memiliki pengalaman yang sangat bagus menggunakannya.

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

Anda dapat menemukannya di GitHub


6
Pembaruan: Perpustakaan itu memiliki 71 masalah terbuka dan belum diedit dalam 5 bulan, jadi saya tidak mempercayainya. github.com/openexchangerates/accounting.js/issues
Ryan

20

Gunakan regex untuk menghapus formating (dolar dan koma), dan gunakan parseFloat untuk mengkonversi string ke angka floating point. `

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

8
Patut dicatat bahwa Anda tidak boleh menggunakan float untuk aplikasi non 'Toy' saat menambahkan mata uang Anda. Anda akan mendapatkan total yang tidak tepat.
Ally

6
Anda akan terkejut dan tidak senang ketika parseFloat ("151.20" * 100) memberi Anda 15119.999999999998 tetapi parseFloat ("151.40" * 100) memberi Anda 15140. Jangan pernah menggunakan parseFloat untuk uang. Gunakan perpustakaan khusus untuk berurusan dengan uang, seperti accounting.js atau yang lain yang disarankan di sini.
bambery

15

Saya tahu ini adalah pertanyaan lama tetapi ingin memberikan opsi tambahan.

Globalisasi jQuery memberikan kemampuan untuk mem-parsing format spesifik budaya ke float.

https://github.com/jquery/globalize

Diberikan string "$ 13.042,00", dan Globalisasi disetel ke en-US:

Globalize.culture("en-US");

Anda dapat mem-parsing nilai float seperti:

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

Ini akan memberi Anda:

13042.00

Dan memungkinkan Anda untuk bekerja dengan budaya lain.


10

Saya tahu ini adalah pertanyaan lama, tetapi jawaban CMS tampaknya memiliki satu kekurangan kecil: itu hanya berfungsi jika format mata uang menggunakan "." sebagai pemisah desimal. Misalnya, jika Anda perlu bekerja dengan rubel Rusia, string akan terlihat seperti ini: "1 000,00 gosok."

Solusi saya jauh kurang elegan daripada CMS, tetapi harus melakukan trik.

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

Asumsi:

  • nilai mata uang menggunakan notasi desimal
  • tidak ada digit dalam string yang bukan merupakan bagian dari nilai mata uang
  • nilai mata uang mengandung 0 atau 2 digit di bagian pecahannya *

Regexp bahkan dapat menangani sesuatu seperti "1.999 dolar dan 99 sen", meskipun itu bukan fitur yang dimaksudkan dan tidak boleh diandalkan.

Semoga ini bisa membantu seseorang.


Terima kasih. Jawaban Terbaik. Sederhana dan perkasa. Saya akan menggunakannya dengan (\ D *) (\ d. *? \ D) (?: \ D + (\ d {2} | -))? (\ D *) $ untuk mendapatkan mata uang dan - untuk sen. Jadi Anda dapat mengurai string seperti 1.000, - € juga. Mata uang akan berada di bagian [1] atau bagian [4] dan bagian [3] termasuk sen sebagai angka atau -. Daripada Anda dapat menormalkan string seperti yang Anda inginkan.
CyberAleks

Ini sangat buruk dan berbahaya, ini mengalikan angka kurang dari 10 dengan 100. Saya dengan bodohnya menggunakannya sebelum menguji semua angka dengan itu :(
sheavens

@sheavens terima kasih telah melaporkannya. Permintaan maaf karena memperbaikinya begitu terlambat, tetapi versi baru sebenarnya juga berfungsi untuk jumlah itu.
Vindicar


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

Saya tahu Anda telah menemukan solusi untuk pertanyaan Anda, saya hanya ingin merekomendasikan bahwa mungkin Anda melihat plugin jQuery berikut yang lebih luas untuk Format Angka Internasional:

Formatter Angka Internasional


3

Ini adalah fungsi saya. Bekerja dengan semua mata uang ..

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

}

Penggunaan: toFloat("$1,100.00")atautoFloat("1,100.00$")


3

Anda bisa mencoba ini

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


2
jQuery.preferCulture("en-IN");
var price = jQuery.format(39.00, "c");

output adalah: Rs. 39.00

use jquery.glob.js,
    jQuery.glob.all.js

0
    $ 150.00
    Fr. 150.00
     689.00

Saya telah menguji tiga simbol mata uang di atas. Anda juga dapat melakukannya untuk orang lain.

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

Ekspresi reguler di atas akan menghapus semua yang bukan digit atau titik. Jadi Anda bisa mendapatkan string tanpa simbol mata uang tetapi dalam kasus "Fr. 150.00" jika Anda menghibur untuk output maka Anda akan mendapatkan harga

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

    output will be like  priceFloat : .150.00

yang salah sehingga Anda memeriksa indeks "." kemudian pisahkan itu dan dapatkan hasil yang tepat.

    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

Fungsi ini harus berfungsi di mana saja pengaturan lokal dan mata uang:

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

Ini mengasumsikan Anda tahu karakter titik desimal (dalam kasus saya lokal diatur dari PHP, jadi saya mengerti <?php echo cms_function_to_get_decimal_point(); ?>).


0

Ini bekerja untuk saya dan mencakup sebagian besar kasus tepi :)

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.