2 টি স্থানে বা সাধারণ পূর্ণসংখ্যার দশমিক দেখানোর জন্য স্ট্রিং ফর্ম্যাট ব্যবহার করা


291

আমি প্রদর্শনের জন্য একটি মূল্য ক্ষেত্র পেয়েছি যা কখনও কখনও হয় 100 বা 100.99 বা 100.9 হতে পারে, আমি যা চাই তা হল দামের জন্য 2 দশমিক স্থানে কেবল প্রদর্শিত হয়, উদাহরণস্বরূপ যদি এটি 100 হয় তবে এটি কেবলমাত্র 100 নয় 100.00 দেখান এবং দাম যদি 100.2 হয় তবে এটি 100.20 একইভাবে 100.22 প্রদর্শিত হবে for আমি গুগল করেছিলাম এবং কয়েকটি উদাহরণ পেয়েছি তবে তারা যা চেয়েছিল ঠিক তার সাথে মেলে না:

// 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
@ বাইনারি ওয়ারিয়র আমি মনে করি যে এই প্রশ্নটি একটি সদৃশ হতে পারে তবে এর আরও ভাল এবং আরও সম্পূর্ণ উত্তর রয়েছে। আইএমও অন্য একজনকে এটির সদৃশ হিসাবে চিহ্নিত করা উচিত।
রায়ান গেটস

কেবল যুক্ত করুন .পরিবর্তন ("। 00", "")
ডেভ সামার

উত্তর:


155

একটি অপ্রয়োজনীয় উপায় হ'ল:

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
এটি সত্যই যে প্রশ্নটি জিজ্ঞাসা করা হয়েছিল তা নয় - তবে এটি হয়ে থাকলে - কেন কেবল স্ট্রিং ব্যবহার করবেন না For ফর্ম্যাট ("{0: 0.00}")। প্রতিস্থাপন ("। 00", "")?
BrainSlugs83

18
@ BrainSlugs83: বর্তমান থ্রেডের উপর নির্ভর করে CurrentCultureদশমিক বিভাজক নাও হতে পারে .। যদি না CultureInfo.InvariantCultureব্যবহার করা হয় তবে string.Formatআপনাকে মানটি পরীক্ষা CultureInfo.NumberFormat.NumberDecimalSeparatorকরতে হবে এবং এটিই হবে সত্যিকারের পিআইটিএ। :)
গ্রো

@ ইউইউ কেইম আমার যদি 60000ইনট থাকে এবং আমি এটি হতে চাই 60.000?
প্রশান্ত পিম্পলে

এই উত্তরটি "একটি বর্গ চক্র পুনরায় উদ্ভাবন" এর একটি মামলা is অ্যাকাউন্ট সংস্কৃতি বা এটি ইতিমধ্যে নেট নেট দ্বারা পরিচালিত হয়েছে তা গ্রহণ করে না।
বাইটেডেভ

522

এই প্রশ্নটি পুনরায় সক্রিয় করার জন্য দুঃখিত, তবে আমি এখানে সঠিক উত্তর খুঁজে পাইনি।

সংখ্যার বিন্যাসে আপনি 0একটি বাধ্যতামূলক স্থান এবং #anচ্ছিক স্থান হিসাবে ব্যবহার করতে পারেন ।

তাই:

// 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। কিছু সংস্কৃতির জন্য .পরিবর্তন করা হবে ,

মূল প্রশ্নের উত্তর:

সবচেয়ে সহজ সমাধানটি এসেছে @ অ্যান্ড্রু থেকে ( এখানে )। সুতরাং আমি ব্যক্তিগতভাবে এই জাতীয় কিছু ব্যবহার করব:

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

20
প্রথমদিকে, আমি ভেবেছিলাম এটি উত্তর হওয়া উচিত, যতক্ষণ না আমি একাধিকবার মূল প্রশ্নটি পুনরায় পাঠ করি। ওপি ঠিক কী চায় সে সম্পর্কে পুরোপুরি পরিষ্কার নয়, তবে মনে হয় কেউ যদি ভগ্নাংশে প্রবেশ করে তবে তিনি সর্বদা 2 দশমিক স্থান চান। সুতরাং কেউ যদি 1.1 এ প্রবেশ করে তবে তিনি 1.10 চান; এই কোডটি এটি করবে না।
ডগ এস

40
ওফস, আমি এটি আবার পড়েছি এবং আপনি ঠিক বলেছেন। সুতরাং, এটি সঠিক উত্তর নয় তবে কমপক্ষে কেউ এটি দরকারী বলে মনে করতে পারেন।
Gh61

ওপি-র যা দরকার তা এটি দিয়ে অর্জন করা যেতে পারে: stackoverflow.com/a/33180829/2321042
অ্যান্ড্রু

আমি কেবল এটি দরকারী হিসাবে খুঁজে পেয়েছি এবং (কিছুটা) গ্রিডভিউয়ের একটি বাউন্ডফিল্ড একটি স্ক্লালডুবল এবং কোন বিন্যাসের নির্দেশের সাথে কী করে তা মেলাচ্ছে। আপনাকে দেখাতে হবে সর্বাধিক # টি আপনাকে নির্দেশ করতে হবে। (বনাম বাউন্ডফিল্ড, আপনার পছন্দমতো বা যত কম লোক দেখায় খুশি)
ফোর্টবাইজ

হ্যাঁ এটি কার্যকর ছিল, তবে দশমিক উপস্থিত থাকলে কীভাবে কেবল দুটি দশমিক দেখানো যায়? অর্থাত্ যদি এটি একটি পূর্ণসংখ্যা হয় তবে দশমিক দেখায় না?
নাইজেল এফ ডি এস

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
এই প্রশ্নটি সমাধান না করে আমার সমাধান করা। আমি সবার কাছে দেখার জন্য এটি আপভোট করেছি।
এমাদ

46

পুরানো প্রশ্ন তবে আমি আমার মতে সহজ বিকল্পটি যুক্ত করতে চেয়েছিলাম।

হাজার হাজার বিভাজক ছাড়া :

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

সঙ্গে সহস্র বিভাজক:

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

একই তবে স্ট্রিং.ফর্ম্যাট সহ :

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

এখানে উয়ে কেইমের পদ্ধতির বিকল্প রয়েছে যা এখনও একই পদ্ধতি কলটি বজায় রাখতে পারে:

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" একটি স্ট্রিং বদলে { ',', '' '।'} আমার জন্য কাজ না মনে হয় TrimEnd মত অক্ষর একটি শ্রেণীবিন্যাস লাগে msdn.microsoft.com/en-us/ গ্রন্থাগার / system.string.trimend.aspx
ব্যবহারকারী 1069816

আপনি ঠিক বলেছেন - আমি কীভাবে এটি মিস করেছি তা নিশ্চিত নই। আমি সঠিকভাবে কাজ আপডেট করেছি।
স্টিভ 15

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

যদি আপনার প্রোগ্রামটি দ্রুত চালানোর প্রয়োজন হয়, value "{মান: ফর্ম্যাটস্ট্রিং}" এবং স্ট্রিংয়ের সাথে সম্পর্কিত string 35% দ্রুত স্ট্রিং ফর্ম্যাটিং পারফরম্যান্সের জন্য ওয়েল স্ট্রিং (ফরম্যাটস্ট্রিং) কল করুন mat ফর্ম্যাট (ফর্ম্যাটস্ট্রিং, মান)।

উপাত্ত

সি # স্ট্রিং ফর্ম্যাটিং পারফরম্যান্স - ভিএস2017 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

তথ্যসূত্র

কাস্টম সংখ্যাসূচক ফর্ম্যাট স্ট্রিংস [ডকস.মাইক্রোসফট.কম]

কিউটি চার্টস বারচার্টের উদাহরণ [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) 
}

সমাধানটি সহজ: ContentStringFormatএক্সএএমএলে একটি সম্পত্তি রয়েছে। সুতরাং আপনি যখন লেবেলটি তৈরি করবেন তখন এটি করুন:

//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);

দশমিক দশমিক ভেরিয়েবলের তুলনা করে ম্যাথটি পাওয়ার জন্য আমাকে অতিরিক্ত castালাই (দশমিক) যোগ করতে হয়েছিল।



1

কোনও (টি-) এসকিউএল ডাটাবেস থেকে প্রাপ্ত দশমিকের সাথে কথা বলার সময়, আপনি x দশমিক জায়গাগুলির সাহায্যে ননযোগ্য এবং নন-ডাবল দশমিককে রূপান্তর করতে সক্ষম হন এবং আপনার টেবিল সংজ্ঞাগুলির বিরুদ্ধে কোডটি সহজেই পর্যালোচনা করতে সক্ষম হতে চান - এবং অবশ্যই, প্রদর্শন করুন ব্যবহারকারীর দশমিক দশমিক সংখ্যা।

দুর্ভাগ্যক্রমে, সত্তা ফ্রেমওয়ার্ক একটি এসকিউএল এর মতো কিছুকে স্বয়ংক্রিয়ভাবে 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)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.