मैं एक दशमलव मान को 2 दशमलव स्थानों पर कैसे करूं (पृष्ठ पर आउटपुट के लिए)


648

जब वर्तमान में किसी दशमलव का मान प्रदर्शित होता है .ToString(), तो यह 15 दशमलव स्थानों को पसंद करने के लिए सटीक है, और जब से मैं डॉलर और सेंट का प्रतिनिधित्व करने के लिए इसका उपयोग कर रहा हूं, मैं केवल 2 दशमलव स्थानों के लिए आउटपुट चाहता हूं।

क्या मैं इसके लिए भिन्नता का उपयोग करता हूं .ToString()?

जवाबों:


910
decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0

या

decimalVar.ToString ("0.##"); // returns "0"  when decimalVar == 0

31
समस्या यह है कि जब हमारे पास 0.00 है; यह एक खाली स्ट्रिंग देता है।
Jronny

164
तब आप दशमलव कर सकते हैं। तारांकन ("0। ##")। आप स्वरूपण स्ट्रिंग के रूप में भी 0.00 का उपयोग कर सकते हैं।
एलबर्टिन

54
इस समाधान के साथ, आपके पास संस्कृति प्रारूपण नहीं होगा जो कि संख्याओं को पढ़ते समय उम्मीद करेगा। इसके लिए आपको ToString ("N2"), या ToString ("N") का उपयोग करना चाहिए।
शौतीह

2
@ प्रारूप Decimalऔर Doubleप्रकार ToStringविधि स्वरूपण के लिए तर्क स्वीकार करता है। पहले अपने मान को दशमलव / डबल में परिवर्तित करने का प्रयास करें।
सोहैबी

1
@ f470071 दशमलव मूल्य प्रकार हैं और जैसे "संशोधित" कभी नहीं होते हैं। इसके बावजूद, ToString () से यह उम्मीद नहीं की जाती है कि वह जो भी कहेगी उसकी सामग्री को संशोधित किया जाए।
जस्टिन स्काइल्स

589

मुझे पता है कि यह एक पुराना प्रश्न है, लेकिन मुझे यह देखकर आश्चर्य हुआ कि कोई भी ऐसा उत्तर नहीं दे रहा था, जो उत्तर में दिया गया हो;

  1. बैंकरों गोलाई का उपयोग नहीं किया
  2. मान को दशमलव के रूप में नहीं रखा।

यह वह है जो मैं उपयोग करूंगा:

decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);

http://msdn.microsoft.com/en-us/library/9s0xa85y.aspx


3
ToString या string.Format राउंडिंग का उपयोग न करें: msdn.microsoft.com/en-us/library/0c899ak8.aspx#sectionToggle1
Matthijs Wessels

1
@MatthijsWessels मुझे पता है ... लेकिन यह एक दशमलव के रूप में मान भी नहीं रखता है।
माइक एम।

1
यह सही मायने में दो दशमलव स्थानों का प्रतिनिधित्व करने का एक बेहतर तरीका है क्योंकि यह ट्रेलिंग शून्य को नहीं छोड़ेगा।
लिक्विडड्रमर

354
decimalVar.ToString("F");

यह करेगा:

  • 2 दशमलव स्थानों पर गोल करें जैसे। 23.45623.46
  • सुनिश्चित करें कि वहाँ हमेशा 2 दशमलव स्थानों जैसे हैं। 2323.00; 12.512.50

मुद्रा प्रदर्शित करने के लिए आदर्श।

ToString ("F") पर दस्तावेज़ देखें ( जॉन श्नाइडर का धन्यवाद)।


10
यह ठीक काम करता है जब केवल 1 दशमलव होता है; .ToString ("#। ##") विफल रहता है। यह उत्तर बहुत बेहतर है
एरिक फ्रिक

2
क्या यह 23.456 => 23.46 दौर नहीं होगा?
rtpHarry

14
यहाँ "F" का अर्थ क्या है, और यह कैसे काम करता है इस पर प्रलेखन: msdn.microsoft.com/en-us/library/…
जॉन श्नाइडर

4
क्यों नहीं .ToString ("एन") "एफ" के बजाय? यह मेरी समझ है कि वे दोनों इस सवाल की जरूरतों के लिए काम करेंगे, लेकिन एन हजारों की संख्या में कॉमा भी लगाएंगे।
jgerman

नोट: संस्कृति के आधार पर .इसे बदला जा सकता है ,CultureInfo.InvariantCultureइसे निष्क्रिय करने के लिए आपको दूसरे तर्क के रूप में पास होना चाहिए ।
डंकन लुक

106

यदि आपको प्रदर्शन स्ट्रिंग के लिए इसकी आवश्यकता है

String.Format("{0:0.00}", 123.4567m);      // "123.46"

http://www.csharp-examples.net/string-format-double/

"एम" एक दशमलव प्रत्यय है। दशमलव प्रत्यय के बारे में:

http://msdn.microsoft.com/en-us/library/364x0z75.aspx


10
Techinically, एक दशमलव के लिए, यह 123.4567m होगा, हाँ? "एम" प्रत्यय के बिना, यह
एडम टेगेन

2
या शॉर्टकट $ "{मान: 0.00}"
mamczas

56

दिया गया दशमलव d = 12.345; भाव d.ToString ("C") या String.Format ("{0: C}", d) उपज $ 12.35 - ध्यान दें कि प्रतीक सहित वर्तमान संस्कृति की मुद्रा सेटिंग्स का उपयोग किया जाता है।

ध्यान दें कि "C" वर्तमान संस्कृति से अंकों की संख्या का उपयोग करता है। आप हमेशा की C{Precision specifier}तरह आवश्यक परिशुद्धता के लिए मजबूर करने के लिए डिफ़ॉल्ट ओवरराइड कर सकते हैं String.Format("{0:C2}", 5.123d)


4
@ Slick86 - currenty संकेत
Fubo

48

यदि आप चाहते हैं कि यह कॉमा के साथ-साथ एक दशमलव बिंदु (लेकिन कोई मुद्रा प्रतीक) नहीं है, जैसे कि 3,456,789.12 ...

decimalVar.ToString("n2");

1
बेहतर जवाब क्योंकि सवाल एक पृष्ठ पर आउटपुट के बारे में था, और बड़ी संख्या के लिए संख्या स्वरूपण महत्वपूर्ण है। इसके अलावा, "n *" वर्तमान संस्कृति को ध्यान में रखता है, इसलिए यह "3.456.789,12", "3 456 789,12", आदि हो सकता है
Shautieh

29

पहले से ही दो उच्च स्कोरिंग उत्तर हैं जो Decimal.Round (...) को संदर्भित करते हैं, लेकिन मुझे लगता है कि थोड़ा और स्पष्टीकरण की आवश्यकता है - क्योंकि दशमलव का एक अप्रत्याशित महत्वपूर्ण गुण है जो स्पष्ट नहीं है।

एक दशमलव 'जानता है' कि यह कहाँ से आया है, कितने दशमलव स्थानों पर आधारित है।

उदाहरण के लिए निम्नलिखित अप्रत्याशित हो सकता है:

Decimal.Parse("25").ToString()          =>   "25"
Decimal.Parse("25.").ToString()         =>   "25"
Decimal.Parse("25.0").ToString()        =>   "25.0"
Decimal.Parse("25.0000").ToString()     =>   "25.0000"

25m.ToString()                          =>   "25"
25.000m.ToString()                      =>   "25.000"

उसी ऑपरेशन को करने से उपरोक्त में से प्रत्येक के लिए Doubleकोई दशमलव स्थान ( "25") नहीं होगा ।

जब आप 2 दशमलव स्थानों के लिए दशमलव चाहते हैं, तो 95% संभावना होती है क्योंकि यह ऐसी मुद्रा है जिसमें यह संभव है कि यह 95% समय के लिए ठीक हो:

Decimal.Parse("25.0").ToString("c")     =>   "$25.00"

या XAML में आप सिर्फ इस्तेमाल करते हैं {Binding Price, StringFormat=c}

एक मामले में मैं भाग गया जहाँ मुझे एक दशमलव की आवश्यकता थी एक एक्सएमएल जब अमेज़ॅन के webservice को एक्सएमएल भेज रहा था। सेवा शिकायत कर रही थी क्योंकि एक दशमलव मान (मूल रूप से SQL सर्वर से) भेजा जा रहा था 25.1200और अस्वीकार कर दिया 25.12गया था , ( अपेक्षित प्रारूप था)।

Decimal.Round(...)समस्या को ठीक करने के लिए मुझे 2 दशमलव स्थानों के साथ करने की आवश्यकता थी ।

 // This is an XML message - with generated code by XSD.exe
 StandardPrice = new OverrideCurrencyAmount()
 {
       TypedValue = Decimal.Round(product.StandardPrice, 2),
       currency = "USD"
 }

TypedValueप्रकार की है, Decimalइसलिए मैं बस नहीं कर सकता ToString("N2")और इसे गोल करने और इसे एक के रूप में रखने की आवश्यकता थी decimal


5
+1 यह एक बेहतरीन जवाब है। जब आप कहते हैं कि System.Decimal "जानता है कि कितने दशमलव स्थान हैं" - शब्द यह है कि System.Decimal अन्य फ़्लोटिंग पॉइंट प्रकार के रूप में स्व-सामान्य नहीं है । System.Decimal की एक अन्य उपयोगी संपत्ति यह है कि गणित के संचालन के परिणाम में हमेशा इनपुट तर्कों से दशमलव स्थानों की संख्या सबसे अधिक होती है। 1.0 मी + 2.000 मी = 3.000 मी । आप इस तथ्य का उपयोग करके दशमलव को बिना किसी दशमलव स्थानों के 2 दशमलव स्थानों पर केवल 1.00m जैसे गुणा करके बाध्य कर सकते हैं। 10 मी * 1.00 मी = 10.00 मी
मैटवेवी

2
मैटवेवी गलत है, दशमलव सटीक जोड़ा जाता है। (1.0m * 1.00m) .ToString () = "1.000"
काइडो

2
यह जानना बहुत उपयोगी है कि "एक दशमलव 'जानता है कि यह कितने दशमलव स्थानों पर आधारित है जहां से यह आया है।" आपका बहुत बहुत धन्यवाद!
18 सितंबर को

21

विभिन्न स्वरूपों को दिखाने के लिए यहां थोड़ा लिनकैप कार्यक्रम है:

void Main()
{
    FormatDecimal(2345.94742M);
    FormatDecimal(43M);
    FormatDecimal(0M);
    FormatDecimal(0.007M);
}

public void FormatDecimal(decimal val)
{
    Console.WriteLine("ToString: {0}", val);
    Console.WriteLine("c: {0:c}", val);
    Console.WriteLine("0.00: {0:0.00}", val);
    Console.WriteLine("0.##: {0:0.##}", val);
    Console.WriteLine("===================");
}

यहाँ परिणाम हैं:

ToString: 2345.94742
c: $2,345.95
0.00: 2345.95
0.##: 2345.95
===================
ToString: 43
c: $43.00
0.00: 43.00
0.##: 43
===================
ToString: 0
c: $0.00
0.00: 0.00
0.##: 0
===================
ToString: 0.007
c: $0.01
0.00: 0.01
0.##: 0.01
===================

16

कि बैंकर की गोलाई का उपयोग नहीं करता है?
Danimal

यह सबसे अच्छा तरीका है, क्योंकि मान एक स्ट्रिंग में परिवर्तित नहीं होता है और आप अभी भी गणित संचालन कर सकते हैं
shinji14

@Danimal: गोलाई के प्रकार को बदलने के लिए आप तीसरा तर्क दे सकते हैं
Jay Sullivan

11

यदि मान 0 है तो बहुत कम ही आप एक रिक्त स्ट्रिंग चाहते हैं।

decimal test = 5.00;
test.ToString("0.00");  //"5.00"
decimal? test2 = 5.05;
test2.ToString("0.00");  //"5.05"
decimal? test3 = 0;
test3.ToString("0.00");  //"0.00"

शीर्ष रेटेड उत्तर गलत है और लोगों के समय के 10 मिनट (सबसे) को बर्बाद कर दिया है।


1
मूल रूप "#"से संख्या का अंक (यदि आवश्यक हो) (बिना आवश्यकता के गद्दी के बिना) "0"संख्या का मतलब है (कोई मैटर नहीं है) (शून्य उपलब्ध नहीं होने पर गद्देदार)
श्री हील्स

10

.NET पर मेरे लिए माइक एम का जवाब एकदम सही था, लेकिन decimal.Roundलिखने के समय .NET कोर के पास कोई तरीका नहीं है ।

.NET कोर में, मुझे उपयोग करना था:

decimal roundedValue = Math.Round(rawNumber, 2, MidpointRounding.AwayFromZero);

एक हैक विधि, जिसमें स्ट्रिंग में रूपांतरण शामिल है, है:

public string FormatTo2Dp(decimal myNumber)
{
    // Use schoolboy rounding, not bankers.
    myNumber = Math.Round(myNumber, 2, MidpointRounding.AwayFromZero);

    return string.Format("{0:0.00}", myNumber);
}

9

इनमें से किसी ने भी ठीक वैसा नहीं किया जैसा मुझे 2 डीपी और राउंड अप के लिए मजबूर करने के लिए किया गया था0.005 -> 0.01

2 डीपी को मजबूर करने के लिए 2 डीपी द्वारा सटीक बढ़ाने की आवश्यकता है ताकि हम कम से कम 2 डीपी सुनिश्चित कर सकें

फिर यह सुनिश्चित करने के लिए कि हमारे पास 2 डीपी से अधिक नहीं है

Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)

6.665m.ToString() -> "6.67"

6.6m.ToString() -> "6.60"

9

शीर्ष-रेटेड उत्तर दशमलव मान के स्ट्रिंग प्रतिनिधित्व को स्वरूपित करने के लिए एक विधि का वर्णन करता है, और यह काम करता है।

हालाँकि, यदि आप वास्तव में सहेजे गए परिशुद्धता को वास्तविक मूल्य में बदलना चाहते हैं, तो आपको निम्नलिखित कुछ लिखने की आवश्यकता है:

public static class PrecisionHelper
{
    public static decimal TwoDecimalPlaces(this decimal value)
    {
        // These first lines eliminate all digits past two places.
        var timesHundred = (int) (value * 100);
        var removeZeroes = timesHundred / 100m;

        // In this implementation, I don't want to alter the underlying
        // value.  As such, if it needs greater precision to stay unaltered,
        // I return it.
        if (removeZeroes != value)
            return value;

        // Addition and subtraction can reliably change precision.  
        // For two decimal values A and B, (A + B) will have at least as 
        // many digits past the decimal point as A or B.
        return removeZeroes + 0.01m - 0.01m;
    }
}

एक उदाहरण इकाई परीक्षण:

[Test]
public void PrecisionExampleUnitTest()
{
    decimal a = 500m;
    decimal b = 99.99m;
    decimal c = 123.4m;
    decimal d = 10101.1000000m;
    decimal e = 908.7650m

    Assert.That(a.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("500.00"));

    Assert.That(b.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("99.99"));

    Assert.That(c.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("123.40"));

    Assert.That(d.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("10101.10"));

    // In this particular implementation, values that can't be expressed in
    // two decimal places are unaltered, so this remains as-is.
    Assert.That(e.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
        Is.EqualTo("908.7650"));
}

7

आप किसी भी आवश्यक प्रारूप में एक नंबर को प्रारूपित करने के लिए system.globalization का उपयोग कर सकते हैं।

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

system.globalization.cultureinfo ci = new system.globalization.cultureinfo("en-ca");

यदि आपके पास एक है decimal d = 1.2300000और आपको इसे 2 दशमलव स्थानों पर ट्रिम करने की आवश्यकता है, तो इसे इस तरह से प्रिंट किया जा सकता है d.Tostring("F2",ci);जहां F2 2 दशमलव स्थानों पर स्ट्रिंग कर रहा है और ci स्थानीय या संस्कृति है।

अधिक जानकारी के लिए इस लिंक की जाँच करें
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx


+1 लेकिन - CultureInfo ऑब्जेक्ट केवल दशमलव स्थान को दर्शाने के लिए उपयोग किए जाने वाले यूनिकोड वर्ण को प्रभावित करेगा। जैसे। fr-FR एक अवधि के बजाय अल्पविराम का उपयोग करेगा। यह प्रदान की गई दशमलव स्थानों की संख्या से संबंधित नहीं है।
मैटवेवी

4

https://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx

यह लिंक विस्तार से बताता है कि आप अपनी समस्या को कैसे संभाल सकते हैं और यदि आप अधिक सीखना चाहते हैं तो आप क्या कर सकते हैं। सादगी प्रयोजनों के लिए, आप क्या करना चाहते हैं

double whateverYouWantToChange = whateverYouWantToChange.ToString("F2");

यदि आप एक मुद्रा के लिए यह चाहते हैं, तो आप "F2" के बजाय "C2" टाइप करके इसे आसान बना सकते हैं



1

यदि आपको केवल 2 दशमलव स्थान रखने की आवश्यकता है (यानी बाकी सभी दशमलव अंकों को काट दें):

decimal val = 3.14789m;
decimal result = Math.Floor(val * 100) / 100; // result = 3.14

यदि आपको केवल 3 दशमलव स्थान रखने की आवश्यकता है:

decimal val = 3.14789m;
decimal result = Math.Floor(val * 1000) / 1000; // result = 3.147
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.