सी # डबल - टूस्ट्रिंग () दो दशमलव स्थानों के साथ स्वरूपण लेकिन कोई गोलाई नहीं


153

मैं C # में a Doubleका प्रारूप कैसे बनाऊं Stringताकि केवल दो दशमलव स्थान हों?

यदि मैं String.Format("{0:0.00}%", myDoubleValue)संख्या का उपयोग करता हूं तो गोल किया जाता है और मुझे बिना किसी गोलाई के एक सरल ट्रंकट चाहिए। मैं यह भी चाहता हूं कि रूपांतरण Stringसंस्कृति के प्रति संवेदनशील हो।


"संस्कृति संवेदनशील" से आपका क्या अभिप्राय है? इसका मतलब यह है कि एक प्रोग्रामर प्रदान की संस्कृति मूल्य के आधार पर स्वरूपण का परिणाम भिन्न होना चाहिए? या क्या आप वर्तमान थ्रेड के लिए जो भी संस्कृति डिफ़ॉल्ट है उसका उपयोग करना चाहते हैं?
सीजरगॉन

जवाबों:


204

मैं निम्नलिखित का उपयोग करता हूं:

double x = Math.Truncate(myDoubleValue * 100) / 100;

उदाहरण के लिए:

यदि संख्या 50.947563 है और आप निम्नलिखित का उपयोग करते हैं, तो निम्न होगा:

- Math.Truncate(50.947563 * 100) / 100;
- Math.Truncate(5094.7563) / 100;
- 5094 / 100
- 50.94

और आपका उत्तर छोटा है, अब स्ट्रिंग को प्रारूपित करने के लिए बस निम्नलिखित करें:

string s = string.Format("{0:N2}%", x); // No fear of rounding and takes the default number format

3
-1 string.Formatस्टेप को फॉर्मेट करने वाले कल्चर-सेंसिटिव फॉर्मेटिंग को आप उसी स्टेप में कर सकते हैं । नीचे मेरा जवाब देखें।
सेसरगॉन

1
एक दम बढ़िया। मुझे उम्मीद है कि मेरी टिप्पणी अब मूर्खतापूर्ण नहीं लगती। :-) मैं अपना डाउनवोट तब बदलूंगा।
सीजरगॉन

1
मेरे लिए यह किया, जैसा कि स्ट्रिंग प्रारूपण पर समाधान अविश्वसनीय रूप से सरल है, ट्रंकेशन अधिक मुश्किल था।
काइल रोसेन्डो

1
दुर्भाग्यवश, जब आपका नंबर 1 से कम होता है, तो यह बताने के लिए कि आपका समाधान काम नहीं करता: 0.97, क्या इस स्थिति के लिए कोई समाधान है?
अली दीघन

2
@ जॉनी जो काम नहीं करेगा क्योंकि वह गोल है - ओपी चाहता है कि यह छोटा हो (और गोल नहीं)। अंतर सूक्ष्म है।
BKSpurgeon

102

निम्नलिखित संख्याओं को गोल करता है, लेकिन केवल 2 दशमलव स्थानों (किसी भी अनुगामी शून्य को हटाने) को दिखाता है, धन्यवाद .##

decimal d0 = 24.154m;
decimal d1 = 24.155m;
decimal d2 = 24.1m;
decimal d3 = 24.0m;

d0.ToString("0.##");   //24.15
d1.ToString("0.##");   //24.16 (rounded up)
d2.ToString("0.##");   //24.1  
d3.ToString("0.##");   //24

http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/


12
यह काम नहीं करता है। इसे 0.2415999 के साथ आज़माएं। यह समाधान गोल है, न कि ट्रंकट्स।
BJury

5
वाह, इतने सारे वोट और अभी तक यह गोलाई का उपयोग कर रहा है। यह इंगित करना आवश्यक हो सकता है कि गोलाई अनुरोधित निकटतम दशमलव स्थान की ओर बढ़ रही है, जबकि निकटतम दशमलव स्थान के अनुरोध के बाद ट्रंकटिंग बंद हो रही है।
रहस्यवादी

1
@mysticcoder मुझे लगता है कि मेरे उत्तर को बहुत अधिक अपवित्रता मिलती है क्योंकि वे Google में ऑप्स प्रश्न पर आते हैं उसी तरह से मैंने किया था, अनुगामी शून्य को हटाने के लिए देख रहा था, और ऑप्स प्रश्न की गोल इच्छा की तलाश में नहीं था। मुझे लगता है कि मुझे अपना उत्तर हटा देना चाहिए ...
ब्रायन ओगडेन

@BrianOgden - नहीं, कृपया हटाएं नहीं। मैं आपके जवाब की तलाश में यहां पहुंचा। +1
रॉबर्टो

35

मेरा सुझाव है कि आप पहले काट-छाँट करें, और फिर प्रारूपित करें:

double a = 123.4567;
double aTruncated = Math.Truncate(a * 100) / 100;
CultureInfo ci = new CultureInfo("de-DE");
string s = string.Format(ci, "{0:0.00}%", aTruncated);

2 अंकों के ट्रंकट के लिए निरंतर 100 का उपयोग करें; दशमलव बिंदु के बाद अंक के रूप में अंकों के रूप में 1 के बाद 1 का उपयोग करें। उस संस्कृति नाम का उपयोग करें जिसे आपको स्वरूपण परिणाम को समायोजित करने की आवश्यकता है।


मुझे लगता है कि इसके बजाय new CultureInfo("de-DE"), आपको स्थिर संपत्ति का उपयोग करना चाहिएCulture.InvariantCulture
vchan


13

मैं price.ToString("0.00") अग्रणी 0s प्राप्त करने के लिए उपयोग करता हूं


6

केली रोजेंडो द्वारा व्यक्त सी # समारोह,:

string DecimalPlaceNoRounding(double d, int decimalPlaces = 2)
{
    d = d * Math.Pow(10, decimalPlaces);
    d = Math.Truncate(d);
    d = d / Math.Pow(10, decimalPlaces);
    return string.Format("{0:N" + Math.Abs(decimalPlaces) + "}", d);
}

5

कैसे एक अतिरिक्त दशमलव जोड़ने के लिए जिसे गोल किया जाए और फिर छोड़ दिया जाए:

var d = 0.241534545765;
var result1 = d.ToString("0.###%");

var result2 = result1.Remove(result1.Length - 1);

3
यह मजेदार है कि कैसे काम नहीं करने के जवाब में 60 वोट अप (आज के अनुसार) है, और यह बहुत ही सरल और बुलेटप्रूफ समाधान केवल एक ही है ....
आर्थर काजखानोव

5
यह इस मामले में काम नहीं करेगा कि कटिंग के ऊपर गोलाई एक से अधिक अंकों को प्रभावित करती है। उदाहरण के लिए 0.199999 0.19 के बजाय इस कोड के साथ 0.20 तक खत्म हो जाएगा।
बर्नम

4

यह मेरे लिए काम कर रहा है

string prouctPrice = Convert.ToDecimal(String.Format("{0:0.00}", Convert.ToDecimal(yourString))).ToString();

2

मुझे पता है कि यह एक पुराना धागा है लेकिन मुझे ऐसा करना पड़ा है। जबकि अन्य दृष्टिकोण यहाँ काम करते हैं, मैं एक आसान तरीका चाहता था जो बहुत सारे कॉल को प्रभावित कर सके string.format। इसलिए Math.Truncateसभी कॉल्स को जोड़ना वास्तव में एक अच्छा विकल्प नहीं था। साथ ही कुछ स्वरूपण डेटाबेस में संग्रहीत हैं, इसने इसे और भी बदतर बना दिया है।

इस प्रकार, मैंने एक कस्टम प्रारूप प्रदाता बनाया जो मुझे प्रारूपण स्ट्रिंग में ट्रंकेशन जोड़ने की अनुमति देगा, जैसे:

string.format(new FormatProvider(), "{0:T}", 1.1299); // 1.12
string.format(new FormatProvider(), "{0:T(3)", 1.12399); // 1.123
string.format(new FormatProvider(), "{0:T(1)0,000.0", 1000.9999); // 1,000.9

कार्यान्वयन बहुत सरल है और आसानी से अन्य आवश्यकताओं के लिए विस्तार योग्य है।

public class FormatProvider : IFormatProvider, ICustomFormatter
{
    public object GetFormat(Type formatType)
    {
        if (formatType == typeof (ICustomFormatter))
        {
            return this;
        }
        return null;
    }

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (arg == null || arg.GetType() != typeof (double))
        {
            try
            {
                return HandleOtherFormats(format, arg);
            }
            catch (FormatException e)
            {
                throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
            }
        }

        if (format.StartsWith("T"))
        {
            int dp = 2;
            int idx = 1;
            if (format.Length > 1)
            {
                if (format[1] == '(')
                {
                    int closeIdx = format.IndexOf(')');
                    if (closeIdx > 0)
                    {
                        if (int.TryParse(format.Substring(2, closeIdx - 2), out dp))
                        {
                            idx = closeIdx + 1;
                        }
                    }
                    else
                    {
                        throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
                    }
                }
            }
            double mult = Math.Pow(10, dp);
            arg = Math.Truncate((double)arg * mult) / mult;
            format = format.Substring(idx);
        }

        try
        {
            return HandleOtherFormats(format, arg);
        }
        catch (FormatException e)
        {
            throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
        }
    }

    private string HandleOtherFormats(string format, object arg)
    {
        if (arg is IFormattable)
        {
            return ((IFormattable) arg).ToString(format, CultureInfo.CurrentCulture);
        }
        return arg != null ? arg.ToString() : String.Empty;
    }
}


1

मुद्रा दिखाने के लिए क्या मूल्य है, आप इसका उपयोग कर सकते हैं "C":

double cost = 1.99;
m_CostText.text = cost.ToString("C"); /*C: format as currentcy */

आउटपुट: $1.99


0

आप अपना खुद का IFormatProvider भी लिख सकते हैं , हालांकि मुझे लगता है कि आपको वास्तविक ट्रंचेशन करने का तरीका सोचना होगा।

.NET फ्रेमवर्क भी कस्टम स्वरूपण का समर्थन करता है। इसमें आमतौर पर एक प्रारूपण वर्ग का निर्माण शामिल होता है जो IFormatProvider और ICustomFormatter दोनों को लागू करता है । (MSDN)

कम से कम यह आसानी से पुन: प्रयोज्य होगा।

वहाँ कैसे अपनी खुद की IFormatProvider / ICustomFormatter को लागू करने के बारे में एक लेख है CodeProject पर यहाँ । इस मामले में, मौजूदा सांख्यिक प्रारूप का "विस्तार" सबसे अच्छा दांव हो सकता है। यह बहुत मुश्किल नहीं दिखता है।


0

निम्नलिखित का उपयोग केवल प्रदर्शन के लिए किया जा सकता है जो स्ट्रिंग की संपत्ति का उपयोग करता है।

double value = 123.456789;
String.Format("{0:0.00}", value);

यह "123.46" देगा। सवाल विशेष रूप से कोई गोलाई के लिए पूछता है।
टोबेबरोथ

0

उपाय:

var d = 0.123345678; 
var stringD = d.ToString(); 
int indexOfP = stringD.IndexOf("."); 
var result = stringD.Remove((indexOfP+1)+2);

(indexOfP + 1) +2 (यह संख्या इस बात पर निर्भर करती है कि आप कितने नंबर को संरक्षित करना चाहते हैं। मैं इसे दो देता हूं क्योंकि प्रश्न स्वामी चाहता है।)


0

कल्चरइन्फॉर्मेशन पर भी ध्यान देंअपने सिस्टम पर । यहां बिना घेरे के मेरा समाधान।

इस उदाहरण में आपको केवल चर MyValue को डबल के रूप में परिभाषित करना है । परिणाम के रूप में आप स्ट्रिंग चर NewValue में अपने स्वरूपित मूल्य प्राप्त करते हैं

नोट - इसके अलावा C # स्टेटमेंट का उपयोग करके सेट करें:

using System.Globalization;  

string MyFormat = "0";
if (MyValue.ToString (CultureInfo.InvariantCulture).Contains (CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
   {
      MyFormat += ".00";
   }

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