Làm cách nào để chuyển đổi một chuỗi tiền tệ thành gấp đôi với jQuery hoặc Javascript?


237

Tôi có một hộp văn bản sẽ có một chuỗi tiền tệ trong đó mà sau đó tôi cần chuyển đổi chuỗi đó thành gấp đôi để thực hiện một số thao tác trên nó.

"$1,100.00"1100.00

Điều này cần phải xảy ra tất cả các phía khách hàng. Tôi không có lựa chọn nào khác ngoài việc để chuỗi tiền tệ làm chuỗi tiền tệ làm đầu vào nhưng cần phải chuyển / chuyển đổi thành gấp đôi để cho phép một số thao tác toán học.

Câu trả lời:


480

Xóa tất cả dấu chấm / chữ số:

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

4
Có vẻ như điều này chỉ hoạt động khi có một .00dấu vết. Mặt khác, các đại diện hợp lệ của tiền tệ như "$ 1100" và "$ 1100." sẽ được giảm hai bậc độ lớn.
Brian M. Hunt

19
Hãy nhớ rằng điều này phụ thuộc vào miền địa phương, vì các địa phương khác sử dụng ',' cho số thập phân (ví dụ: 1.100,00 €). Một số địa phương khác thậm chí sử dụng số chữ số tiêu chuẩn khác nhau cho mỗi nhóm (như 3 số thập phân).
smola

8
Để xử lý các số âm trong chuỗi, tôi đã thêm '-' vào danh sách các ký tự chấp nhận, tức là .replace (/ [^ 0-9 - \.] + / G, "")
tonycoupland

4
Ngoài ra, hãy nhớ rằng một số ứng dụng kế toán bao bọc các số trong ngoặc đơn để biểu thị các giá trị âm. ví dụ: ($ 5,00) = - $ 5,00
Dave L

1
Tôi biết tôi có thể trễ vài năm khi trả lời ở đây, nhưng bạn cũng cần cẩn thận nếu "tiền tệ = 0." bạn sẽ gặp lỗi javascript nói rằng money.replace không phải là một chức năng. Tôi chỉ cần thêm một kiểm tra đơn giản nếu tiền tệ = 0 để tránh điều này.
Allen

23

hạch toán là cách để đi. Tôi đã sử dụng nó tại một dự án và có kinh nghiệm rất tốt khi sử dụng nó.

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

Bạn có thể tìm thấy nó tại GitHub


6
Cập nhật: Thư viện đó có 71 vấn đề mở và chưa được chỉnh sửa trong 5 tháng, vì vậy tôi không tin tưởng nó. github.com/openexchangerates/accounting.js/issues
Ryan

20

Sử dụng biểu thức chính quy để xóa định dạng (đô la và dấu phẩy) và sử dụng parseFloat để chuyển đổi chuỗi thành số dấu phẩy động.

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

7
Đáng lưu ý, bạn không nên sử dụng float cho bất kỳ ứng dụng 'Đồ chơi' nào khi thêm tiền. Bạn sẽ kết thúc với tổng số không chính xác.
minh

6
Bạn sẽ ngạc nhiên và không vui khi parseFloat ("151,20" * 100) mang lại cho bạn 15119.999999999998 nhưng parseFloat ("151,40" * 100) mang lại cho bạn 15140. Đừng bao giờ sử dụng parseFloat để kiếm tiền. Sử dụng các thư viện cụ thể để xử lý tiền, chẳng hạn như hạch toán.js hoặc bất kỳ thư viện nào khác được đề xuất ở đây.
bambery

15

Tôi biết đây là một câu hỏi cũ nhưng muốn đưa ra một lựa chọn bổ sung.

JQuery Globalize cung cấp khả năng phân tích một định dạng văn hóa cụ thể thành một float.

https://github.com/jquery/globalize

Đưa ra một chuỗi "$ 13,042.00" và Toàn cầu hóa được đặt thành en-US:

Globalize.culture("en-US");

Bạn có thể phân tích giá trị float như vậy:

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

Điều này sẽ cung cấp cho bạn:

13042.00

Và cho phép bạn làm việc với các nền văn hóa khác.


10

Tôi biết đây là một câu hỏi cũ, nhưng câu trả lời của CMS dường như có một lỗ hổng nhỏ: nó chỉ hoạt động nếu định dạng tiền tệ sử dụng "." như dấu phân cách thập phân. Ví dụ: nếu bạn cần làm việc với rúp Nga, chuỗi sẽ trông như thế này: "1 000,00 rub."

Giải pháp của tôi kém thanh lịch hơn nhiều so với CMS, nhưng nó nên thực hiện thủ thuật.

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

Giả định:

  • giá trị tiền tệ sử dụng ký hiệu thập phân
  • không có chữ số nào trong chuỗi không phải là một phần của giá trị tiền tệ
  • giá trị tiền tệ chứa 0 hoặc 2 chữ số trong phần phân số của nó *

Regrec thậm chí có thể xử lý một cái gì đó như "1.999 đô la và 99 xu", mặc dù đó không phải là một tính năng dự định và nó không nên được dựa vào.

Hy vọng điều này sẽ giúp được ai đó.


Cảm ơn bạn. Câu trả lời tốt nhất. Đơn giản và hùng mạnh. Tôi sẽ sử dụng nó với (\ D *) (\ d. *? \ D) (?: \ D + (\ d {2} | -))? (\ D *) $ để lấy tiền và - lấy xu. Vì vậy, bạn có thể phân tích các chuỗi như 1.000, - € quá. Tiền tệ sẽ ở các phần [1] hoặc một phần [4] và phần [3] bao gồm xu dưới dạng số hoặc -. Hơn bạn có thể bình thường hóa chuỗi như bạn muốn.
CyberAleks

Điều này rất tệ và nguy hiểm, số này nhân số nhỏ hơn 10 với 100. Tôi đã dại dột sử dụng nó trước khi thử tất cả các số với nó :(
sheavens

@sheavens cảm ơn vì đã báo cáo nó. Xin lỗi vì đã sửa nó quá muộn, nhưng phiên bản mới thực sự cũng hoạt động với những khoản tiền đó.
Vindicar


6

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

// "10000500.62" số_to_price => 10.000.500,62

FIDDLE JS: 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

Đây là chức năng của tôi. Hoạt động với tất cả các loại tiền tệ ..

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

}

Cách sử dụng: toFloat("$1,100.00")hoặctoFloat("1,100.00$")



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

đầu ra là: R. 39,00

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

0
    $ 150.00
    Fr. 150.00
     689.00

Tôi đã thử nghiệm cho ba biểu tượng tiền tệ ở trên. Bạn cũng có thể làm điều đó cho những người khác.

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

Trên biểu thức chính quy sẽ loại bỏ mọi thứ không phải là chữ số hoặc dấu chấm. Vì vậy, bạn có thể nhận được chuỗi không có ký hiệu tiền tệ nhưng trong trường hợp "Fr. 150.00" nếu bạn điều khiển đầu ra thì bạn sẽ nhận được giá như

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

    output will be like  priceFloat : .150.00

đó là sai để bạn kiểm tra chỉ số của "." sau đó phân chia nó và nhận được kết quả thích hợp.

    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

Chức năng này sẽ hoạt động tùy theo cài đặt tiền tệ và ngôn ngữ:

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

Điều này giả sử bạn biết ký tự dấu thập phân (trong trường hợp của tôi, miền địa phương được đặt từ PHP, vì vậy tôi lấy nó bằng <?php echo cms_function_to_get_decimal_point(); ?>).


0

Điều này làm việc cho tôi và bao gồm hầu hết các trường hợp cạnh :)

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.