Soru Sonraki 0'ları kaldırmak için C # ondalık biçimini nasıl biçimlendiririm?


Bir dizeyi ondalık olarak biçimlendirmek istiyorum, ancak ondalık onluktan sonra aşağıdaki sıfırları içerir. Anlamsız 0'ların ortadan kalkacağı şekilde nasıl biçimlendiririm?

string.Format("{0}", 1100M);
string.Format("{0}", 1100.1M);
string.Format("{0}", 1100.100M);
string.Format("{0}", 1100.1000M);

görüntüler:

1100
1100.1
1100.100
1100.1000

ama ben olmasını istiyorum:

1100
1100.1
1100.1
1100.1

Referans olarak, burada verilen cevaplar sayesinde bulduğumun esasen yinelenen diğer soruları burada bulabilirsiniz:


44
2018-01-24 20:18


Menşei


1002.231 Sadece bir örnek mi? Yani 1.12000'in 1.12 veya 1.120 olmasını ister misiniz? - n8wrl
Eğer isterseniz ondalık değerini kullanmalısınız, ör. 1100.1000m. "Ondalık edebi" için "m" ye dikkat edin. - Jon Skeet
@Jon: Ben de bunu fark ettim ve düzeltmeye gittim, ve döndüğünüzde yorumunuz beni bekliyordu .. Çok hızlı ...;) - Scott Stafford
@ n8wrl: Sadece bir örnek, evet, daha fazla örnekle güncelledim. - Scott Stafford


Cevaplar:


Kullanabilirsiniz ToString() ile Genel ("G") Biçim Belirteci İstenen sonuca ulaşmak için. Belirtilen bir hassasiyetle bu biçim dizesi kullanılırken, sıfırlar sıfırlanır. Herhangi bir durumda yuvarlanmayı önlemek için, kesinliği ondalık için izin verilen maksimum değere ayarlamanız gerekecektir (29).

İstediğiniz şeyi üretmek için kod satırı number.ToString("G29"), nerede number orijinal ondalık.

0.0001'den küçük sayıların bilimsel gösterime dönüştürüleceğini unutmayın. Bu biçimlendiricinin nasıl çalıştığı hakkında daha fazla bilgi, yukarıdaki referans linkte bulunabilir.


78
2018-01-24 21:20



Bence bu soruya en iyi çözüm. - Wegged
Uyumlu cevap. Teşekkürler, @Herohtar. - Scott Stafford
UYARI: 0.000001 gibi değerlere dikkat edin. G29 formatı bunları mümkün olan en kısa sürede gösterecek ve üstel gösterimine geçecektir. string.Format ("{0: G29}", decimal.Parse ("0.00000001", System.Globalization.CultureInfo.GetCultureInfo ("en-U‌ S"))) sonuç olarak "1E-08" değerini verir. Kredi burada Konrad'a gidiyor: stackoverflow.com/questions/4525854/remove-trailing-zeros/... - Doug S
@DougS: Görünüşe göre, 0.0001'den küçük sayılar için bilimsel gösterime geçiyor (örneğin, 0.0001 aynı kalıyor, ancak 0.00009 9E-05 olacak). Çoğu durumda sıfırları kırpmak için bir problem olmayacak gibi görünüyor. yine de bilmek güzel bir şey. - Herohtar
G29 gerekli değil. "G0" == "ondalık için G29" - statler


string s = d.ToString("0.#############################");

20
2018-04-06 11:52





Mutlaka anlamsız değiller - hesaplama sırasında kesinliği gösterirler. Ondalıklar normalleştirilmek yerine hassaslık seviyelerini korurlar.

İçinde bazı kod var bu cevap normalleştirilmiş bir değer döndürecek - bunu kullanabilir ve sonucu biçimlendirebilirsiniz. Örneğin:

using System;
using System.Numerics;

class Test
{
    static void Display(decimal d)
    {
        d = d.Normalize(); // Using extension method from other post
        Console.WriteLine(d);
    }

    static void Main(string[] args)
    {
        Display(123.4567890000m); // Prints 123.456789
        Display(123.100m);        // Prints 123.1
        Display(123.000m);        // Prints 123
        Display(123.4567891234m); // Prints 123.4567891234
    }
}

ben şüpheli Biçim dizgisi yaklaşımlarının çoğu başarısız olur. "0." biçimindeki bir dizgiyi tahmin ediyorum. ve sonra 28 # karakter çalışır, ama çok çirkin olurdu ...


4
2018-01-24 20:22



Çözümünüz sadece Net 4.0 içindir. - Gabe
@Gabe: Üçüncü taraf bir BigInteger uygulaması kullanmadığınız sürece, evet. Ayrıca oldukça verimsiz. Öte yandan, çalışmanın avantajı var :) - Jon Skeet


Belirtebilirsiniz biçim dizesi bunun gibi:

String.Format("{0:0.000}", x);

3
2018-01-24 20:21



Ama sonunda üç ondalık kırılma olduğunu bilmiyorum, bunun sadece bir örnek olduğunu kastediyorum. Soruyu daha net hale getireceğim. - Scott Stafford


Nasıl hakkında:

string FormatDecimal(decimal d)
{
    const char point = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator[0];
    string s = d.ToString();
    // if there's no decimal point, there's nothing to trim
    if (!s.Contains(point) == -1)
        return s;
    // trim any trailing 0s, followed by the decimal point if necessary
    return s.TrimEnd('0').TrimEnd(point);
}

3
2018-01-24 20:43



'.' Yerine System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator kullanın? - Yoshi


Herkesin kullanmayı önerdiği şeyden farklı olarak G biçimlendirici belirteci Ekstra sondaki sıfırları çıkarırken hem bin ayırıcı hem de ondalık noktayı korumak için aşağıdakileri öneririm:

{0:#,#.##}

Bu formatın sonucu çoğu durumda G'den daha iyidir:

String.Format("{0:#,#.##}",25/2.4);
10.42

String.Format("{0:#,#.##}",1000000);
1,000,000

String.Format("{0:#,#.##}",1000000.3600000);
1,000,000.36

Ve G belirleyici tüm olası kombinasyonları işleyemez:

String.Format("{0:G29}",25/2.4);
10.416666666666668

String.Format("{0:G2}",25/2.4);
10

String.Format("{0:G29}",1000000.3600000);
1000000.36

String.Format("{0:G2}",1000000.3600000);
1E+06

3
2018-04-30 07:16





Zaten birkaç cevabı var. Sıklıkla bu hile sayfasına başvuruyorum: http://blog.stevex.net/string-formatting-in-csharp/


2
2018-01-24 20:25





Biraz hack, ama bu işe yarayacak:

decimal a = 100.00M;
string strNumber = string.Format("{0}", a);
Console.WriteLine(strNumber.Contains('.') ? strNumber.TrimEnd('0').TrimEnd('.') : strNumber);

2
2018-01-24 20:29



Ah! Farzedelim a = 100.000? Veya a = 0? - Gabe
Farzedelim a = 100M? - kerkeslager
@Gabe Sabitleme sürecinde oldu - Davy8
Şaka düzeltilmelidir. Güncellenmiş cevaba herhangi bir counterexamples bulursanız bildirin. - Davy8
Güncellenmiş cevap hala tatmin edici olmadıkça bir indirmenin yapılmasına engel olmaz mı? - Davy8


Yapmak istediğine inanıyorum:

var s = String.Format("{0:#####.###}");

1
2018-01-24 20:23



123.45678900m için başarısız. - Jon Skeet


String.Format("{0:0.##}", 123.0); // "123"

1
2018-01-24 20:21



123.456789m için başarısız. - Jon Skeet
Olmalı ... String.Format ("{0: 0.0 ##}", 123.456789m) Teşekkürler - John K.