वहाँ बड़ी संख्या में अल्पविराम जोड़ने के लिए एक रेल चाल है?


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
@ यह एक दृश्य सहायक विधि है। आपको मॉड्यूल के ActionView::Helpers::NumberHelperभीतर शामिल करके इसे मॉड्यूल से उपयोग करने में सक्षम होना चाहिए ।
जॉन टॉपले

9
मेरा मानना ​​है कि डिफ़ॉल्ट रूप से सीमांकक एक अल्पविराम है इसलिए आपको इस मामले में उस विकल्प को पारित करने की आवश्यकता नहीं होगी।
डेकोर

3
आपको सीमांकक को छोड़ देना चाहिए ताकि वर्तमान लोकेल तय कर सके कि क्या उपयोग करना है। यह उन स्थानों को अनुमति देता है जो हजारों के बीच एक दशमलव बिंदु पर विचार करने के बजाय परिसीमन के लिए अवधियों का उपयोग ठीक से प्रदर्शित करने के लिए करते हैं। नीचे देखें कलरडोब्लू उत्तर।
काइल हिरोनिमस

1
रेल्स 4 सिंटैक्स: <% = number_with_preaches (@number, परिशुद्धता: 0, सीमांकक: ',')%>
चॉयलटन बी। हिगिनबॉटम

2
खबरदार: number_with_delimiterअत्यधिक जटिल और वास्तव में धीमी है, कॉल स्टैक की भारी गहराई के साथ। इसका उपयोग i18nमानवता और अलौकिक सभ्यताओं (या शायद सिर्फ ,या तो या .दशमलव अंकों के लिए चुनने के लिए किया जाता है, भले ही आप इसे तर्क के रूप में निर्दिष्ट करें) को ज्ञात करने में सक्षम हों । यह हजारों वस्तुओं को आवंटित करता है (इसलिए इसका प्रदर्शन पैटर्न जटिल और प्रोफ़ाइल के लिए कठिन है)। यदि आप लोकेल के आधार पर संख्याओं को प्रारूपित करने के लिए अलग-अलग तरीकों का समर्थन करने की आवश्यकता नहीं है, तो केवल रेगेक्स का उपयोग करने पर विचार करें।
13

133

रेल का उपयोग नहीं करने वाले किसी के लिए:

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

2
अच्छा लगा। और आपका जवाब हो रहा है प्रतिमिनट (केवल एक लाख पुनरावृत्तियों पर एक दूसरे के एक अंश) तेजी से दृष्टिकोण से प्रस्तुत यहाँ :number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
user664833

क्या आप बता सकते हैं कि यहाँ क्या चल रहा है? number.to_s.reverse.gsub (/ (\ d {3}) (? = \ d) /, '\\ 1,') रिवर्स।
स्टीफन गुयेन

7
ज़रूर, यह स्ट्रिंग को उलट देता है, फिर 3 अंकों के किसी भी अनुक्रम के बाद एक अल्पविराम जोड़ता है जो किसी अन्य अंक के बाद भी होता है, फिर इसे वापस उलट देता है।
पगडियारियो

1
@renosis - मैं देख रहा हूं कि अब आपका क्या मतलब है, यह मुद्रा प्रारूपण के लिए है। तो 2 दशमलव, नहीं 7.
पिडिसारियो

2
@pguardiario \\ 1 में क्या अतिरिक्त है? \1पर्याप्त नहीं है ? धन्यवाद।
बटरवायम्बैट

31

ऐसा करने का सीधा तरीका, रेल के साथ या उसके बिना है:

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। यह उत्तर बहुत अधिक उत्थान के लायक है।
यूलसीस बीएन


24

यदि आप विचारों के बाहर अल्पविराम जोड़ना चाहते हैं और आप कुछ मॉड्यूल शामिल नहीं करना चाहते हैं, तो आप नंबर_to_delimited विधि (रेल संस्करण> = 4.02) का उपयोग कर सकते हैं । उदाहरण के लिए:

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

19

यदि आप इसे बहुत कुछ कर रहे हैं, लेकिन यह भी FYI करें क्योंकि यह ऊपर से निहित नहीं है, तो रेल्स के पास 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

यदि आप इसे सबसे विशिष्ट तरीके से कर रहे हैं, तो सीमांकक मूल्य की आपूर्ति करने की आवश्यकता नहीं है।


यह वर्तमान स्थान का उपयोग करने का अतिरिक्त लाभ है। यह अंतर्राष्ट्रीय ऐप्स में वास्तव में महत्वपूर्ण है क्योंकि कुछ स्थान हजारों विभाजक के लिए दशमलव और अवधि के लिए अल्पविराम का उपयोग करते हैं।
काइल हिरोनिमस

16

उन रेलों का उपयोग न करने का एक बेहतर तरीका जो दशमलव को संभालते हैं:

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

यदि आप भिन्न परिसीमन चाहते हैं, तो अंतिम ',' को रेगेक्स में बदलें।

बोनस के लिए, यह है कि रेगेक्स कैसे काम कर रहा है:

  • gsub, रेसेक्स से मेल खाने वाली हर चीज को बदल देता है, जो gsub में दिए गए दूसरे पैरामीटर के साथ है। यह मामला है कि में \\1। जब मूल्यांकन किया \\1जाता \1है जो regex में पहले कैप्चर समूह से मेल खाता है। इस regex में है कि(\d)
  • (\d)(?=(\d\d\d)+)3 अंकों के 1 या अधिक समूहों के बाद एक अंक का मिलान कर रहा है। Parens का पहला सेट हमारा \1कब्जा समूह है, दूसरा होगा \2। अगर हम इसे उस पर छोड़ देते तो हमें यह मिल जाता: 123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456 यह इसलिए है क्योंकि १२३४ मैच, २३४५ मैच और ३४५६ मैच तो हमने १, २ और ३ के बाद कॉमा लगाया।
  • (!! D) जोड़कर हम कुछ भी जोड़ रहे हैं जो पहले आता है कि एक अंक से पहले नहीं होता है तो (\d)(?=(\d\d\d)+(?!\d))इसका मतलब है कि एक अंक का मिलान 3 अंकों से होता है जो कि एक अंक के बाद नहीं होता है। यह काम करने का कारण यह है कि gsub स्ट्रिंग से मेल खाने वाली चीजों को प्रतिस्थापित करता रहेगा। अगर हम केवल पहले मैच की जगह लेने वाले थे तो 123456789 जैसे नंबर के लिए हमें 123456,789 मिलेंगे। चूंकि 123456,789 अभी भी हमारे रेगेक्स से मेल खाता है इसलिए हमें 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_ अनियमित_expressions.htm


विशेष रूप से लिक्विड टेम्पलेट लैंग में एक आकर्षण की तरह काम करता है:{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
कुकुनिन

2

एक अन्य समाधान जो हेल्पर्स का उपयोग नहीं करता है: 2 दशमलव स्थानों के साथ प्रारूप करें, और फिर प्रतिस्थापित करें। द्वारा ,

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

1
मेरा मानना ​​है कि प्रश्न अंक समूह के लिए अल्पविराम के बारे में था , न कि अल्पविराम के रूप में जो कि आपके उत्तर को प्राप्त करता है। (जैसा कि विकी लिंक बताते हैं, लंबे समय तक भ्रम के कारण, इंटरनेट के मानक अब केवल अंक समूह के लिए रिक्त स्थान की सलाह देते हैं)
बेनी चेर्नियाव्स्की-पास्किन

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

निम्नलिखित दोनों सीमांकक और परिशुद्धता ( एपीआई रेफरी ) के लिए चाल है ।

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("")
}

:)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.