2009-05-08 12 views
33

मैं एक फ़्लोटिंग पॉइंट नंबर को सुंदर रूप से स्वरूपित कर रहा हूं लेकिन यदि कोई प्रासंगिक फ़्लोटिंग पॉइंट नंबर नहीं है तो यह एक पूर्णांक के रूप में दिखाई देना चाहता है।फ़्लोटिंग पॉइंट घटक नहीं है तो केवल दशमलव बिंदु दिखाएं .00 sprintf/printf

आईई।

  • 1,20 -> 1.2x
  • 1.78 -> 1.78x
  • 0.80 -> 0.8x
  • 2.00 -> 2x

मैं regex का एक सा के साथ इस लक्ष्य को हासिल कर सकते हैं लेकिन क्या सोच रहा है कि sprintf है - ऐसा करने का एकमात्र तरीका?

मैं बहुत की तरह गहरे लाल रंग का में नहीं बल्कि lazily यह कर रहा हूँ:

("%0.2fx" % (factor/100.0)).gsub(/\.?0+x$/,'x') 
+0

4 साल बाद तार के बजाय संख्या हो और मैंने महसूस किया कि Regexp आसानी से भ्रामक है। '.gsub (/ (\। 0 +)? x /, 'x')' शायद बेहतर है ... –

उत्तर

44

आप %g बजाय %f उपयोग करना चाहते हैं:

"%gx" % (factor/100.00) 
+1

भयानक। मेरे परिदृश्य में अच्छी तरह से काम करता है। दुर्भाग्यवश ऐसा लगता है कि "% .3gx" काम नहीं करता है जैसा कि मैं उम्मीद करता हूं। 3 कुल अंक है, दशमलव बिंदु के बाद अधिकतम अंक नहीं। इसका मतलब है कि 2.12345 2.12 होगा लेकिन 22.12345 22.12 के बजाय 22.1 होगा।सौभाग्य से मेरे परिदृश्य में इससे कोई फर्क नहीं पड़ता, लेकिन क्या आप इसके आसपास एक रास्ता जानते हैं? –

+5

% g के साथ स्वरूपण या तो संख्या का 'प्राकृतिक' प्रतिनिधित्व (शून्य का पीछा किए बिना) या वैज्ञानिक प्रतिनिधित्व (जो भी छोटा हो, मूल रूप से) देगा। % .3g, जैसा कि आपने इंगित किया है, दशमलव बिंदु के बाद अंकों की संख्या निर्धारित करने के बजाय अंकों की कुल संख्या 3 को सेट करता है। यदि आप दशमलव बिंदु के बाद अंकों की संख्या को नियंत्रित करना चाहते हैं तो आपको% f का उपयोग करने की आवश्यकता है, क्योंकि% .3f दशमलव बिंदु के बाद 3 अंक निर्दिष्ट करता है (यदि आवश्यक हो तो 0 के साथ पैडिंग)। दुर्भाग्यवश, मुझे इन दो विकल्पों को मिश्रण और मिलान करने का तरीका पता नहीं है। – Naaff

2

मैं सिर्फ यह भर में आया था, फ्लॉप काम ऊपर फिक्स, लेकिन मैं इसके साथ आया, जो मेरे लिए काम करता है:

def format_data(data_element) 
    # if the number is an in, dont show trailing zeros 
    if data_element.to_i == data_element 
     return "%i" % data_element 
    else 
    # otherwise show 2 decimals 
     return "%.2f" % data_element 
    end 
end 
26

आप एक मिश्रण कर सकते हैं घ मैच% ग्राम और% च तो जैसे:

"%g" % ("%.2f" % number) 
2

यहाँ एक और तरीका है:

decimal_precision = 2 
"%.#{x.truncate.to_s.size + decimal_precision}g" % x 

या एक अच्छा एक लाइनर के रूप में:

"%.#{x.truncate.to_s.size + 2}g" % x 
15

आप रेल उपयोग कर रहे हैं, आप रेल की संख्या का उपयोग कर सकते हैं हेल्पर विधियों: http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html

number_to_human(a, precision: 6, strip_insignificant_zeros: true) 

, सावधान रहें क्योंकि परिशुद्धता (पहले और दशमलव बिंदु के बाद वाले) सभी अंक का मतलब है

-2

मैं एक समारोह काटना (नहीं अनुमानित) ऑन रेल्स एक नाव या रूबी में दशमलव संख्या के लिए देख रहा था, मैं यह पता लगाने का पालन

तुम लोग, उदाहरण आपके कंसोल में की कोशिश कर सकते हैं:: समाधान करने के लिए

>> a=8.88 
>> (Integer(a*10))*0.10 
>> 8.8 

मुझे आशा है कि यह किसी को मदद मिलती है। :-)

4

मैं

price = price.round(precision) 
price = price % 1 == 0 ? price.to_i : price.to_f 

इस तरह के साथ समाप्त हो गया आप भी