มีเคล็ดลับในการเพิ่มเครื่องหมายจุลภาคในจำนวนมากหรือไม่?


201

มีวิธีให้พิมพ์รางรถไฟด้วยตัวเลขด้วยเครื่องหมายจุลภาคหรือไม่?

ตัวอย่างเช่นถ้าฉันมีตัวเลข 54000000.34 ฉันสามารถเรียกใช้ <% = number.function%> ซึ่งจะพิมพ์ออกมา "54,000,000.34"

ขอบคุณ!

คำตอบ:


353

คุณต้องการnumber_with_delimiterวิธีการ ตัวอย่างเช่น:

<%= number_with_delimiter(@number, :delimiter => ',') %>

อีกวิธีหนึ่งคุณสามารถใช้number_with_precisionวิธีการเพื่อให้แน่ใจว่าตัวเลขจะแสดงด้วยความแม่นยำทศนิยมสองตำแหน่งเสมอ:

<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>

5
@Mo เป็นวิธีดูวิธีใช้ คุณควรจะสามารถใช้มันจากโมดูลโดยรวมถึงActionView::Helpers::NumberHelperภายในโมดูล
John Topley

9
ฉันเชื่อว่าโดยค่าเริ่มต้นตัวคั่นเป็นเครื่องหมายจุลภาคดังนั้นคุณไม่จำเป็นต้องผ่านตัวเลือกนั้นในกรณีนี้
Deekor

3
คุณควรปล่อยตัวคั่นไว้เพื่อให้โลแคลปัจจุบันสามารถตัดสินใจว่าจะใช้อะไร สิ่งนี้อนุญาตให้โลแคลที่ใช้ระยะเวลาสำหรับตัวคั่นแสดงอย่างถูกต้องแทนที่จะวางสิ่งที่พวกเขาจะพิจารณาเป็นจุดทศนิยมระหว่างพัน ดูคำตอบ coloradoblue ด้านล่าง
Kyle Heironimus

1
ไวยากรณ์ Rails 4: <% = number_with_precision (@ ตัวเลข, ความแม่นยำ: 0, ตัวคั่น: ',')%>
Choylton B. Higginbottom

2
ระวัง: number_with_delimiterซับซ้อนเกินไปและช้ามาก ๆ ด้วยความลึกของการโทรที่มาก มันใช้i18nเพื่อจัดรูปแบบตัวเลขใด ๆ ที่เป็นที่รู้จักของมนุษยชาติและอารยธรรมนอกโลก (หรืออาจเป็นเพียงการเลือกอย่างใดอย่างหนึ่ง,หรือ.สำหรับตัวเลขทศนิยมแม้ว่าคุณจะระบุว่าเป็นอาร์กิวเมนต์) มันจัดสรรวัตถุหลายพันรายการ (ดังนั้นรูปแบบประสิทธิภาพจึงซับซ้อนและยากต่อการสร้างโปรไฟล์) พิจารณาเพียงแค่ใช้ regexps หากคุณไม่ต้องการสนับสนุนวิธีการจัดรูปแบบตัวเลขต่าง ๆ ตามสถานที่
kolen

133

สำหรับทุกคนที่ไม่ได้ใช้ราง:

number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse

2
ดี และคำตอบของคุณดูเหมือนว่าจะพิถีพิถัน (เพียงเศษเสี้ยวของวินาทีกว่าหนึ่งล้านซ้ำ a) ได้เร็วกว่าวิธีการที่นำเสนอที่นี่ :number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
user664833

คุณช่วยอธิบายสิ่งที่เกิดขึ้นที่นี่ได้ไหม number.to_s.reverse.gsub (/ (\ d {3}) (? = \ d) /, '\\ 1,'). reverse
Stephen Nguyen

7
แน่นอนว่ามันจะย้อนกลับสตริงจากนั้นเพิ่มเครื่องหมายจุลภาคหลังจากลำดับ 3 หลักใด ๆ ที่ตามด้วยตัวเลขอื่นแล้วกลับรายการ
pguardiario

1
@renosis - ฉันเห็นสิ่งที่คุณหมายถึงตอนนี้สำหรับการจัดรูปแบบสกุลเงิน 2 ทศนิยมดังนั้นไม่ใช่ 7
pguardiario

2
@pguardiario มีอะไรพิเศษ \ สำหรับใน \\ 1 ไม่\1เพียงพอหรือ ขอบคุณ
butterywombat

31

วิธีโดยตรงในการทำเช่นนี้ไม่ว่าจะมีหรือไม่มี Railsก็คือ:

require 'active_support/core_ext/numeric/conversions'

12345.to_s(:delimited)      # => "12,345"
12345.6789.to_s(:delimited) # => "12,345.6789"

สำหรับตัวเลือกเพิ่มเติมโปรดดูที่การใช้งานการสนับสนุนหลักส่วนขยาย - ตัวเลข - การจัดรูปแบบ


1
และด้วยการรวมนี้คุณสามารถใช้ActiveSupport::NumberHelper.number_to_delimitedเช่นกัน คำตอบนี้สมควรได้รับการโหวตมากขึ้น
Ulysse BN

30

ใช่ใช้NumberHelper วิธีการที่คุณกำลังมองหาคือnumber_with_delimiter

 number_with_delimiter(98765432.98, :delimiter => ",", :separator => ".")
 # => 98,765,432.98

24

หากคุณต้องการเพิ่มเครื่องหมายจุลภาคนอกมุมมองและคุณไม่ต้องการรวมบางโมดูลคุณสามารถใช้วิธีnumber_to_delimited (รุ่นราง> = 4.02) ตัวอย่างเช่น:

#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"

19

หากคุณทำมันมาก แต่ก็เป็น FYI ด้วยเพราะมันไม่ได้บอกเป็นนัยว่า Rails มีค่าเริ่มต้นที่สมเหตุสมผลสำหรับnumber_with_delimiterวิธีนี้

#inside controller or view
number_with_delimiter(2444323.4)
#=> 2,444,323.30

#inside console
helper.number_with_delimiter(233423)
#=> 233,423

ไม่จำเป็นต้องระบุค่าตัวคั่นหากคุณใช้วิธีปกติที่สุด


สิ่งนี้มีประโยชน์เพิ่มเติมในการใช้สถานที่ปัจจุบัน สิ่งนี้สำคัญมากในแอพสากลเนื่องจากบางแห่งใช้เครื่องหมายจุลภาคสำหรับทศนิยมและระยะเวลาสำหรับตัวคั่นหลักพัน
Kyle Heironimus

16

วิธีที่ดีกว่าสำหรับผู้ที่ไม่ได้ใช้รางที่จัดการกับทศนิยม:

parts = number.to_s.split('.')
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
parts.join('.')

หากคุณต้องการตัวคั่นอื่นให้เปลี่ยน ',' สุดท้ายใน regex

สำหรับโบนัสนี่คือการทำงานของ regex:

  • gsub แทนที่ทุกอย่างที่ตรงกับ regex ด้วยพารามิเตอร์ที่สองส่งผ่านไปยัง gsub \\1ในกรณีนี้ว่าเป็น \\1กลายเป็น\1เมื่อประเมินซึ่งตรงกับกลุ่มการจับภาพแรกใน regex ใน regex (\d)นี้ว่าเป็น
  • (\d)(?=(\d\d\d)+)กำลังจับคู่ตัวเลขตามด้วยกลุ่มอย่างน้อย 3 กลุ่ม ชุดแรกเป็นของเรา parens กลุ่มการจับภาพที่สองจะเป็น\1 \2หากเราเพียงปล่อยไว้ที่เราจะได้รับ: 123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456นี่เป็นเพราะ 1234 แมทช์, 2345 แมตช์และ 3456 แมตช์ดังนั้นเราจึงใส่คอมม่าหลัง 1, 2 และ 3
  • ด้วยการเพิ่ม (?! \ d) เรากำลังจับคู่สิ่งใด ๆ ที่เกิดขึ้นก่อนหน้านี้ซึ่งไม่ได้นำหน้าตัวเลขดังนั้น(\d)(?=(\d\d\d)+(?!\d))หมายถึงการจับคู่ตัวเลขตามด้วยตัวเลข 3 ตัวที่ไม่ได้ตามด้วยตัวเลข เหตุผลที่ใช้งานได้คือ gsub จะทำการแทนที่สิ่งที่ตรงกับสตริง ถ้าเราจะแทนที่การแข่งขันนัดแรกเท่านั้นสำหรับตัวเลขอย่าง 123456789 เราจะได้ 123456,789 ตั้งแต่ 123456,789 ยังคงตรงกับ regex ของเราเราได้รับ 123,456,789

นี่คือที่ที่ฉันได้รับรหัส: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/number_helper.rb#L298-L300

และนี่คือที่ฉันเรียนรู้เกี่ยวกับสิ่งที่เกิดขึ้นใน regex: http://www.tutorialspoint.com/ruby/ruby_regular_expressions.htm


ใช้งานได้อย่างมีเสน่ห์โดยเฉพาะในเทมเพลตเหลว lang:{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
Kukunin

2

โซลูชันอื่นที่ไม่ได้ใช้ Helpers: จัดรูปแบบด้วยทศนิยม 2 ตำแหน่งจากนั้นแทนที่ โดย

puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57

1
ฉันเชื่อว่าคำถามเกี่ยวกับเครื่องหมายจุลภาคสำหรับการจัดกลุ่มหลักไม่ใช่เครื่องหมายจุลภาคเป็นตัวคั่นทศนิยมระหว่างส่วน / ส่วนเศษส่วนที่คำตอบของคุณประสบความสำเร็จ (ในฐานะที่เชื่อมโยงวิกิพีเดียอธิบายเนื่องจากความสับสนยาวนานมาตรฐาน Internetional ตอนนี้ขอแนะนำให้พื้นที่เฉพาะสำหรับการจัดกลุ่มหลัก)
Beni Cherniavsky-ร์กพาสกิน

1

คุณสามารถใช้วิธีการจาก ActiveSupport

ตัวอย่างเช่น:

ActiveSupport::NumberHelper::number_to_currency(10000.1234,{precision: 2,unit: ''})


1
  def add_commas(numstring)
    correct_idxs = (1..100).to_a.select{|n| n % 6 == 0}.map{|n| n - 1}
     numstring.reverse.chars.join(",").chars.select.with_index{|x, i| i.even? || correct_idxs.include?(i)}.join.reverse
  end

นี่เป็นวิธีของฉันในทับทิม

การแก้ไขเพิ่มเติม: โดยพื้นฐานแล้วมันจะเพิ่มเครื่องหมายจุลภาคทั้งหมดระหว่างตัวเลขและเลือกเฉพาะดัชนีที่ + 1% 6

ฉันคิดว่าเครื่องหมายจุลภาคสูงถึง 100 ก็ดี แต่ถ้าคุณต้องการจำนวนที่ยาวมากเพียงแค่ทำ 100 ให้สูงขึ้น


0

ไวยากรณ์ใหม่

number_with_delimeter(@number, delimeter: ",")

หากคุณต้องการให้ผู้ใช้วัดค่าเงินคุณสามารถทำได้

number_to_currency(@number)

จะเพิ่ม$เช่นกัน หากคุณใช้moneyอัญมณีคุณสามารถทำได้

Money.new(@number,"USD").format

$นอกจากนี้ยังจะนำ

number_with_delimiter

เงินทับทิม

number_to_currency


0

เคล็ดลับต่อไปนี้สำหรับทั้งตัวคั่นและความแม่นยำ (การอ้างอิง API )

ActiveSupport::NumberHelper.number_to_rounded(1234.532, delimiter: ',', precision: 1) 

(หรือจากมุมมองเพียงแค่number_to_roundedไม่จำเป็นต้องมีคำต่อท้าย)

HTH


-1

สำหรับคนจาวาสคริปต์

function numberWithDelimiter(value) {
    return (value+"").split("").reverse().join("").replace(/(\d{3})(?=\d)/g, '$1,').split("").reverse().join("")
}

:)

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