সি # ডাবল - টুস্ট্রিং () দুটি দশমিক জায়গার সাথে ফর্ম্যাট করা তবে কোনও রাউন্ডিং নেই


153

মাত্র দুটি দশমিক স্থান 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
@ জনি যে এটি কাজ করবে না কারণ এটি বৃত্তাকার হয় - ওপি চায় যে এটি কেটে যাবে (এবং গোল নয়)। পার্থক্যটি সূক্ষ্ম।
বিকেএসপুরজন 5'19

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 দিয়ে চেষ্টা করুন। এই সমাধানগুলি রাউন্ডগুলি কাটছে না un
বিজেউরি

5
বাহ, এত বেশি ভোট এবং এখনও এটি রাউন্ডিং ব্যবহার করছে। এটি উল্লেখ করা প্রয়োজন যে রাউন্ডিংটি অনুরোধ করা নিকটতম দশমিক স্থানের দিকে এগিয়ে চলেছে, যেখানে অনুরোধ করা নিকটতম দশমিক স্থানের পরে কাটা কাটা ছাড়ছে।
মাইস্টিকোডার

1
@ মাইস্টকোডার আমার ধারণা আমার উত্তরটি অনেকগুলি উত্সাহ পেয়েছে কারণ তারা গুগল অনুসন্ধানে ঠিক একইভাবে অপেশনের প্রশ্নে আসে, আমি অনুসরণ করা শূন্যগুলি অপসারণ করতে চেয়েছি এবং ওপিএস প্রশ্নের গোলাকৃত ইচ্ছা খুঁজছেন না for আমার ধারণা আমার উত্তরটি মুছে ফেলা উচিত ...
ব্রায়ান ওগডেন

@ ব্রায়ানঅগডেন - না, দয়া করে মুছবেন না। আমি আপনার উত্তর খুঁজতে এখানে পৌঁছেছি। +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 ব্যবহার করুন। ফর্ম্যাটিংয়ের ফলাফলটি সামঞ্জস্য করতে আপনার প্রয়োজন সংস্কৃতির নামটি।


আমি মনে করি পরিবর্তে new CultureInfo("de-DE"), আপনার স্থির সম্পত্তি ব্যবহার করা উচিতCulture.InvariantCulture
ভঞ্চ


13

আমি price.ToString("0.00") নেতৃস্থানীয় 0 গুলি পাওয়ার জন্য ব্যবহার করি


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
এই ক্ষেত্রে গোলাকারটি কাট অফের উপরে এক অঙ্কের বেশি প্রভাবিত করে এমন ক্ষেত্রে কাজ করবে না। উদাহরণস্বরূপ ০.৯৯৯৯৯৯ এই কোডটি ০.০৯ এর পরিবর্তে ০.২০ হিসাবে শেষ হবে।
বার্নেম

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;
    }
}

2

জামারিন ফর্মগুলির সাথে আমার এই সমস্যাটি ছিল এবং এটি দিয়ে এটি সমাধান করে:

percent.ToString("0.##"+"%")

1

মুদ্রা প্রদর্শনের জন্য যা মূল্যবান তা আপনি ব্যবহার করতে পারেন "C":

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

আউটপুট: $1.99


0

আপনি নিজের আইওফর্ম্যাটপ্রাইডারটিও লিখতে পারেন , যদিও আমি মনে করি অবশেষে আপনাকে প্রকৃত কাটাকাটি করার উপায় সম্পর্কে ভাবতে হবে।

.NET ফ্রেমওয়ার্ক কাস্টম বিন্যাসকে সমর্থন করে। এটি সাধারণত একটি ফর্ম্যাটিং ক্লাস তৈরির সাথে জড়িত যা আইফর্ম্যাটপ্রোভিডার এবং আইসিস্টম ফরমেটার উভয়ই প্রয়োগ করে । (MSDN)

অন্তত এটি সহজেই পুনরায় ব্যবহারযোগ্য হবে।

কোডপোজেক্টে এখানে কীভাবে আপনার নিজের আইফর্ম্যাটপ্রোভিডার / আইসুস্টম ফর্ম্যাটটার বাস্তবায়ন করবেন সে সম্পর্কে একটি নিবন্ধ রয়েছে । এই ক্ষেত্রে, একটি বিদ্যমান সংখ্যার ফর্ম্যাট "প্রসারিত" সেরা বেট হতে পারে। এটা খুব শক্ত দেখাচ্ছে না।


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 (আপনি কত নম্বর সংরক্ষণ করতে চান তার উপর এই সংখ্যাটি নির্ভর করে question প্রশ্ন মালিক চাই বলেই আমি এটি দুটি দিই))


0

এছাড়াও সংস্কৃতি তথ্য নোট করুনআপনার সিস্টেমের । এখানে গোল না করে আমার সমাধান।

এই উদাহরণে আপনাকে কেবল পরিবর্তনশীল MyValueটিকে ডাবল হিসাবে সংজ্ঞায়িত করতে হবে । ফলস্বরূপ আপনি স্ট্রিং ভেরিয়েবল নিউভ্যালুতে আপনার ফর্ম্যাট মানটি পাবেন

দ্রষ্টব্য - বিবৃতি ব্যবহার করে সি # সেট করুন:

using System.Globalization;  

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

string NewValue = MyValue.ToString(MyFormat);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.