জিরো অনুসরণ না করে দশমিক প্রদর্শন করার সর্বোত্তম উপায়


107

এমন কোনও প্রদর্শন বিন্যাস আছে যে কোনও রাউন্ডিং না করে সি স্ট্রিংয়ের উপস্থাপনা হিসাবে দশমিকগুলি আউটপুট দেবে?

// decimal -> string

20 -> 20
20.00 -> 20
20.5 -> 20.5
20.5000 -> 20.5
20.125 -> 20.125
20.12500 -> 20.125
0.000 -> 0

{0. #} গোল হয়ে যাবে এবং কিছু ট্রিম টাইপ ফাংশন ব্যবহার করে গ্রিডে একটি আবদ্ধ সংখ্যাসূচক কলামের সাথে কাজ করবে না।

উত্তর:


147

আপনার কখনই প্রদর্শন করতে হবে এমন দশমিক স্থানের সর্বাধিক সংখ্যা রয়েছে? (আপনার উদাহরণগুলিতে সর্বাধিক 5 রয়েছে)।

যদি তা হয় তবে আমি মনে করব যে "0। #####" দিয়ে ফর্ম্যাট করা আপনার যা চাইবে তা করবে।

    static void Main(string[] args)
    {
        var dList = new decimal[] { 20, 20.00m, 20.5m, 20.5000m, 20.125m, 20.12500m, 0.000m };

        foreach (var d in dList)
            Console.WriteLine(d.ToString("0.#####"));
    }

4
এবং আপনি সর্বদা বিন্যাসে একটি বহিরাগত * সংখ্যার # প্রতীক ফেলে দিতে পারেন। * বৈজ্ঞানিক নয়
অ্যান্টনি পেগ্রাম

3
+1 - ঘটনাক্রমে, আপনার শীর্ষস্থানীয় # দরকার নেই। "0। #####" অভিন্নভাবে কাজ করে। এবং যে কোনও উপায়ে, এটি শূন্য থেকে দূরে (কেবলমাত্র এফওয়াইআই)।
ট্রুউইল

14
@ ট্রুইউইল আসলে এটি একটি পার্থক্য করে। d == 0.1 মিটার পরে "0. #" রেন্ডার করে "0.1" এবং "#। #" রেন্ডারগুলি ".1" অগ্রণী 0 ব্যতীত না হয় দুটিও ভুল বা সঠিক নয়, কেবল আপনি যা চান তার উপর নির্ভর করে।
অ্যারোনএলএস

4
আমার সর্বদা এক দশমিক স্থান প্রদর্শন করা দরকার, তাই আমি ফর্ম্যাট স্ট্রিংটি ব্যবহার করেছি "0.0#"
হামার

1
নীচে এরউইন মায়ারের উত্তর দেখুন।
shlgug

32

আমি ঠিক শিখি কিভাবে Gফর্ম্যাট স্পেসিফায়ার সঠিকভাবে ব্যবহার করতে হয়। দেখুন MSDN ডকুমেন্টেশন । কিছুটা নিচে একটি নোট রয়েছে যেটিতে বলা হয়েছে যে কোনও যথার্থতা নির্দিষ্ট করা না হলে পিছনের শূন্যগুলি দশমিক ধরণের জন্য সংরক্ষণ করা হবে। তারা কেন এটি করবে তা আমি জানি না, তবে আমাদের নির্ভুলতার জন্য সর্বাধিক সংখ্যার উল্লেখ করে সেই সমস্যাটি ঠিক করা উচিত। দশমিকের বিন্যাসের জন্য তাই G29সেরা বাজি।

decimal test = 20.5000m;
test.ToString("G"); // outputs 20.5000 like the documentation says it should
test.ToString("G29"); // outputs 20.5 which is exactly what we want

21
এই 0,00001 যদিও 1E-05 হিসেবে প্রদর্শিত হতে হবে
sehe

17

এই স্ট্রিং ফর্ম্যাটটি আপনার দিনটিকে তৈরি করবে: "০। ###############################" "। মনে রাখবেন যে দশমিকের সর্বাধিক 29 টি উল্লেখযোগ্য সংখ্যা থাকতে পারে।

উদাহরণ:

? (1000000.00000000000050000000000m).ToString("0.#############################")
-> 1000000.0000000000005

? (1000000.00000000000050000000001m).ToString("0.#############################")
-> 1000000.0000000000005

? (1000000.0000000000005000000001m).ToString("0.#############################")
-> 1000000.0000000000005000000001

? (9223372036854775807.0000000001m).ToString("0.#############################")
-> 9223372036854775807

? (9223372036854775807.000000001m).ToString("0.#############################")
-> 9223372036854775807.000000001

4
এটি সমস্যার সর্বাধিক সাধারণ উত্তর। কেন এটি দশমিকের জন্য ডিফল্ট "G" ফর্ম্যাট নয় তা নিশ্চিত। অনুসরণযোগ্য শূন্যগুলি কোনও তথ্য যোগ করে না। মাইক্রোসফ্ট ডকুমেন্টেশনের দশমিকের জন্য একটি অদ্ভুত ক্যাভিয়েট রয়েছে: ডকস.মাইক্রোসফট.ইন / ডটনেট / স্ট্যান্ডার্ড / বেসেটিপস / তবে, যদি সংখ্যাটি দশমিক হয় এবং যথার্থ স্পেসিফায়ার বাদ দেওয়া হয় তবে স্থির-পয়েন্ট স্বরলিপি সর্বদা ব্যবহৃত হয় এবং অনুসরণীয় শূন্যগুলি সংরক্ষিত আছে।
এরিক রোলার

10

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

public static string ToTrimmedString(this decimal target)
{
    string strValue = target.ToString(); //Get the stock string

    //If there is a decimal point present
    if (strValue.Contains("."))
    {
        //Remove all trailing zeros
        strValue = strValue.TrimEnd('0');

        //If all we are left with is a decimal point
        if (strValue.EndsWith(".")) //then remove it
            strValue = strValue.TrimEnd('.');
    }

    return strValue;
}

এটুকু, শুধু আমার দুটি সেন্টে ফেলে দিতে চেয়েছিল।


3
এটি সহজেই সেরা সমাধান, এটি "0.0" এর জন্যও ফুটিয়ে তোলে না। পূর্ণসংখ্যাকে "1.0" হিসাবে বিকল্প হিসাবে প্রদর্শন করতে আমি একটি ডিফল্ট পতাকা যুক্ত করেছি এবং এটি আমার সমস্ত দশমিককে লাইনে ফেলেছে। কেন এটি সর্বোত্তম উত্তর নয় তা বুঝতে পারি না, + প্রচুর।
স্টিভ হিবার্ট

2
এটি বিশেষত ভাল যদি কেউ ইতিমধ্যে আপনাকে একটি স্ট্রিং দিয়ে গেছে। আপনি কেবল এটিট্রিমড স্ট্রিং (এই স্ট্রিং স্ট্রভালিউ) এ পরিবর্তন করতে পারেন এবং প্রথম লাইনটি সরিয়ে ফেলতে পারেন।
PRMan

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

আপনি ToTrimmedString () কে কল করতে পারলে এটি একটি ভাল সমাধান তবে এমন অনেকগুলি ক্ষেত্রে রয়েছে যেখানে আপনি বিন্যাসের স্ট্রিংয়ের মধ্যে সীমাবদ্ধ।
মাইক মেরিনোস্কি

1
দশমিক বিভাজক সংস্কৃতি নির্দিষ্ট হতে হবে, আমি মনে করি এটি একটি ভাল সমাধান। একটি ছোট প্রশ্ন, চেকের strValue.TrimEnd('0').TrimEnd('.')পরিবর্তে কেন নয় EndsWith?
নওফাল

5

ডিসলেক্সিকানাবোকোর উত্তর ভিত্তিক আরেকটি সমাধান, তবে বর্তমান সংস্কৃতি থেকে স্বতন্ত্র:

public static string ToTrimmedString(this decimal num)
{
    string str = num.ToString();
    string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    if (str.Contains(decimalSeparator))
    {
        str = str.TrimEnd('0');
        if(str.EndsWith(decimalSeparator))
        {
            str = str.RemoveFromEnd(1);
        }
    }
    return str;
}

public static string RemoveFromEnd(this string str, int characterCount)
{
    return str.Remove(str.Length - characterCount, characterCount);
}

গ্রেট। স্কেলডিসিমাল ব্যতীত এটি সংস্কৃতিআইনফো। ইনভারিয়ান্টকালচার N নাম্বার ফর্ম্যাট N আঞ্চলিক সেটিংস সত্ত্বেও নম্বরের ডিসেমিলসপেটর।
ব্যবহারকারী 2091150

4

সম্প্রসারণ পদ্ধতি:

public static class Extensions
{
    public static string TrimDouble(this string temp)
    {
        var value = temp.IndexOf('.') == -1 ? temp : temp.TrimEnd('.', '0');
        return value == string.Empty ? "0" : value;
    }
}

উদাহরণ কোড:

double[] dvalues = {20, 20.00, 20.5, 20.5000, 20.125, 20.125000, 0.000};
foreach (var value in dvalues)
    Console.WriteLine(string.Format("{0} --> {1}", value, value.ToString().TrimDouble()));

Console.WriteLine("==================");

string[] svalues = {"20", "20.00", "20.5", "20.5000", "20.125", "20.125000", "0.000"};
foreach (var value in svalues)
    Console.WriteLine(string.Format("{0} --> {1}", value, value.TrimDouble()));

আউটপুট:

20 --> 20
20 --> 20
20,5 --> 20,5
20,5 --> 20,5
20,125 --> 20,125
20,125 --> 20,125
0 --> 0
==================
20 --> 20
20.00 --> 2
20.5 --> 20.5
20.5000 --> 20.5
20.125 --> 20.125
20.125000 --> 20.125
0.000 --> 0

1
"20.00 -> 2" আমি মনে করি এটি ভাল আচরণ নয়। এটিকে ঠিক করার জন্য দুইবার ট্রিমেন্ড ডাকুন: ট্রিমেন্ড ('0'); TrimEnd ( ',');
ভাদিম

2
উপরে লেখা কোডটি ব্যবহার করবেন না। @ ভ্যাডিমকে সঠিক যে এর আচরণ ত্রুটিযুক্ত। এটি যদি কোনও পিরিয়ড না থাকে তবে পিরিয়ডের পূর্বের পিছনের শূন্যগুলি ছাঁটাবে।
সেভিন 7

2
স্ট্যাকওভারফ্লোতে উত্তরগুলি অনুলিপি-পেস্টের জন্য নয়। এগুলি শেখার উত্স হিসাবে ব্যবহৃত হয় । এই নমুনা কোডটি আপনাকে IndexOfস্ট্রিংয়ের মধ্যে অক্ষরগুলি খুঁজে পেতে ব্যবহার করতে শেখায় । দশমিক ছাড়াই সমস্যা সমাধানের জন্য উদাহরণটি সামঞ্জস্য করা বেশ সহজ।
jgauffin

2

আমি মনে করি না যে এটি বাক্সের বাইরে থাকা সম্ভব তবে একটি সাধারণ পদ্ধতিতে এটি করা উচিত

public static string TrimDecimal(decimal value)
{
    string result = value.ToString(System.Globalization.CultureInfo.InvariantCulture);
    if (result.IndexOf('.') == -1)
        return result;

    return result.TrimEnd('0', '.');
}

2

বাক্সটি বাইরে করা বেশ সহজ:

Decimal YourValue; //just as example   
String YourString = YourValue.ToString().TrimEnd('0','.');

এটি আপনার দশমিক থেকে সমস্ত পিছনে জিরো সরিয়ে ফেলবে।

শুধু আপনাকে যা করতে হবে যোগ .ToString().TrimEnd('0','.');একটি দশমিক পরিবর্তনশীল করার জন্য একটি রূপান্তর করতে Decimalএকটি মধ্যে Stringউপরোক্ত উদাহরণের মত trailing শূন্য ছাড়া।

কিছু অঞ্চলে এটি হওয়া উচিত .ToString().TrimEnd('0',',');(যেখানে তারা বিন্দুর পরিবর্তে কমা ব্যবহার করে, তবে আপনি নিশ্চিত হওয়ার জন্য পরামিতি হিসাবে একটি বিন্দু এবং কমা যোগ করতে পারেন)।

(আপনি উভয় পরামিতি হিসাবে যুক্ত করতে পারেন)


আপনি এটি উপলব্ধি করতে পারেন না, কিন্তু একটি paramsতর্ক সঙ্গে কাজ করার সময় , আপনি স্পষ্টভাবে একটি অ্যারে নির্মাণ করতে হবে না। সুতরাং ভার্বোজের পরিবর্তে TrimEnd("0".ToCharArray())আপনি কেবল লিখতে পারেন TrimEnd('0')(দ্রষ্টব্য: charক এর পরিবর্তে একক পাস করেছেন char[])।
ড্যান তাও

@ ড্যান টাও: ধন্যবাদ, আমি তা ভুলে গেছি আমি সি # ব্যবহার করার পরে অনেকক্ষণ হয়ে গেল। যদিও উভয় সংস্করণ কাজ করে, আমি আমার পোস্টটি সম্পাদনা করেছি।
মার্ভিন

@ মারভিন: আপনাকে পাস করতে হবে, একটি charনয় string(তাই: একক উদ্ধৃতি, ডাবল কোট নয়)। আমি এটি আপনার জন্য স্থির করে রেখেছি - আশা করি আপনি আপত্তি করবেন না।
ড্যান তাও

1
আপনার সমাধানটি "২" এর মতো আউটপুট উত্পন্ন করবে যখন এটি কেবল জিরোস পেয়েছে।
jgauffin

2
তারপরে আমি কল করার পরামর্শ দেব oToString ()। TrimEnd ('0')। TrimEnd ('।')। পরিবর্তে '।' এটি সংস্কৃতি জুড়ে কাজ করে যাতে সংস্কৃতিআইনফোর.কন্টেনক্রালচার.নম্বার ফর্ম্যাট.নম্বার ডেসিমেলসপেটর ভাল হয়।
О Г И І И О


0

আমি নিম্নলিখিত কোডটি দিয়ে শেষ করেছি:

    public static string DropTrailingZeros(string test)
    {
        if (test.Contains(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
        {
            test = test.TrimEnd('0');
        }

        if (test.EndsWith(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
        {
            test = test.Substring(0,
                test.Length - CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator.Length);
        }

        return test;
    }

0

আমার এই রূপটি শেষ হয়েছে:

public static string Decimal2StringCompact(decimal value, int maxDigits)
    {
        if (maxDigits < 0) maxDigits = 0;
        else if (maxDigits > 28) maxDigits = 28;
        return Math.Round(value, maxDigits, MidpointRounding.ToEven).ToString("0.############################", CultureInfo.InvariantCulture);
    }

সুবিধাদি:

রানটাইমে প্রদর্শিত পয়েন্টের পরে আপনি সর্বাধিক সংখ্যা উল্লেখ করতে পারেন;

আপনি স্পষ্টভাবে একটি বৃত্তাকার পদ্ধতি নির্দিষ্ট করতে পারেন;

আপনি একটি সংস্কৃতি স্পষ্টভাবে নিয়ন্ত্রণ করতে পারেন।


0

আপনি এক্সটেনশন পদ্ধতি তৈরি করতে পারেন

public static class ExtensionMethod {
  public static decimal simplify_decimal(this decimal value) => decimal.Parse($"{this:0.############}");
}

0

আমার প্রকল্পগুলির একটিতে ফিট করার জন্য আমি নীচের এক্সটেনশন পদ্ধতিগুলি তৈরি করেছি তবে সম্ভবত সেগুলি অন্য কারও পক্ষে উপকারী হবে।

using System.Numerics;
using System.Text.RegularExpressions;
internal static class ExtensionMethod
{
    internal static string TrimDecimal(this BigInteger obj) => obj.ToString().TrimDecimal();
    internal static string TrimDecimal(this decimal obj) => new BigInteger(obj).ToString().TrimDecimal();
    internal static string TrimDecimal(this double obj) => new BigInteger(obj).ToString().TrimDecimal();
    internal static string TrimDecimal(this float obj) => new BigInteger(obj).ToString().TrimDecimal();
    internal static string TrimDecimal(this string obj)
    {
        if (string.IsNullOrWhiteSpace(obj) || !Regex.IsMatch(obj, @"^(\d+([.]\d*)?|[.]\d*)$")) return string.Empty;
        Regex regex = new Regex("^[0]*(?<pre>([0-9]+)?)(?<post>([.][0-9]*)?)$");
        MatchEvaluator matchEvaluator = m => string.Concat(m.Groups["pre"].Length > 0 ? m.Groups["pre"].Value : "0", m.Groups["post"].Value.TrimEnd(new[] { '.', '0' }));
        return regex.Replace(obj, matchEvaluator);
    }
}

যদিও এটিতে একটি রেফারেন্সের প্রয়োজন হবে System.Numerics

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