แปลงสตริงด้วยลูกน้ำเป็นจำนวนเต็ม


95

มีวิธีการใด ๆ ที่เป็นระเบียบในการแปลง "1,112" เป็นจำนวนเต็ม 1112 แทนที่จะเป็น 1 หรือไม่

ฉันมีหนึ่งอัน แต่ไม่เรียบร้อย:

"1,112".split(',').join.to_i #=> 1112

คำตอบ:


176

แล้วเรื่องนี้ล่ะ?

 "1,112".delete(',').to_i

ขอบคุณสำหรับคำตอบ. มันดีกว่าของฉันมาก อันที่จริงฉันหวังว่าจะมีหนึ่งสายแทนที่จะเป็นสอง เช่น: "1,112" .to_money หลังจากตรวจสอบคำตอบแล้วน่าจะไม่มีวิธีการดังกล่าว ยังไงก็ขอบคุณมาก!
mCY

@michealKohi คุณบอกฉันได้ไหมว่าทำไมการลบ () เร็วกว่าการทำแบบเดียวกันใน gsub ซึ่งยอมรับ regex ฉันคิดเสมอว่าวิธี regex เร็วกว่า ฉันใช้ Benchmark ทั้งสองอย่างในเรื่องเวลาดำเนินการที่แตกต่างกันมาก
Abhinay

1
@Abhinay เกี่ยวกับเครื่องหมายม้านั่งของคุณ: ขนาดตัวอย่าง? ขนาดสตริง?
Michael Kohl

5

นอกจากนี้คุณอาจต้องการตรวจสอบให้แน่ใจว่ารหัสของคุณแปลถูกต้องหรือตรวจสอบให้แน่ใจว่าผู้ใช้คุ้นเคยกับสัญกรณ์ "สากล" ตัวอย่างเช่น "1,112" หมายถึงตัวเลขที่แตกต่างกันในประเทศต่างๆ ในเยอรมนีหมายถึงตัวเลขมากกว่าหนึ่งเล็กน้อยแทนที่จะเป็นหนึ่งพันและบางอย่าง

สอดคล้องบทความวิกิพีเดียที่http://en.wikipedia.org/wiki/Decimal_mark ดูเหมือนว่าจะเขียนได้ไม่ดีในเวลานี้ ตัวอย่างเช่นในฐานะคนจีนฉันไม่แน่ใจว่าคำอธิบายเกี่ยวกับตัวคั่นหลักพันในจีนมาจากไหน


4

สะดวกขึ้นบ้าง

"1,1200.00".gsub(/[^0-9]/,'') 

ทำให้ "1 200200" ทำงานได้อย่างถูกต้องเช่นกัน


8
'1,1200.00'.gsub(/[^0-9\.]/,'').to_fดียิ่งขึ้นคือ
Hauleth

7
เดี๋ยวก่อนทำไมคุณถึงต้องการแปลง"1,1200.00"เป็น"1120000"? คุณไม่เพียงต้องการแทนที่,(หรือขึ้นอยู่กับสถานที่.)? นอกจากนี้สิ่งนี้ไม่ได้แปลงเป็นจำนวนเต็มหรือทศนิยมเป็นเพียงสตริงที่ไม่มีตัวคั่น
brymck

3
@ ไบรอัน: ในการเสี่ยงทายคุณอาจต้องการทำสิ่งนี้ในแอปพลิเคชันธนาคารเมื่อแปลงจำนวนสกุลเงินที่ผู้ใช้ป้อนเพื่อจัดการกับจำนวนเต็มภายในแอปพลิเคชันเท่านั้นตัวอย่างเช่นการแปลงดอลลาร์และเซ็นต์เป็นเซนต์ . วิธีนี้จะหลีกเลี่ยงข้อผิดพลาดในการปัดเศษที่อาจเกิดขึ้นโดยไม่คาดคิดเมื่อจัดการกับตัวเลขทศนิยม เมื่อจำเป็นต้องแสดงจำนวนสกุลเงินให้กับผู้ใช้จำนวนเงินเซ็นต์สามารถแปลงเป็นดอลลาร์และเซนต์ได้ (แม้ว่านั่นจะไม่ใช่สิ่งที่ผู้ถามถาม)
Teemu Leisti

2
คำตอบนี้ไม่ได้ระบุถึงคำขอของผู้ถามในการแปลงสตริงเป็นจำนวนเต็มหรือทศนิยม
Mr. Lance E Sloan

2

ต่อไปนี้เป็นอีกวิธีหนึ่งที่ใช้ได้ผลแม้ว่าจะเหมือนกับวิธีอื่น ๆ ก็ตาม

a = 1,112
b = a.scan(/\d+/).join().to_i => 1112


1

หากมีคนต้องการย่อยมากกว่าจุลภาคฉันเป็นแฟนของ:

"1,200".chars.grep(/\d/).join.to_i

ไม่รู้เกี่ยวกับประสิทธิภาพ แต่มีความยืดหยุ่นมากกว่า a gsubกล่าวคือ:

"1-200".chars.grep(/\d/).join.to_i

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