วิธีแปลงสตริงสกุลเงินเป็น double ด้วย jQuery หรือ Javascript


237

ฉันมีกล่องข้อความที่จะมีสตริงสกุลเงินอยู่ในนั้นฉันต้องแปลงสตริงนั้นเป็น double เพื่อดำเนินการบางอย่างกับมัน

"$1,100.00"1100.00

สิ่งนี้ต้องเกิดขึ้นกับฝั่งไคลเอ็นต์ทั้งหมด ฉันไม่มีทางเลือกนอกจากปล่อยสตริงสกุลเงินเป็นสตริงสกุลเงินเป็นอินพุต แต่ต้องแปลง / แปลงเป็นคู่เพื่อให้สามารถดำเนินการทางคณิตศาสตร์ได้

คำตอบ:


480

ลบไม่ใช่ / จุดหลักทั้งหมด:

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

4
ดูเหมือนว่านี่จะทำงานเฉพาะเมื่อมีการ.00ต่อท้าย การเป็นตัวแทนที่ถูกต้องของสกุลเงินเช่น "$ 1100" และ "$ 1100" จะถูกลดขนาดลงสองคำสั่ง
Brian M. Hunt

19
โปรดทราบว่านี่ขึ้นอยู่กับสถานที่เช่นเดียวกับที่ใช้ภาษา ',' สำหรับทศนิยม (เช่น 1.100,00 €) ตำแหน่งที่ตั้งอื่น ๆ บางแห่งใช้ตัวเลขหลักที่แตกต่างกันต่อกลุ่ม (เช่น 3 ทศนิยม)
smola

8
เพื่อจัดการกับจำนวนลบในสตริงฉันได้เพิ่ม '-' ในรายการตัวอักษรเพื่อยอมรับเช่น. แทนที่ (/ [^ 0-9 - \.] + / g, "")
tonycoupland

4
นอกจากนี้โปรดทราบว่าแอปการบัญชีบางห่อตัวเลขในวงเล็บเพื่อแสดงค่าลบ เช่น: ($ 5.00) = - $ 5.00
Dave L

1
ฉันรู้ว่าฉันอาจจะหลายปีที่ผ่านมาเมื่อตอบกลับที่นี่ แต่คุณต้องระวังด้วยถ้า "currency = 0" คุณจะได้รับข้อผิดพลาดจาวาสคริปต์ที่บอกว่า currency.replace ไม่ใช่ฟังก์ชัน ฉันเพิ่งเพิ่มเช็คง่ายๆว่า currency = 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

ใช้ regex เพื่อลบ formating (ดอลล่าร์และคอมมา) และใช้ parseFloat เพื่อแปลงสตริงเป็นตัวเลขทศนิยม "

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

7
น่าสังเกตว่าคุณไม่ควรใช้ float สำหรับแอปพลิเคชัน 'Toy' ใด ๆ เมื่อเพิ่มสกุลเงินของคุณ คุณจะจบลงด้วยผลรวมไม่แน่นอน
พันธมิตร

6
คุณจะประหลาดใจและไม่มีความสุขเมื่อ parseFloat ("151.20" * 100) ให้คุณ 15119.999999999998 แต่ parseFloat ("151.40" * 100) ให้คุณ 15140 อย่าใช้ parseFloat เพื่อเงิน ใช้ไลบรารีเฉพาะสำหรับจัดการกับเงินเช่น accounting.js หรืออื่น ๆ ที่แนะนำที่นี่
bambery

15

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ต้องการให้ตัวเลือกเพิ่มเติม

jQuery Globalize ให้ความสามารถในการวิเคราะห์รูปแบบเฉพาะของวัฒนธรรมเพื่อการลอย

https://github.com/jquery/globalize

รับสตริง "$ 13,042.00" และตั้งค่า Globalize เป็น en-US:

Globalize.culture("en-US");

คุณสามารถวิเคราะห์ค่าทศนิยมได้ดังนี้:

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

สิ่งนี้จะทำให้คุณ:

13042.00

และช่วยให้คุณสามารถทำงานร่วมกับวัฒนธรรมอื่น ๆ


10

ฉันรู้ว่านี่เป็นคำถามเก่า แต่คำตอบของ CMS ดูเหมือนจะมีข้อบกพร่องเล็ก ๆ น้อย ๆ เพียงอย่างเดียว: ใช้งานได้เฉพาะเมื่อรูปแบบสกุลเงินใช้ "" เป็นตัวแยกทศนิยม ตัวอย่างเช่นหากคุณต้องการทำงานกับรูเบิลรัสเซียสตริงจะมีลักษณะดังนี้: "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));

สมมติฐาน:

  • ค่าสกุลเงินใช้สัญกรณ์ทศนิยม
  • ไม่มีตัวเลขในสตริงที่ไม่ได้เป็นส่วนหนึ่งของค่าสกุลเงิน
  • ค่าสกุลเงินประกอบด้วย 0 หรือ 2 หลักในส่วนที่เป็นเศษส่วน *

regexp ยังสามารถจัดการบางอย่างเช่น "1,999 ดอลลาร์และ 99 เซ็นต์" แม้ว่ามันจะไม่ได้เป็นคุณสมบัติที่ตั้งใจและไม่ควรพึ่งพา

หวังว่านี่จะช่วยใครซักคน


ขอบคุณ. คำตอบที่ดีที่สุด เรียบง่ายและทรงพลัง ฉันจะใช้กับ (\ D *) (\ d. *? \ d) (?: \ D + (\ d {2} | -))? (\ D *) $ เพื่อรับสกุลเงินและ - สำหรับเซ็นต์ ดังนั้นคุณสามารถแยกสตริงได้เช่น 1.000 - €ด้วย สกุลเงินจะอยู่ในส่วน [1] หรือส่วน [4] และส่วน [3] รวมถึงเซนต์เป็นตัวเลขหรือ - กว่าที่คุณจะสามารถทำให้ปกติสตริงตามที่คุณต้องการ
CyberAleks

นี่มันแย่มากและอันตรายคูณด้วยจำนวนน้อยกว่า 10 ด้วย 100 ฉันใช้มันอย่างโง่ ๆ ก่อนทดสอบตัวเลขทั้งหมดด้วย :(
sheavens

@sheavens ขอบคุณสำหรับการรายงาน ขออภัยในการแก้ไขมันล่าช้า แต่เวอร์ชันใหม่ใช้งานได้จริงกับผลรวมเหล่านั้นด้วย
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

ฉันรู้ว่าคุณได้พบวิธีแก้ปัญหาสำหรับคำถามของคุณแล้วฉันอยากจะแนะนำว่าบางทีคุณอาจดูที่ปลั๊กอิน 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

ฉันได้ทดสอบสัญลักษณ์สกุลเงินสามข้อข้างต้นคุณสามารถทำเพื่อคนอื่นได้เช่นกัน

    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.