2009-02-17 61 views
181

Tôi có một hộp văn bản sẽ có một chuỗi tiền tệ trong đó sau đó tôi cần phải chuyển đổi chuỗi đó thành một đôi để thực hiện một số thao tác trên nó.Làm thế nào để chuyển đổi một chuỗi tiền tệ thành một đôi với jQuery hoặc Javascript?

"$ 1,100.00" -> 1100.00

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

Trả lời

359

Hủy bỏ tất cả dấu chấm không/chữ số:

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

dường như chuyển đổi hoàn hảo cho tôi, nhờ –

+0

+1 (Xin lỗi vì nhận xét trước đó, thực tế là bạn đã thực sự * không bao gồm * dấu chấm cũng không xảy ra với tôi vì một số lý do.) – Tomalak

+3

Một lý do khác khiến RegExp có thể thanh lịch. – OnesimusUnbound

3

Tôi biết bạn đã tìm thấy một giải pháp cho câu hỏi của bạn, tôi chỉ muốn khuyên rằng có lẽ bạn nhìn vào các plugin jQuery rộng hơn sau cho Định dạng số quốc tế:

International Number Formatter

3

Bạn có thể thử này

<script type="text/javascript"> 

var str="$1,112.12"; 
str = str.replace(",",""); 
str = str.replace("$",""); 
document.write(parseFloat(str)); 

</script> 
+4

sẽ không hoạt động, chỉ thay thế dấu phẩy đầu tiên. – Lee

15

sử dụng một regex để loại bỏ các Formating (đô la và dấu phẩy), và sử dụng parseFloat để chuyển đổi chuỗi đến một điểm nổi number.`

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

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

+6

Bạn sẽ ngạc nhiên và không hài lòng khi parseFloat ("151.20" * 100) cung cấp cho bạn 15119.999999999998 nhưng parseFloat ("151.40" * 100) cung cấp cho bạn 15140. Không bao giờ sử dụng parseFloat cho tiền. Sử dụng các thư viện cụ thể để xử lý tiền, chẳng hạn như accounting.js hoặc bất kỳ thư viện nào khác được đề xuất ở đây. – bambery

11

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

jQuery Globalize cung cấp khả năng phân tích cú pháp định dạng văn hóa cụ thể thành phao.

https://github.com/jquery/globalize

Cho một chuỗi "$ 13,042.00", và toàn cầu hóa thiết lập để en-US:

Globalize.culture("en-US"); 

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

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

chí này 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.

+0

bây giờ đây là câu trả lời thú vị, cảm ơn bạn! – YangombiUmpakati

3

Tôi biết đây là 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 "." dưới dạng dấu thập phân. Ví dụ: Ví dụ: nếu bạn cần làm việc với rúp Nga, chuỗi sẽ trông giống như sau: "1 000,00 chà".

Giải pháp của tôi kém thanh lịch hơn so với CMS, nhưng nó sẽ 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{2}))?\D*$/; 
var parts = cur_re.exec(currency); 
var number = parseFloat(parts[1].replace(/\D/,'')+'.'+(parts[2]?parts[2]:'00')); 

Giả định:

  • giá trị tiền tệ sử dụng ký hiệu thập phân
  • không có chữ số trong chuỗi mà 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 đoạn của nó *

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

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

+0

Cảm ơn bạn. Câu trả lời hay 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à - cho xu. Vì vậy, bạn có thể phân tích cú pháp các chuỗi như 1.000, - € quá. Đơn vị tiền tệ sẽ nằm trong các phần [1] hoặc một phần [4] và một phần [3] bao gồm các xu là số hoặc -. Hơn bạn có thể bình thường hóa chuỗi như bạn muốn. – CyberAleks

+0

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

19

accounting.js là cách để thực hiện. 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ó ở GitHub

+1

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ó. https://github.com/openexchangerates/accounting.js/issues – Ryan

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

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

use jquery.glob.js, 
    jQuery.glob.all.js 
0
$ 150.00 
    Fr. 150.00 
    € 689.00 

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

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

Trên biểu hiện thường xuyên sẽ loại bỏ tất cả những gì không phải là một chữ số hoặc một period.So Bạn có thể lấy chuỗi mà không cần ký hiệu tiền tệ nhưng trong trường hợp của "Fr. 150.00" nếu bạn an ủi cho đầu ra sau đó bạn sẽ nhận được giá như

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

    output will be like priceFloat : .150.00 

sai vì vậy bạn kiểm tra chỉ mục "." sau đó chia nhỏ và nhận được kết quả phù hợp.

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

Đây là chức năng của tôi. Làm việc với tất cả các đồng tiền ..

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ặc toFloat("1,100.00$")

2

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

// "10.000.500,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; 
} 
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; 
} 
Các vấn đề liên quan