มีวิธีให้พิมพ์รางรถไฟด้วยตัวเลขด้วยเครื่องหมายจุลภาคหรือไม่?
ตัวอย่างเช่นถ้าฉันมีตัวเลข 54000000.34 ฉันสามารถเรียกใช้ <% = number.function%> ซึ่งจะพิมพ์ออกมา "54,000,000.34"
ขอบคุณ!
มีวิธีให้พิมพ์รางรถไฟด้วยตัวเลขด้วยเครื่องหมายจุลภาคหรือไม่?
ตัวอย่างเช่นถ้าฉันมีตัวเลข 54000000.34 ฉันสามารถเรียกใช้ <% = number.function%> ซึ่งจะพิมพ์ออกมา "54,000,000.34"
ขอบคุณ!
คำตอบ:
คุณต้องการnumber_with_delimiter
วิธีการ ตัวอย่างเช่น:
<%= number_with_delimiter(@number, :delimiter => ',') %>
อีกวิธีหนึ่งคุณสามารถใช้number_with_precision
วิธีการเพื่อให้แน่ใจว่าตัวเลขจะแสดงด้วยความแม่นยำทศนิยมสองตำแหน่งเสมอ:
<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
number_with_delimiter
ซับซ้อนเกินไปและช้ามาก ๆ ด้วยความลึกของการโทรที่มาก มันใช้i18n
เพื่อจัดรูปแบบตัวเลขใด ๆ ที่เป็นที่รู้จักของมนุษยชาติและอารยธรรมนอกโลก (หรืออาจเป็นเพียงการเลือกอย่างใดอย่างหนึ่ง,
หรือ.
สำหรับตัวเลขทศนิยมแม้ว่าคุณจะระบุว่าเป็นอาร์กิวเมนต์) มันจัดสรรวัตถุหลายพันรายการ (ดังนั้นรูปแบบประสิทธิภาพจึงซับซ้อนและยากต่อการสร้างโปรไฟล์) พิจารณาเพียงแค่ใช้ regexps หากคุณไม่ต้องการสนับสนุนวิธีการจัดรูปแบบตัวเลขต่าง ๆ ตามสถานที่
สำหรับทุกคนที่ไม่ได้ใช้ราง:
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
\1
เพียงพอหรือ ขอบคุณ
วิธีโดยตรงในการทำเช่นนี้ไม่ว่าจะมีหรือไม่มี Railsก็คือ:
require 'active_support/core_ext/numeric/conversions'
12345.to_s(:delimited) # => "12,345"
12345.6789.to_s(:delimited) # => "12,345.6789"
สำหรับตัวเลือกเพิ่มเติมโปรดดูที่การใช้งานการสนับสนุนหลักส่วนขยาย - ตัวเลข - การจัดรูปแบบ
ActiveSupport::NumberHelper.number_to_delimited
เช่นกัน คำตอบนี้สมควรได้รับการโหวตมากขึ้น
หากคุณต้องการเพิ่มเครื่องหมายจุลภาคนอกมุมมองและคุณไม่ต้องการรวมบางโมดูลคุณสามารถใช้วิธีnumber_to_delimited (รุ่นราง> = 4.02) ตัวอย่างเช่น:
#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"
หากคุณทำมันมาก แต่ก็เป็น 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
ไม่จำเป็นต้องระบุค่าตัวคั่นหากคุณใช้วิธีปกติที่สุด
วิธีที่ดีกว่าสำหรับผู้ที่ไม่ได้ใช้รางที่จัดการกับทศนิยม:
parts = number.to_s.split('.')
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
parts.join('.')
หากคุณต้องการตัวคั่นอื่นให้เปลี่ยน ',' สุดท้ายใน regex
สำหรับโบนัสนี่คือการทำงานของ regex:
\\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))
หมายถึงการจับคู่ตัวเลขตามด้วยตัวเลข 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
{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
โซลูชันอื่นที่ไม่ได้ใช้ Helpers: จัดรูปแบบด้วยทศนิยม 2 ตำแหน่งจากนั้นแทนที่ โดย
puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57
คุณสามารถใช้วิธีการจาก ActiveSupport
ตัวอย่างเช่น:
ActiveSupport::NumberHelper::number_to_currency(10000.1234,{precision: 2,unit: ''})
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 ให้สูงขึ้น
ไวยากรณ์ใหม่
number_with_delimeter(@number, delimeter: ",")
หากคุณต้องการให้ผู้ใช้วัดค่าเงินคุณสามารถทำได้
number_to_currency(@number)
จะเพิ่ม$
เช่นกัน หากคุณใช้money
อัญมณีคุณสามารถทำได้
Money.new(@number,"USD").format
$
นอกจากนี้ยังจะนำ
เคล็ดลับต่อไปนี้สำหรับทั้งตัวคั่นและความแม่นยำ (การอ้างอิง API )
ActiveSupport::NumberHelper.number_to_rounded(1234.532, delimiter: ',', precision: 1)
(หรือจากมุมมองเพียงแค่number_to_rounded
ไม่จำเป็นต้องมีคำต่อท้าย)
HTH
สำหรับคนจาวาสคริปต์
function numberWithDelimiter(value) {
return (value+"").split("").reverse().join("").replace(/(\d{3})(?=\d)/g, '$1,').split("").reverse().join("")
}
:)
ActionView::Helpers::NumberHelper
ภายในโมดูล