2 स्थानों या साधारण पूर्णांक तक दशमलव दिखाने के लिए स्ट्रिंग प्रारूप का उपयोग करना


291

मुझे प्रदर्शित करने के लिए एक मूल्य क्षेत्र मिला है, जो कभी-कभी 100 या 100.99 या 100.9 हो सकता है, मैं जो चाहता हूं वह 2 दशमलव स्थानों में मूल्य प्रदर्शित करने के लिए है केवल अगर उस मूल्य के लिए दशमलव दर्ज किए जाते हैं, उदाहरण के लिए यदि इसका 100 केवल 100 नहीं 100.00 दिखाएं और यदि कीमत 100.2 है तो इसे 100.20 प्रदर्शित करना चाहिए 100.22 के लिए समान होना चाहिए। मैंने गुगली की और कुछ उदाहरणों के साथ आया, लेकिन वे बिल्कुल वैसा नहीं मिला जैसा मैं चाहता था:

// just two decimal places
String.Format("{0:0.00}", 123.4567);      // "123.46"
String.Format("{0:0.00}", 123.4);         // "123.40"
String.Format("{0:0.00}", 123.0);         // "123.00"


1
आरई: "मैं जो चाहता हूं वह 2 दशमलव स्थानों में मूल्य प्रदर्शित करने के लिए है केवल अगर दशमलव उस मूल्य के लिए दर्ज किया जाता है" - तो अगर उपयोगकर्ता प्रकार "100.00" आप "100.00" दिखाना चाहते हैं, लेकिन यदि वे "100" टाइप करते हैं आप केवल "100" दिखाना चाहते हैं? - संख्या प्रकार केवल संख्या के मूल्य को ट्रैक करते हैं - न कि कौन से महत्वहीन अंक एक उपयोगकर्ता द्वारा दर्ज किए गए थे और जो नहीं थे - इसके लिए आपको एक स्ट्रिंग का उपयोग करने की आवश्यकता होगी।
BrainSlugs83

2
@BinaryWorrier मुझे लगता है कि यह प्रश्न एक डुप्लिकेट हो सकता है, लेकिन इसके बहुत बेहतर और अधिक पूर्ण उत्तर हैं। IMO को इस के डुप्लिकेट के रूप में चिह्नित किया जाना चाहिए।
रयान गेट्स

1
बस जोड़ें। रीप्ले ("। 00", "")
डेव सुमेर

जवाबों:


156

एक अभिमानी तरीका होगा:

var my = DoFormat(123.0);

DoFormatकुछ होने के साथ :

public static string DoFormat( double myNumber )
{
    var s = string.Format("{0:0.00}", myNumber);

    if ( s.EndsWith("00") )
    {
        return ((int)myNumber).ToString();
    }
    else
    {
        return s;
    }
}

सुरुचिपूर्ण नहीं, लेकिन कुछ परियोजनाओं में इसी तरह की स्थितियों में मेरे लिए काम करना।


6
यह वास्तव में वह सवाल नहीं है जो पूछा गया था - लेकिन यह था - क्यों न केवल स्ट्रिंग का उपयोग करें। ("{0: 0}}")। प्रतिस्थापित करें ("। 00", "")।
BrainSlugs83

18
@ BrainSlugs83: वर्तमान थ्रेड के आधार पर CurrentCulture, दशमलव विभाजक नहीं हो सकता है .। जब तक CultureInfo.InvariantCultureइसका उपयोग नहीं किया जाता है string.Format, आपको इसके मूल्य की जांच करनी होगी CultureInfo.NumberFormat.NumberDecimalSeparator, और यह एक वास्तविक पीटीए होगा। :)
ग्रू

@ यू कीम क्या है अगर मेरे पास 60000इंट है और मैं चाहता हूं कि यह हो 60.000?
प्रशांत पिंपले

यह उत्तर "एक वर्ग पहिया को सुदृढ़ करने" का मामला है। संस्कृति या इस तथ्य को ध्यान में नहीं रखता है कि यह पहले से ही .NET द्वारा नियंत्रित किया जा चुका है।
ब्यदेव डे

523

इस प्रश्न को पुनः सक्रिय करने के लिए क्षमा करें, लेकिन मुझे यहाँ सही उत्तर नहीं मिला।

स्वरूपण संख्याओं में आप 0एक अनिवार्य स्थान के #रूप में और एक वैकल्पिक स्थान के रूप में उपयोग कर सकते हैं ।

इसलिए:

// just two decimal places
String.Format("{0:0.##}", 123.4567);      // "123.46"
String.Format("{0:0.##}", 123.4);         // "123.4"
String.Format("{0:0.##}", 123.0);         // "123"

के 0साथ भी गठबंधन कर सकते हैं #

String.Format("{0:0.0#}", 123.4567)       // "123.46"
String.Format("{0:0.0#}", 123.4)          // "123.4"
String.Format("{0:0.0#}", 123.0)          // "123.0"

इसको बनाने के लिए हमेशा विधि का उपयोग किया जाता है CurrentCulture। कुछ संस्कृतियों के .लिए बदल दिया जाएगा ,

मूल प्रश्न का उत्तर:

सबसे सरल समाधान @Andrew ( यहाँ ) से आता है । तो मैं व्यक्तिगत रूप से कुछ इस तरह का उपयोग करेगा:

var number = 123.46;
String.Format(number % 1 == 0 ? "{0:0}" : "{0:0.00}", number)

20
पहले, मैंने सोचा कि यह उत्तर होना चाहिए, जब तक कि मैं मूल प्रश्न को कई बार फिर से नहीं पढ़ता। ओपी पूरी तरह से स्पष्ट नहीं है कि वह वास्तव में क्या चाहता है, लेकिन ऐसा लगता है कि वह हमेशा 2 दशमलव स्थानों को चाहता है यदि कोई अंश में प्रवेश करता है। इसलिए अगर कोई 1.1 में प्रवेश करता है तो वह 1.10 चाहता है; यह कोड ऐसा नहीं करेगा।
डग एस

40
उफ़, मैंने इसे फिर से पढ़ा और आप सही कह रहे हैं। तो, यह सही उत्तर नहीं है, लेकिन कम से कम किसी को यह उपयोगी लग सकता है।
घी

ओपी को इसके साथ क्या हासिल करना चाहिए: stackoverflow.com/a/33180829/2321042
एंड्रयू

मैं सिर्फ यह उपयोगी पाया, और (कुछ) मिलान क्या एक GridView में एक बाउंडफिल्ड एक SqlDouble और कोई प्रारूप निर्देश के साथ करता है। आपको अधिकतम # दिखाना होगा। (बनाम बाउंडफिल्ड, बहुत से या जैसे ही आप को दिखाने के लिए खुश हैं)
किलेबंदी

हाँ यह उपयोगी था, लेकिन अगर दशमलव मौजूद है तो केवल दो दशमलव कैसे दिखाएं? यानी अगर इसका पूर्णांक तो न तो दशमलव दिखा?
निगेल एफडीएस

64

यह एक सामान्य स्वरूपण फ़्लोटिंग संख्या उपयोग मामला है।

दुर्भाग्य से, बिल्ट-इन वन-लेटर प्रारूप स्ट्रिंग्स (जैसे। एफ, जी, एन) के सभी इसे सीधे प्राप्त नहीं करेंगे।
उदाहरण के लिए, num.ToString("F2")हमेशा की तरह 2 दशमलव स्थानों को दिखाएगा 123.40

आपको 0.##पैटर्न का उपयोग करना होगा यहां तक ​​कि यह थोड़ा वर्बोज़ दिखता है।

एक पूर्ण कोड उदाहरण:

double a = 123.4567;
double b = 123.40;
double c = 123.00;

string sa = a.ToString("0.##"); // 123.46
string sb = b.ToString("0.##"); // 123.4
string sc = c.ToString("0.##"); // 123

7
लेकिन वह 123.40 चाहता है, 123.4 नहीं।
एंड्रयू

8
इस सवाल को हल करने का नहीं बल्कि मेरा हल निकालने का। मैं इसे देखने के लिए हर किसी के लिए आने के लिए upvote।
Emad

46

पुराना सवाल है लेकिन मैं अपनी राय में सबसे सरल विकल्प जोड़ना चाहता था।

हजारों विभाजकों के बिना :

value.ToString(value % 1 == 0 ? "F0" : "F2")

हजारों विभाजकों के साथ :

value.ToString(value % 1 == 0 ? "N0" : "N2")

एक ही लेकिन साथ String.Format :

String.Format(value % 1 == 0 ? "{0:F0}" : "{0:F2}", value) // Without thousands separators
String.Format(value % 1 == 0 ? "{0:N0}" : "{0:N2}", value) // With thousands separators

यदि आपको कई स्थानों पर इसकी आवश्यकता है , तो मैं इस तर्क का विस्तार विधि में उपयोग करूंगा :

public static string ToCoolString(this decimal value)
{
    return value.ToString(value % 1 == 0 ? "N0" : "N2"); // Or F0/F2 ;)
}


8

मैं किसी भी तरह से प्रारूप विनिर्देशक में एक शर्त रखने के लिए नहीं जानता, लेकिन आप अपना स्वयं का फॉर्मेटर लिख सकते हैं:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
               // all of these don't work
            Console.WriteLine("{0:C}", 10);
            Console.WriteLine("{0:00.0}", 10);
            Console.WriteLine("{0:0}", 10);
            Console.WriteLine("{0:0.00}", 10);
            Console.WriteLine("{0:0}", 10.0);
            Console.WriteLine("{0:0}", 10.1);
            Console.WriteLine("{0:0.00}", 10.1);

          // works
            Console.WriteLine(String.Format(new MyFormatter(),"{0:custom}", 9));
            Console.WriteLine(String.Format(new MyFormatter(),"{0:custom}", 9.1));
            Console.ReadKey();
        }
    }

    class MyFormatter : IFormatProvider, ICustomFormatter
    {
        public string Format(string format, object arg, IFormatProvider formatProvider)
        {
            switch (format.ToUpper())
            {
                case "CUSTOM":
                    if (arg is short || arg is int || arg is long)
                        return arg.ToString();
                    if (arg is Single || arg is Double)
                        return String.Format("{0:0.00}",arg);
                    break;
                // Handle other
                default:
                    try
                    {
                        return HandleOtherFormats(format, arg);
                    }
                    catch (FormatException e)
                    {
                        throw new FormatException(String.Format("The format of '{0}' is invalid.", format), e);
                    }
            }
            return arg.ToString(); // only as a last resort
        }

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

        public object GetFormat(Type formatType)
        {
            if (formatType == typeof(ICustomFormatter))
                return this;
            return null;
        }
    }
}

6

यहाँ Uwe Keim की विधि का विकल्प दिया गया है, जो अभी भी उसी विधि को बनाए रखेगा:

var example1 = MyCustomFormat(123.1);  // Output: 123.10
var example2 = MyCustomFormat(123.95); // Output: 123.95
var example3 = MyCustomFormat(123);    // Output: 123

MyCustomFormatकुछ होने के साथ :

public static string MyCustomFormat( double myNumber )
{
    var str (string.Format("{0:0.00}", myNumber))
    return (str.EndsWith(".00") ? str.Substring(0, strLastIndexOf(".00")) : str;
}

यह मेरे लिए काम नहीं करता था क्योंकि ऐसा लगता है कि ट्राइएड और ", .00," जैसे स्ट्रिंग की बजाय ".00" जैसे वर्णों की एक सरणी लेता है - देखें msdn.microsoft.com/en-us/। पुस्तकालय /
प्रणाली .string.trimend.aspx

आप सही हैं - मुझे यकीन नहीं है कि मैं कैसे चूक गया। मैंने सही तरीके से काम करने के लिए अपडेट किया है।
स्टीव

5
वर्तमान थ्रेड के आधार पर CurrentCulture, दशमलव विभाजक नहीं हो सकता है .। जब तक के CultureInfo.InvariantCultureसाथ प्रयोग नहीं किया जाता है string.Format, तो आपको उसके मूल्य की जांच करनी होगी CultureInfo.NumberFormat.NumberDecimalSeparator, जो कि अपात्र है।
ग्रू

6

सरल एक लाइन कोड:

public static string DoFormat(double myNumber)
{
    return string.Format("{0:0.00}", myNumber).Replace(".00","");
}

इसके साथ समस्या यह है कि यह चलाया जाता है जहाँ दशमलव विभाजक अल्पविराम होता है। इस उत्तर के लिए टिप्पणियों की जाँच करें ।
एंड्रयू

6

यदि आपके प्रोग्राम को जल्दी से चलाने की आवश्यकता है, तो कॉल करें। ~ 35% के लिए ~ 35% अधिक तेज स्ट्रिंग स्वरूपण प्रदर्शन के लिए .StString (formatString) $ "{value: formatString}" और string.Format (formatString, value) के सापेक्ष।

डेटा

सी # स्ट्रिंग प्रारूपण प्रदर्शन - VS2017 15.4.5

कोड

using System;
using System.Diagnostics;

public static class StringFormattingPerformance
{
   public static void Main()
   {
      Console.WriteLine("C# String Formatting Performance");
      Console.WriteLine("Milliseconds Per 1 Million Iterations - Best Of 5");
      long stringInterpolationBestOf5 = Measure1MillionIterationsBestOf5(
          (double randomDouble) =>
          {
             return $"{randomDouble:0.##}";
          });
      long stringDotFormatBestOf5 = Measure1MillionIterationsBestOf5(
          (double randomDouble) =>
          {
             return string.Format("{0:0.##}", randomDouble);
          });
      long valueDotToStringBestOf5 = Measure1MillionIterationsBestOf5(
          (double randomDouble) =>
          {
             return randomDouble.ToString("0.##");
          });
      Console.WriteLine(
$@"            $""{{value:formatString}}"": {stringInterpolationBestOf5} ms
 string.Format(formatString, value): {stringDotFormatBestOf5} ms
       value.ToString(formatString): {valueDotToStringBestOf5} ms");
   }

   private static long Measure1MillionIterationsBestOf5(
       Func<double, string> formatDoubleUpToTwoDecimalPlaces)
   {
      long elapsedMillisecondsBestOf5 = long.MaxValue;
      for (int perfRunIndex = 0; perfRunIndex < 5; ++perfRunIndex)
      {
         var random = new Random();
         var stopwatch = Stopwatch.StartNew();
         for (int i = 0; i < 1000000; ++i)
         {
            double randomDouble = random.NextDouble();
            formatDoubleUpToTwoDecimalPlaces(randomDouble);
         }
         stopwatch.Stop();
         elapsedMillisecondsBestOf5 = Math.Min(
            elapsedMillisecondsBestOf5, stopwatch.ElapsedMilliseconds);
      }
      return elapsedMillisecondsBestOf5;
   }
}

कोड आउटपुट

C# String Formatting Performance
Milliseconds Per 1 Million Iterations - Best Of 5
            $"{value:formatString}": 419 ms
 string.Format(formatString, value): 419 ms
       value.ToString(formatString): 264 ms

संदर्भ

कस्टम संख्यात्मक प्रारूप स्ट्रिंग्स [docs.microsoft.com]

Qt चार्ट्स BarChart उदाहरण [doc.qt.io]


5

मुझे डर है कि कोई अंतर्निहित प्रारूप नहीं है जो ऐसा करेगा। आपको मान के आधार पर एक अलग प्रारूप का उपयोग करना होगा कि क्या मूल्य पूरी संख्या है या नहीं। या हमेशा 2 दशमलव स्थानों पर प्रारूपित करें, और किसी भी अनुगामी ".00" को निकालने के लिए स्ट्रिंग को बाद में हेरफेर करें।


4

यदि कोई अन्य उत्तर आपके लिए काम नहीं करता है, तो यह हो सकता है क्योंकि आप फ़ंक्शन ContentPropertyमें नियंत्रण के लिए बाध्य हैं OnLoad, जिसका अर्थ है कि यह काम नहीं करेगा:

private void UserControl_Load(object sender, RoutedEventArgs e)
{
  Bind.SetBindingElement(labelName, String.Format("{0:0.00}", PropertyName), Label.ContentProperty) 
}

समाधान सरल है: ContentStringFormatxaml में एक संपत्ति है। तो जब आप लेबल बनाते हैं तो ऐसा करें:

//if you want the decimal places definite
<Label Content="0" Name="labelName" ContentStringFormat="0.00"/>

या

//if you want the decimal places to be optional
<Label Content="0" Name="labelName" ContentStringFormat="0.##"/>

3

कुछ इस तरह से भी काम करेगा:

String.Format("{0:P}", decimal.Parse(Resellers.Fee)).Replace(".00", "")

वह एक प्रतिशत देता है?


2

कोड को और अधिक स्पष्ट करने के लिए जिसे काहिया ने लिखा है (यह स्पष्ट है लेकिन जब आप इसमें और पाठ जोड़ना चाहते हैं तो मुश्किल हो जाता है) ... इस सरल उपाय को आज़माएं।

if (Math.Round((decimal)user.CurrentPoints) == user.CurrentPoints)
     ViewBag.MyCurrentPoints = String.Format("Your current Points: {0:0}",user.CurrentPoints);
else
     ViewBag.MyCurrentPoints = String.Format("Your current Points: {0:0.0}",user.CurrentPoints);

मुझे Math को देखने के लिए अतिरिक्त कलाकारों (दशमलव) को जोड़ना पड़ा। दो दशमलव चर की तुलना करें।



1

जब आप (T-) SQL डेटाबेस से आने वाले डेसीमल से निपटते हैं, तो आप x दशमलव स्थानों के साथ अशक्त और गैर-अशक्त दशमलव को बदलने में सक्षम होना चाहते हैं और आपकी टेबल परिभाषाओं के विरुद्ध आसानी से कोड की समीक्षा करने में सक्षम हो सकते हैं - और निश्चित रूप से, प्रदर्शित करें उपयोगकर्ता को दशमलव की सही संख्या।

दुर्भाग्य से, एंटिटी फ्रेमवर्क स्वचालित रूप से SQL जैसी किसी चीज़ decimal(18,2)को दशमलव स्थानों की समान संख्या के साथ एक .NET के रूप में परिवर्तित नहीं करता है (क्योंकि पूर्ण परिशुद्धता के साथ केवल दशमलव उपलब्ध है)। आपको दशमलव स्थानों को मैन्युअल रूप से छोटा करना होगा।

तो, मैंने इसे इस तरह किया:

public static class Extensions
{
    public static string ToStringDecimal(this decimal d, byte decimals)
    {
        var fmt = (decimals>0) ? "0." + new string('0', decimals) : "0";
        return d.ToString(fmt);
    }

    public static string ToStringDecimal(this decimal? d, byte decimals)
    {
        if (!d.HasValue) return "";
        return ToStringDecimal(d.Value, decimals);
    }
}

उदाहरण उपयोग:

void Main()
{
    decimal d = (decimal)1.2345;
    decimal? d2 = null; 

    Console.WriteLine(d.ToStringDecinal(2)); // prints: "1.23" (2 decimal places)
    Console.WriteLine(d.ToStringDecinal(0)); // prints: "1" (show integer number)
    Console.WriteLine(d2.ToStringDecimal(2)); // prints: "" (show null as empty string)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.