วิธีแปลงสตริงเป็นทศนิยมใน JavaScript?


255

ฉันพยายามแยกค่าสองค่าจากดาตาแกรม ฟิลด์เป็นตัวเลขและเมื่อมีเครื่องหมายจุลภาค (เช่น 554,20) ฉันจะไม่สามารถรับตัวเลขหลังเครื่องหมายจุลภาค ฉันได้พยายามและparseInt parseFloatฉันจะทำสิ่งนี้ได้อย่างไร


ดูเพิ่มเติมได้ที่: stackoverflow.com/questions/24318654
dreftymac

คำตอบ:


371

หากพวกเขาตั้งใจที่จะแยกค่าลองนี้:

var values = "554,20".split(",")
var v1 = parseFloat(values[0])
var v2 = parseFloat(values[1])

หากพวกเขาตั้งใจที่จะเป็นค่าเดียว (เช่นในภาษาฝรั่งเศสที่ครึ่งหนึ่งเขียน 0,5)

var value = parseFloat("554,20".replace(",", "."));

6
สิ่งที่เกี่ยวกับที่คุณมีเครื่องหมายจุลภาคที่ใช้เป็นตัวคั่นหลักพัน? เช่น 1234 เขียนเป็น 1,234
Chris B

6
คุณสามารถลบเครื่องหมายจุลภาคแล้วแยกวิเคราะห์ (เช่นแทนที่ด้วย "")
Jesse Rusak

7
มันไม่ปลอดภัยอย่างที่ sconto = parseFloat ("5,, 5" .replace (",", ".")); ส่งกลับค่า 5 นำหน้าเพื่อให้เชื่อว่าเป็นหมายเลขที่ถูกต้อง แต่คุณปล่อยส่วนที่. 5 หลวมหรือคุณอาจคิดว่ามันไม่ใช่หมายเลขที่ถูกต้อง
max4ever

1
@ max4ever หากคุณกังวลเกี่ยวกับการยอมรับหมายเลขที่ไม่ถูกต้องคุณสามารถใช้+(string)แทนได้parseString(string)ตามที่ @Stev ด้านล่างแนะนำ v1 = +(values[0]); v2 = +(values[1]);ดังนั้นตัวอย่างแรกจะเป็น
Jesse Rusak

1
FAIL 6.000.000สิ่งที่ถ้าจำนวนของฉันคือ ฟังก์ชันแทนที่เฉพาะแทนที่เครื่องหมายจุลภาคแรก
GusDeCooL

55

คุณเคยลองทำเช่นนี้หรือไม่? : p

var str = '3.8';ie
alert( +(str) + 0.2 );

+ (สตริง) จะส่งสตริงลงในโฟลต

ที่มีประโยชน์!

ดังนั้นเพื่อแก้ปัญหาของคุณคุณสามารถทำสิ่งนี้:

var floatValue = +(str.replace(/,/,'.'));

7
ฉันชอบ+(str)วิธีแก้ปัญหามาก - parseFloatละเว้นอักขระที่ไม่ถูกต้องหลังตัวเลข+(str)กลับมาNaNในกรณีเหล่านั้นซึ่งเป็นสิ่งที่ฉันต้องการ
อเล็กซ์

34

แทนที่เครื่องหมายจุลภาคด้วยจุด

สิ่งนี้จะคืน 554 เท่านั้น:

var value = parseFloat("554,20")

สิ่งนี้จะส่งคืน 554.20:

var value = parseFloat("554.20")

ดังนั้นในที่สุดคุณสามารถใช้:

var fValue = parseFloat(document.getElementById("textfield").value.replace(",","."))

อย่าลืมว่าparseInt()ควรใช้เพื่อแยกเลขจำนวนเต็มเท่านั้น (ไม่มีคะแนนแบบลอย) ในกรณีของคุณมันจะคืนค่า 554 เท่านั้นนอกจากนี้การเรียก parseInt () บนโฟลตจะไม่ปัดเศษตัวเลข: มันจะใช้พื้นของมัน


ตัวอย่างเพิ่มเติมเพื่อตอบคำถามของ Pedro Ferreira จากความคิดเห็น:

หากฟิลด์ข้อความมีจุดคั่นหลายพันจุดเช่นเดียวกับในจุด1.234.567,99เหล่านั้นอาจถูกกำจัดไปก่อนด้วยจุดอื่นreplace:

var fValue = parseFloat(document.getElementById("textfield").value.replace(/\./g,"").replace(",","."))

สิ่งที่เกี่ยวกับ "." คั่นหลักพัน เช่นเดียวกับ 4.554,20 สิ่งที่จะกลับมา ...
Pedro Ferreira

16

หากคุณขยายวัตถุ String เช่นนี้ ..

String.prototype.float = function() { 
  return parseFloat(this.replace(',', '.')); 
}

.. คุณสามารถเรียกใช้เช่นนี้

"554,20".float()
> 554.20

ทำงานร่วมกับจุดเช่นกัน

"554.20".float()
> 554.20

typeof "554,20".float()
> "number"

10
แม้ว่าโดยปกติแล้วจะถือว่าเป็นรูปแบบที่ไม่ดีในการปรับเปลี่ยนต้นแบบวัตถุพื้นฐาน เกิดอะไรขึ้นถ้าเฟรมเวิร์กอื่นพยายามทำเช่นนั้น แต่ฟังก์ชันการทำงานแตกต่างกันอย่างไร
phreakhead

3

@GusDeCool หรือใครก็ตามที่พยายามจะเข้ามาแทนที่มากกว่าหนึ่งพันคั่นวิธีหนึ่งที่จะทำมันเป็น regex /foo/gโลกแทนที่: เพียงจำไว้ว่า.มันเป็นเมทาเฟกต์ดังนั้นคุณต้องหลบหนีหรือใส่ไว้ในวงเล็บ ( \.หรือ[.]) นี่คือตัวเลือกหนึ่ง:

var str = '6.000.000';
str.replace(/[.]/g,",");

1
แท้จริงแล้วการแทนที่โดยไม่มี regex จะแทนที่หนึ่งอักขระเท่านั้น
Aukhan

2

คุณสามารถใช้ฟังก์ชั่นนี้ มันจะแทนที่เครื่องหมายจุลภาคด้วย '' และจากนั้นมันจะแยกวิเคราะห์ค่าและหลังจากนั้นจะปรับเครื่องหมายจุลภาคเป็นค่าอีกครั้ง

function convertToFloat(val) {
        if (val != '') {
            if (val.indexOf(',') !== -1)
                val.replace(',', '');
            val = parseFloat(val);
            while (/(\d+)(\d{3})/.test(val.toString())) {
                val = val.toString().replace(/(\d+)(\d{3})/, '$1' + ',' + '$2');
            }
        }
        return val;
    }

0

ฉันมีปัญหาเดียวกันยกเว้นฉันไม่ทราบล่วงหน้าว่าตัวคั่นหลักพันและตัวแยกทศนิยมคืออะไร ฉันลงเอยด้วยการเขียนห้องสมุดเพื่อทำสิ่งนี้ หากคุณสนใจที่นี่ก็คือ: https://github.com/GuillaumeLeclerc/number-parsing


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.