ट्रेलिंग शून्य हटा दें


177

मेरे पास कुछ फ़ील्ड हैं जिन्हें संग्रह के रूप में लौटाया गया है

2.4200
2.0044
2.0000

मुझे जैसे परिणाम चाहिए

2.42
2.0044
2

मैंने कोशिश की String.Format, लेकिन यह लौटता है 2.0000और इसे N0अन्य मूल्यों के साथ-साथ गोल करता है।


3
शुरू में रिकॉर्ड प्रकार स्ट्रिंग है ??
सिंगलटन

2
मेरा उत्तर देखें: String.Format()'G' के साथ वही होना चाहिए जो आप चाहते हैं .. मैंने अपना उत्तर मानक संख्यात्मक प्रारूपों के लिंक के साथ अद्यतन किया है। बहुत ही उपयोगकर्ता।
डॉग कान्स

3
एक दशमलव के लिए डाला जा सकता है double, और ToStringदोहरे के लिए डिफ़ॉल्ट अनुगामी शून्य का उत्सर्जन करता है। पढ़ने के इस
प्रकार का नृत्य Weitzhandler

2
और यह शायद "G" ToStringफ़ंक्शन को एक स्ट्रिंग-प्रारूप के रूप में पारित करने की तुलना में कम प्रदर्शन (रिकॉर्ड की बहुत बड़ी मात्रा का अंतर) खर्च करेगा ।
शिम्मी वेइटहैंडलर

4
आपको दशमलव को एक डबल में नहीं बदलना चाहिए, यह महत्व खो देगा, और दो गोलाई अशुद्धि की शक्ति का परिचय दे सकता है।
kristianp

जवाबों:


167

क्या यह उतना सरल नहीं है, अगर इनपुट एक स्ट्रिंग है? आप इनमें से किसी एक का उपयोग कर सकते हैं:

string.Format("{0:G29}", decimal.Parse("2.0044"))

decimal.Parse("2.0044").ToString("G29")

2.0m.ToString("G29")

यह सभी इनपुट के लिए काम करना चाहिए।

अपडेट की जाँच करें मानक न्यूमेरिक फॉर्मेट्स जो मैंने स्पष्ट रूप से स्पष्ट निर्दिष्ट करने के लिए 29 के रूप में निर्धारित किए हैं डॉक्स स्पष्ट रूप से राज्य:

हालाँकि, यदि संख्या एक दशमलव है और सटीक विनिर्देश छोड़ दिया जाता है, तो निश्चित-बिंदु संकेतन का उपयोग हमेशा किया जाता है और अनुगामी शून्य संरक्षित किए जाते हैं

अपडेट कोनराड ने टिप्पणियों में बताया :

0.000001 जैसे मूल्यों के लिए देखें। G29 प्रारूप उन्हें कम से कम संभव तरीके से प्रस्तुत करेगा ताकि यह घातीय संकेतन पर स्विच हो जाए। string.Format("{0:G29}", decimal.Parse("0.00000001",System.Globalization.CultureInfo.GetCultureInfo("en-US")))परिणाम के रूप में "1E-08" देगा।


1
सभी उत्तरों में से, आपके कम से कम चरण शामिल थे। शुक्रिया डॉग एर्स।
Zo है

4
var d = 2.0 मी; d.ToString ( "जी");
डेव हिलियर

3
@Dave Hillier - मैं देख रहा हूँ, मैंने अपना उत्तर सही कर लिया है। चीयर्स। [जोड़ा गया 'सटीक स्पेसिफायर']
डॉग एर्स

16
0.000001 जैसे मूल्यों के लिए देखें। G29 प्रारूप उन्हें कम से कम संभव तरीके से प्रस्तुत करेगा ताकि यह घातीय संकेतन पर स्विच हो जाए। string.Format ("{0: G29}", दशमलव.पर्स ("0.00000001", System.Globalization.CultureInfo.GetCultureInfo ("en-US")) परिणाम के रूप में "1E-08" देगा
कोनराड

15
@Konrad - क्या 5 या 6 दशमलव स्थानों वाले संख्याओं के लिए वैज्ञानिक संकेतन से बचने का एक तरीका है?
जिल

202

मैं उसी समस्या में भाग गया लेकिन ऐसे मामले में जहां मेरे पास स्ट्रिंग को आउटपुट का नियंत्रण नहीं है, जो एक पुस्तकालय द्वारा ध्यान रखा गया था। दशमलव प्रकार के कार्यान्वयन में विवरण देखने के बाद (देखें http://msdn.microsoft.com/en-us/library/system.decimal.getbits.aspx ), मैं एक नीरस चाल (विस्तार के रूप में यहाँ) के साथ आया हूँ तरीका):

public static decimal Normalize(this decimal value)
{
    return value/1.000000000000000000000000000000000m;
}

दशमलव का घातांक भाग केवल उसी चीज़ तक घटाया जाता है, जिसकी आवश्यकता होती है। आउटपुट दशमलव पर ToString () को कॉल करना बिना किसी अनुगामी 0. एग के नंबर लिख देगा

1.200m.Normalize().ToString();

29
यह उत्तर स्वामी का है क्योंकि मूल रूप से इस प्रश्न (और यहां तक ​​कि पूरे विषय) पर प्रत्येक अन्य उत्तर वास्तव में कार्य करता है और वही करता है जो ओपी पूछ रहा है।
कॉक्सी

2
यहाँ 0 की संख्या एक सटीक मात्रा है या केवल सबसे अपेक्षित मूल्यों को कवर करने के लिए?
साइमन_वेक

3
MSDN बताता है कि "स्केलिंग फैक्टर संख्या 10 है, जो 0 से 28 तक के एक घातांक तक बढ़ा है", जिसे मैं समझता हूं कि दशमलव संख्या में दशमलव बिंदु के पिछले 28 अंकों में सबसे अधिक अंक होंगे। शून्य की कोई संख्या> = 28 काम करना चाहिए।
थॉमस मटर्न

2
यह सबसे अच्छा जवाब है! उत्तर में संख्या में 34 आंकड़े हैं, उसके 1बाद 33 0-s है, लेकिन यह decimal29 आंकड़ों, एक 1और 28 0-s के साथ एक संख्या के समान उदाहरण बनाता है । जैसे @ThomasMaterna ने अपनी टिप्पणी में कहा। किसी के System.Decimalपास 29 से अधिक आंकड़े नहीं हो सकते हैं (प्रमुख अंकों से अधिक संख्या कुल 28 आंकड़े हो 79228...सकती है )। यदि आप अधिक ट्रेलिंग शून्य चाहते हैं , तो विभाजन के बजाय गुणा करें । इसके अलावा, कुछ शून्य बंद काटना कर सकते हैं उदाहरण के लिए, देता है , तो केवल एक शून्य छोड़ दिया है। 1.000...mMath.RoundMath.Round(27.40000m, 2)27.40m
जेपी स्टिग नील्सन

2
ग्रेट ट्रिक लेकिन मोनो पर काम नहीं करता है और .NET के फीचर संस्करणों पर काम करने की गारंटी नहीं दी जाती है
Bigjim

87

मेरी राय में कस्टम न्यूमेरिक फॉर्मेट स्ट्रिंग्स का उपयोग करना अधिक सुरक्षित है ।

decimal d = 0.00000000000010000000000m;
string custom = d.ToString("0.#########################");
// gives: 0,0000000000001
string general = d.ToString("G29");
// gives: 1E-13

25
एकमात्र उत्तर के लिए +1 जो स्थिर, प्रलेखित व्यवहार पर निर्भर करता है।
पापेल्व

3
आपको वहाँ 28 '# वर्ण डालना चाहिए, blackwasp.co.uk/DecimalTrailingZeroes.aspx देखें ।
Jaime Hablutzel

32

मैं "G29" वैज्ञानिक संकेतन से बचने के लिए इस कोड का उपयोग करता हूं:

public static string DecimalToString(this decimal dec)
{
    string strdec = dec.ToString(CultureInfo.InvariantCulture);
    return strdec.Contains(".") ? strdec.TrimEnd('0').TrimEnd('.') : strdec;
}

EDIT: सिस्टम कल्चरइन्फो का उपयोग करके। NumberFormat.NumberDecimalSeparator:

public static string DecimalToString(this decimal dec)
{
    string sep = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    string strdec = dec.ToString(CultureInfo.CurrentCulture);
    return strdec.Contains(sep) ? strdec.TrimEnd('0').TrimEnd(sep.ToCharArray()) : strdec;
}

1
यह एक अद्भुत उत्तर है। यह बहुत सरल है और आप वास्तव में देख सकते हैं कि मैजिक स्ट्रिंग फॉर्मेटर का उपयोग करने के बजाय क्या हो रहा है।
टिमोथी गोंजालेज

9
अच्छा लगा, लेकिन यह उन संस्कृतियों के लिए काम नहीं करेगा जो दशमलव विभाजक के लिए अल्पविराम का उपयोग करते हैं। आप का उपयोग करने की आवश्यकता होगीCulture.NumberFormat.NumberDecimalSeparator
blearyeye

1
सर्वश्रेष्ठ दृष्टिकोण। बाकी सब कुछ अनावश्यक रूप से जटिल है। हमेशा याद रखें कि अगर आपके नंबर में दशमलव बिंदु है, तो हमेशा जांचें।
आरआरएम

1
एक विस्तार होने के लिए पैरामीटर से पहले "यह" याद आ रही है: सार्वजनिक स्थैतिक स्ट्रिंग DecimalToString (यह दशमलव डेस)
जोओ

टिप्पणी के लिए आपका बहुत-बहुत धन्यवाद। मैंने सुझावों के साथ एक नए संस्करण के साथ उत्तर को अपडेट किया है।
x7BiT

19

हैश का उपयोग करें ( #) केवल 0 की आवश्यकता होने पर अनुगामी प्रदर्शित करने के लिए प्रतीक। नीचे दिए गए परीक्षण देखें।

decimal num1 = 13.1534545765;
decimal num2 = 49.100145;
decimal num3 = 30.000235;

num1.ToString("0.##");       //13.15%
num2.ToString("0.##");       //49.1%
num3.ToString("0.##");       //30%

7
उत्तर नहीं। आप ट्रेलिंग शून्य को नहीं हटा रहे हैं, आप सटीकता को हटा रहे हैं। आपकी प्रस्तावित विधि num1.ToString("0.##")वापस आनी चाहिए 13.1534545765(कोई परिवर्तन नहीं) किसी भी अनुगामी शून्य नहीं हैं।
Jan 'splite' K.

और यही कारण है कि मैं अपने तीन प्रस्तावित आदानों के उत्तर प्रदर्शित कर रहा हूं ताकि उपयोगकर्ता देख सकें कि मेरा समाधान कैसे काम करता है।
फ़िज़िक्स

प्रस्तावित इनपुटों को सूचीबद्ध करने पर भी यह प्रश्न का उत्तर नहीं देता है।
डेव फ्राइडल

2
अगर मैं कर सकता हूँ तो यह 10 गुना बढ़ा देता है। वास्तव में मुझे क्या चाहिए!
सबक्वेरीक्रंच

1
सवाल का सही जवाब। मेरी राय में सबसे अच्छा जवाब। टिप्पणी करें कि यह सटीकता को हटाता है, सही है, लेकिन यह quesiton नहीं था। सबसे महत्वपूर्ण - यह वही है जो मुझे चाहिए। मेरे उपयोगकर्ता आमतौर पर पूरे नंबर दर्ज करेंगे, शायद 2.5 जैसा कुछ, लेकिन मुझे दशमलव बिंदु से परे 3 अंकों का समर्थन करने की आवश्यकता है। इसलिए मैं उन्हें देना चाहता हूं जो उन्होंने दर्ज किया था, न कि शून्य के एक समूह के साथ जो उन्होंने दर्ज नहीं किया। जैसे, Console.Write ($ "num3 = {num3: 0। ##}"); => अंक 3 = 30
बोबकी

13

मुझे http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/ से एक सुंदर समाधान मिला

मूल रूप से

decimal v=2.4200M;

v.ToString("#.######"); // Will return 2.42. The number of # is how many decimal digits you support.

1
ध्यान दें कि यदि vहै 0m, तो आपके कोड का परिणाम इसके बजाय एक रिक्त स्ट्रिंग है "0"
सैम

2
हाँ। यह "0। ########" होना चाहिए।
PRMan

2

एक बहुत ही निम्न स्तर का दृष्टिकोण, लेकिन मैं यह मानता हूं कि यह केवल तेजी से पूर्णांक गणना (और कोई धीमी स्ट्रिंग पार्सिंग और संस्कृति संवेदनशील तरीकों) का उपयोग करके सबसे अच्छा तरीका होगा:

public static decimal Normalize(this decimal d)
{
    int[] bits = decimal.GetBits(d);

    int sign = bits[3] & (1 << 31);
    int exp = (bits[3] >> 16) & 0x1f;

    uint a = (uint)bits[2]; // Top bits
    uint b = (uint)bits[1]; // Middle bits
    uint c = (uint)bits[0]; // Bottom bits

    while (exp > 0 && ((a % 5) * 6 + (b % 5) * 6 + c) % 10 == 0)
    {
        uint r;
        a = DivideBy10((uint)0, a, out r);
        b = DivideBy10(r, b, out r);
        c = DivideBy10(r, c, out r);
        exp--;
    }

    bits[0] = (int)c;
    bits[1] = (int)b;
    bits[2] = (int)a;
    bits[3] = (exp << 16) | sign;
    return new decimal(bits);
}

private static uint DivideBy10(uint highBits, uint lowBits, out uint remainder)
{
    ulong total = highBits;
    total <<= 32;
    total = total | (ulong)lowBits;

    remainder = (uint)(total % 10L);
    return (uint)(total / 10L);
}

1
मैं इस मार्ग जाने की कोशिश की, लेकिन यह आगे अनुकूलित तो यह वास्तव में बहुत तेजी से तुम्हारा से मिल गया जैसे विभाजित नहीं द्वारा, था हाय और मध्य ints (अपने aऔर bजबकि यात्रा हर में) अगर वे सब शून्य वैसे भी कर रहे हैं। हालाँकि तब मुझे यह आश्चर्यजनक रूप से सरल समाधान लगा, जो आसानी से आपको और मुझे प्रदर्शन के साथ आया था
यूजीन बेरेसोवस्की

2

यह काम करेगा:

decimal source = 2.4200m;
string output = ((double)source).ToString();

या यदि आपका प्रारंभिक मूल्य है string:

string source = "2.4200";
string output = double.Parse(source).ToString();

इस टिप्पणी पर ध्यान दें ।


2
@ डैमियन, हां, और ध्यान दें, इन puroposes के लिए (आप कुछ भी महसूस नहीं करेंगे जब तक आप एक अरब रिकॉर्ड नहीं करते हैं), सबसे पहले क्योंकि डबल तेज है, दूसरा, क्योंकि स्ट्रिंग फ़ंक्शन को स्ट्रिंग प्रारूप में पारित करने की तुलना में अधिक प्रदर्शन लागत नहीं है पासिंग पाराम्स। जब तक आप रिकॉर्ड के गजलों पर काम नहीं करेंगे तब तक आपको कुछ भी महसूस नहीं होगा।
शिम्मी वेइटहैंडलर

1
आपको G को निर्दिष्ट करने की आवश्यकता नहीं है, cuz double.ToStringडिफ़ॉल्ट रूप से ट्रेलिंग शून्य हटाता है।
शिम्मी वेइटहैंडलर

4
0.000001 जैसे मूल्यों के लिए देखें। इन्हें घातीय संकेतन में प्रस्तुत किया जाएगा। double.Parse ("0.00000001", System.Globalization.CultureInfo.GetCultureInfo ("en-US"))। ToString () परिणाम के रूप में "1E-08" देगा
कोनराड

17
कभी ऐसा मत करो। आमतौर पर, आपके पास एक दशमलव होने का कारण यह है कि आप एक संख्या का सटीक रूप से प्रतिनिधित्व कर रहे हैं (लगभग एक डबल की तरह नहीं)। दी, यह फ़्लोटिंग पॉइंट त्रुटि शायद बहुत छोटी है, लेकिन गलत संख्या प्रदर्शित करने में परिणाम कर सकता है, कोई नहीं-कम
एडम Tegen

2
आउच, प्रारूपण के लिए 128-बिट डेटाटाइप (दशमलव) को 64-बिट डेटाटाइप (डबल) में परिवर्तित करना, एक अच्छा विचार नहीं है!
avl_sweden

2

यह सरल है।

decimal decNumber = Convert.ToDecimal(value);
        return decNumber.ToString("0.####");

का परीक्षण किया।

चियर्स :)


1

निर्भर करता है कि आपका नंबर क्या दर्शाता है और आप मूल्यों का प्रबंधन कैसे करना चाहते हैं: क्या यह एक मुद्रा है, क्या आपको राउंडिंग या ट्रंकेशन की आवश्यकता है, क्या आपको केवल प्रदर्शन के लिए इस राउंडिंग की आवश्यकता है?

यदि प्रदर्शन के लिए संख्याओं को स्वरूपित करने पर विचार करें तो x.ToString ("")

http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx और

http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

यदि यह केवल राउंडिंग है, तो Math.Round अधिभार का उपयोग करें जिसे एक MidPointRounding अधिभार की आवश्यकता होती है

http://msdn.microsoft.com/en-us/library/ms131274.aspx )

यदि आप एक डेटाबेस से अपना मूल्य प्राप्त करते हैं, तो रूपांतरण के बजाय कास्टिंग पर विचार करें: डबल मान = (दशमलव) myRecord ["columnName"];


0

आप बस के रूप में सेट कर सकते हैं:

decimal decNumber = 23.45600000m;
Console.WriteLine(decNumber.ToString("0.##"));

1
उस काम के लिए आपको सिर्फ दो के बजाय अट्ठाईस '' वर्ण लगाने चाहिए।
Jaime Hablutzel

हाँ, मैंने उनके प्रश्न को गलत समझा ... = /
डैनिलो फरेरा

0

यदि आप दशमलव संख्या रखना चाहते हैं, तो निम्नलिखित उदाहरण देखें:

number = Math.Floor(number * 100000000) / 100000000;

0

DecimalToString ( https://stackoverflow.com/a/34486763/3852139 ) के अधिक अनुकूल समाधान करने की कोशिश कर रहा है :

private static decimal Trim(this decimal value)
{
    var s = value.ToString(CultureInfo.InvariantCulture);
    return s.Contains(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator)
        ? Decimal.Parse(s.TrimEnd('0'), CultureInfo.InvariantCulture)
        : value;
}

private static decimal? Trim(this decimal? value)
{
    return value.HasValue ? (decimal?) value.Value.Trim() : null;
}

private static void Main(string[] args)
{
    Console.WriteLine("=>{0}", 1.0000m.Trim());
    Console.WriteLine("=>{0}", 1.000000023000m.Trim());
    Console.WriteLine("=>{0}", ((decimal?) 1.000000023000m).Trim());
    Console.WriteLine("=>{0}", ((decimal?) null).Trim());
}

आउटपुट:

=>1
=>1.000000023
=>1.000000023
=>

-1

बहुत सरल जवाब है TrimEnd () का उपयोग करना। यहाँ परिणाम है,

double value = 1.00;
string output = value.ToString().TrimEnd('0');

आउटपुट 1 है यदि मेरा मान 1.01 है तो मेरा आउटपुट 1.01 होगा


4
अगर के बारे में क्या value = 100?
स्टीफन ड्रू

4
@Raj De Inno भले ही मूल्य 1.00 है, लेकिन यह जो उत्पादन दे रहा है वह "1." है नहीं "1"
सिम्बा

-1

निम्नलिखित कोड का उपयोग स्ट्रिंग प्रकार का उपयोग नहीं करने के लिए किया जा सकता है:

int decimalResult = 789.500
while (decimalResult>0 && decimalResult % 10 == 0)
{
    decimalResult = decimalResult / 10;
}
return decimalResult;

रिटर्न 789.5


-2

Truncate अनुगामी शून्य बहुत आसान है, एक द्वैध कलाकारों के साथ हल:

        decimal mydecimal = decimal.Parse("1,45000000"); //(I)
        decimal truncate = (decimal)(double)mydecimal;   //(II)

(I) -> किसी भी स्ट्रिंग स्रोत से दशमलव दशमलव मान।

(II) -> पहला: इसे दोगुना करने के लिए कास्ट करें जो पीछे चल रहे शून्य को हटा दें। दूसरा: दशमलव के अन्य कलाकार क्योंकि न ही दशमलव से दोहरे और वाइसवर्सा में निहित रूपांतरण मौजूद है)


5
आप उन सभी मानों को मानते हैं जो एक दशमलव में फिट होंगे, एक डबल में फिट होंगे। इसके कारण एक अतिप्रवाह हो सकता है। तुम भी ढीली परिशुद्धता हो सकता है।
मार्टिन मूलर

-2

इस कोड को आज़माएं:

string value = "100";
value = value.Contains(".") ? value.TrimStart('0').TrimEnd('0').TrimEnd('.') : value.TrimStart('0');

क्यों दो जवाब, मेरे दोस्त?
उग्र

2
उन स्थानों के बारे में जो 'उपयोग नहीं करते हैं।'
मार्टिन मूलर

इस पोस्ट के भीतर अन्य दृष्टिकोणों की तुलना में बिल्कुल भी विकल्प नहीं है। स्ट्रिंग और बैक में
बदलना

-11

इस तरह की कोशिश करो

string s = "2.4200";

s = s.TrimStart('0').TrimEnd('0', '.');

और फिर इसे तैरने के लिए परिवर्तित करें


1
आप उस के लिए subString()विधि का उपयोग कर सकते हैं , लेकिन यहाँ पोस्ट किए गए प्रश्न के अनुसार, मुझे उस तरह की कोई आवश्यकता नहीं
दिखती है

2
उन स्थानों के बारे में जो 'का उपयोग नहीं करते हैं।'
डेव हिलियर

10
यह संख्या के लिए बुरी तरह से विफल रहता है जो 10.0 का एक से अधिक गुण हैं।
बेन वॉइग्ट

1
@BenVoigt ने जो कहा है वह पूरी तरह से सही है, क्योंकि एक परीक्षा "12300.00"को छंटनी की जाएगी "123"। एक और प्रभाव जो अवांछनीय लगता है, वह यह है कि कुछ संख्याएँ, जैसे "0.00"कि खाली स्ट्रिंग के नीचे सभी तरह से छंटनी की जाती हैं ""(हालाँकि यह संख्या अभिन्न "10.0 का एकाधिक" होने का एक विशेष मामला है)।
जेपी स्टिग नील्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.