আমি কীভাবে একটি দশমিক মানকে 2 দশমিক স্থানে (কোনও পৃষ্ঠায় আউটপুট দেওয়ার জন্য) গোল করব?


647

বর্তমানে দশমিকের মান প্রদর্শন করার সময় .ToString(), এটি 15 দশমিক স্থান পছন্দ করা যথার্থ এবং আমি যেহেতু ডলার এবং সেন্ট উপস্থাপন করতে এটি ব্যবহার করছি, আমি কেবল আউটপুটটি 2 দশমিক স্থান হতে চাই।

আমি কি এর .ToString()জন্য বিভিন্নতা ব্যবহার করব ?

উত্তর:


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

অথবা

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

31
এখানে সমস্যাটি যখন আমাদের ০.০০ থাকে; এটি একটি খালি স্ট্রিং প্রদান করে।
জ্রোনি 4'10

164
তারপরে আপনি দশমিকভারটি করতে পারবেন could টুস্ট্রিং ("0। ##")। আপনি বিন্যাসের স্ট্রিং হিসাবে 0.00 ব্যবহার করতে পারেন।
অ্যালবার্টেইন

54
এই সমাধানের সাথে, সংখ্যার পাঠ করার সময় আপনার কাছে সংস্কৃতি ফর্ম্যাটিংয়ের প্রত্যাশা থাকবে না। এর জন্য আপনার টসস্ট্রিং ("এন 2"), বা টসস্ট্রিং ("এন") ব্যবহার করা উচিত।
শাওটিহ

2
@ হিল Decimalএবং Doubleটাইপ ToStringপদ্ধতি ফর্ম্যাট করার পক্ষে যুক্তি গ্রহণ করে। আপনার মানটি দশমিক / ডাবল রূপান্তর করার চেষ্টা করুন।
সোহাইবি

1
@ f470071 দশমিকগুলি মান ধরণের এবং এগুলি কখনই "সংশোধিত" হয় না। নির্বিশেষে, টসস্ট্রিং () কখনও কল করা হয় না এর সামগ্রীতে পরিবর্তন করার প্রত্যাশা করা হয় নি।
জাস্টিন স্কিলস

589

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে আমি অবাক হয়ে দেখেছি যে উত্তরটি কেউ পোস্ট করেনি বলে মনে হয়;

  1. ব্যাংকারদের রাউন্ডিং ব্যবহার করেন নি
  2. দশমিক হিসাবে মান রাখেনি।

এটি আমি ব্যবহার করব:

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

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


3
: ToString বা string.Format rounding ব্যাঙ্কার ব্যবহার করবেন না msdn.microsoft.com/en-us/library/0c899ak8.aspx#sectionToggle1
Matthijs ওয়েসেলস

1
@ ম্যাথিজ ওয়েসসেলস আমি জানি ... তবে এটি দশমিক হিসাবে মান রাখে না।
মাইক এম।

1
সত্যিকার অর্থে দুটি দশমিক স্থান উপস্থাপনের এটি একটি ভাল উপায় কারণ এটি পিছনে জিরো নামবে না।
লিকুইডড্রামার

353
decimalVar.ToString("F");

এটা হবে:

  • রাউন্ড অফ 2 দশমিক স্থান যেমন। 23.45623.46
  • নিশ্চিত হন যে এখানে সর্বদা 2 দশমিক স্থান রয়েছে 2323.00; 12.512.50

মুদ্রা প্রদর্শনের জন্য আদর্শ।

টোস্ট্রিংয়ের ("এফ") ডকুমেন্টেশন দেখুন ( জন স্নাইডারকে ধন্যবাদ)।


10
এটি ঠিক কাজ করে যখন কেবলমাত্র 1 দশমিক; .ToString ("#। ##") ব্যর্থ। এই উত্তরটি আরও ভাল
এরিক ফ্রিক

2
এটি 23.456 => 23.46 এর মতো হবে না?
rtpHryry

14
এখানে "এফ" এর অর্থ কী এবং এটি কীভাবে কাজ করে সে সম্পর্কে ডকুমেন্টেশন: এমএসডিএন.ইমক্রোসফটকম
জন স্নাইডার

4
কেন? টুস্ট্রিং ("এন") "এফ" এর পরিবর্তে? এটি আমার বোঝার বিষয় যে তারা উভয়ই এই প্রশ্নের প্রয়োজনে কাজ করবে, তবে এন হাজারে সংখ্যার জন্য কমাও দেবে।
জাগারম্যান

দ্রষ্টব্য: সংস্কৃতির উপর ভিত্তি করে .সম্ভবত প্রতিস্থাপন করা হবে ,CultureInfo.InvariantCultureএটি অক্ষম করার জন্য আপনার দ্বিতীয় তর্ক হিসাবে পাস করা উচিত ।
ডানকান লুক

106

আপনার যদি কেবল ডিসপ্লে ব্যবহারের স্ট্রিংয়ের জন্য এটির প্রয়োজন হয় For ফর্ম্যাট

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
প্রযুক্তিগতভাবে, একটি দশমিক জন্য, এটি 123.4567 মি হবে, হ্যাঁ? "মি" প্রত্যয় ছাড়া এটি একটি দ্বিগুণ
অ্যাডাম টেগেন

2
বা শর্টকাট $ "{মান: 0.00}"
ম্যামকাজাস

56

প্রদত্ত দশমিক D = 12,345; এক্সপ্রেশন d.ToString ( "সি") বা String.Format ( "{0: সি}", ঘ) উত্পাদ $ 12,35 - দয়া করে মনে রাখবেন প্রতীক সহ বর্তমান সংস্কৃতি এর মুদ্রা সেটিংসের ব্যবহার করা হয়।

নোট করুন যে "সি" বর্তমান সংস্কৃতি থেকে সংখ্যা সংখ্যা ব্যবহার করে। C{Precision specifier}পছন্দ মতো প্রয়োজনীয় নির্ভুলতার জন্য আপনি সর্বদা ডিফল্টকে ওভাররাইড করতে পারেন String.Format("{0:C2}", 5.123d)


4
@ স্লিক 86 - বর্তমানের সাইন
ফুবু

48

আপনি যদি এটি কমা দ্বারা ফর্ম্যাট করার পাশাপাশি দশমিক পয়েন্ট (তবে কোনও মুদ্রার চিহ্ন নয়) যেমন 3,456,789.12 ...

decimalVar.ToString("n2");

1
প্রশ্নটি যেমন একটি পৃষ্ঠায় আউটপুট দেওয়ার বিষয়ে উত্তম উত্তর ছিল, এবং সংখ্যা ফরম্যাটিং বড় সংখ্যার জন্য গুরুত্বপূর্ণ। এছাড়াও, "এন *" বর্তমান সংস্কৃতিটিকে বিবেচনা করে, সুতরাং এটি "3.456.789,12", "3 456 789,12" ইত্যাদি হতে পারে
শৌটিহ

29

ইতিমধ্যে দুটি উচ্চ স্কোরিং উত্তর রয়েছে যা ডেসিমালকে বোঝায় R রাউন্ড (...) তবে আমি মনে করি আরও কিছুটা ব্যাখ্যা দরকার - কারণ ডেসিমালের একটি অপ্রত্যাশিত গুরুত্বপূর্ণ সম্পত্তি রয়েছে যা সুস্পষ্ট নয়।

একটি দশমিক 'জানে' কত দশমিক স্থান এটি কোথায় থেকে এসেছে তার উপর ভিত্তি করে।

উদাহরণস্বরূপ নিম্নলিখিতগুলি অপ্রত্যাশিত হতে পারে:

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"

অথবা এক্সএএমএল-এ আপনি কেবল ব্যবহার করেন {Binding Price, StringFormat=c}

এক্সেসএমএলকে অ্যামাজনের ওয়েব সার্ভিসে প্রেরণ করার সময় আমি যেখানে দশমিক দশমিক একটি প্রয়োজন সেখানে গিয়েছিলাম। পরিষেবাটি অভিযোগ করছিল কারণ একটি দশমিক মান (মূলত এসকিউএল সার্ভার থেকে প্রাপ্ত) হিসাবে প্রেরণ 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 এটি দুর্দান্ত উত্তর। যখন আপনি বলেন যে সিস্টেম.ডিসিমাল "জানেন যে কত দশমিক স্থান রয়েছে" - শব্দটি হ'ল সিস্টেম। ডেসিমাল অন্যান্য ভাসমান পয়েন্টের ধরণের হিসাবে স্ব-স্বাভাবিক হয় না। সিস্টেম.ডিজিমেলের আর একটি দরকারী সম্পত্তি হ'ল গণিত ক্রিয়াকলাপের ফলাফলের ক্ষেত্রে সর্বদা ইনপুট আর্গুমেন্টগুলি থেকে দশমিক স্থানের পরিমাণ থাকে ie 1.0 মি + 2.000 মি = 3.000 মি । আপনি এই বাস্তবতাকে দশমিক দশমিক কোনও স্থান না দিয়ে দশমিক স্থানে কেবল ১.০০ মিঃ দ্বারা গুন করে 2 দশমিক স্থানে বাধ্য করতে ব্যবহার করতে পারেন। 10 মি * 1.00 মি = 10.00 মি
ম্যাটডি ডেভী

2
ম্যাটড্যাভির ভুল, দশমিক নির্ভুলতা যুক্ত করা হয়েছে। (1.0 মি * 1.00 মি)। টুস্ট্রিং () = "1.000"
কাইদো

2
এটি যে জায়গা থেকে এসেছে তার উপর ভিত্তি করে এটি কত দশমিক স্থানের উপর নির্ভর করে "একটি দশমিক 'জানে' এটি জেনে রাখা খুব দরকারী" অনেক ধন্যবাদ!
ইহার্টচর্প

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

এটি ব্যাংকারদের বৃত্তাকার ব্যবহার করে না?
ড্যানিমাল

এটি সর্বোত্তম উপায়, কারণ মানটি স্ট্রিংতে রূপান্তরিত হয় না এবং আপনি এখনও গণিত ক্রিয়াকলাপ সম্পাদন করতে পারেন
shinji14

@ ড্যানিমাল: আপনি রাউন্ডিংয়ের ধরন পরিবর্তন করতে তৃতীয় যুক্তি সরবরাহ করতে পারেন
জয় সুলিভান

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লেখার সময় কোনও পদ্ধতি নেই।

নেট কোরটিতে আমাকে ব্যবহার করতে হয়েছিল:

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 ডিপি বাড়িয়ে নেওয়া দরকার

তারপরে আমাদের ২ ডিপি-র বেশি নেই তা নিশ্চিত করার জন্য গোল করে

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 দশমিক স্থানে থাকে এবং সিআই হ'ল লোকেল বা সংস্কৃতিফর্ম।

আরও তথ্যের জন্য এই লিঙ্কটি পরীক্ষা করুন
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx


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