Jawaban:
decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0
atau
decimalVar.ToString ("0.##"); // returns "0" when decimalVar == 0
Decimal
dan Double
ketik ToString
metode menerima argumen untuk pemformatan. Coba konversi nilai Anda ke Desimal / Double terlebih dahulu.
Saya tahu ini adalah pertanyaan lama, tetapi saya terkejut melihat bahwa tidak ada yang mengirim jawaban itu;
Inilah yang akan saya gunakan:
decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);
decimalVar.ToString("F");
Ini akan:
23.456
→23.46
23
→ 23.00
; 12.5
→12.50
Ideal untuk menampilkan mata uang.
Lihatlah dokumentasi di ToString ("F") (terima kasih kepada Jon Schneider).
.
Mungkin diganti dengan ,
berdasarkan budaya. Anda harus menyampaikan CultureInfo.InvariantCulture
argumen kedua untuk menonaktifkan ini.
Jika Anda hanya membutuhkan ini untuk tampilan gunakan string.Format
String.Format("{0:0.00}", 123.4567m); // "123.46"
http://www.csharp-examples.net/string-format-double/
"M" adalah sufiks desimal. Tentang sufiks desimal:
Diberikan desimal d = 12,345; ekspresi d.ToString ("C") atau String.Format ("{0: C}", d) menghasilkan $ 12,35 - perhatikan bahwa pengaturan mata uang budaya saat ini termasuk simbol digunakan.
Perhatikan bahwa "C" menggunakan jumlah digit dari kultur saat ini. Anda selalu dapat mengesampingkan standar untuk memaksa presisi yang diperlukan dengan C{Precision specifier}
sejenisnya String.Format("{0:C2}", 5.123d)
.
Jika Anda ingin itu diformat dengan koma serta titik desimal (tetapi tidak ada simbol mata uang), seperti 3,456.789,12 ...
decimalVar.ToString("n2");
Sudah ada dua jawaban skor tinggi yang merujuk ke Desimal. Putaran (...) tapi saya pikir sedikit lebih banyak penjelasan diperlukan - karena ada sifat penting tak terduga dari Desimal yang tidak jelas.
Desimal 'tahu' berapa banyak tempat desimal yang didasarkan pada dari mana asalnya.
Misalnya, hal-hal berikut mungkin tidak terduga:
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"
Melakukan operasi yang sama dengan tidak Double
akan memberikan tempat desimal ( "25"
) untuk masing-masing di atas.
Ketika Anda ingin desimal ke 2 tempat desimal, ada kemungkinan 95% karena mata uangnya dalam hal ini mungkin baik untuk 95% waktu:
Decimal.Parse("25.0").ToString("c") => "$25.00"
Atau di XAML yang baru saja Anda gunakan {Binding Price, StringFormat=c}
Satu kasus saya berlari ke tempat saya membutuhkan AS desimal desimal adalah ketika mengirim XML ke layanan web Amazon. Layanan ini mengeluh karena nilai Desimal (berasal dari SQL Server) dikirim sebagai 25.1200
dan ditolak, ( 25.12
adalah format yang diharapkan).
Yang perlu saya lakukan adalah Decimal.Round(...)
dengan 2 tempat desimal untuk memperbaiki masalah.
// This is an XML message - with generated code by XSD.exe
StandardPrice = new OverrideCurrencyAmount()
{
TypedValue = Decimal.Round(product.StandardPrice, 2),
currency = "USD"
}
TypedValue
adalah tipe Decimal
jadi saya tidak bisa hanya melakukan ToString("N2")
dan perlu untuk memutarnya dan menyimpannya sebagai decimal
.
Berikut ini adalah program Linqpad kecil untuk menampilkan berbagai format:
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("===================");
}
Inilah hasilnya:
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
===================
Sangat jarang Anda menginginkan string kosong jika nilainya 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"
Jawaban berperingkat teratas adalah salah dan menghabiskan 10 menit waktu (kebanyakan) orang.
"#"
berarti digit angka (jika perlu) (tanpa padding jika tidak diperlukan) "0"
berarti digit angka (tanpa mater apa pun) (diisi dengan nol jika tidak tersedia)
Jawaban Mike M. sempurna bagi saya di .NET, tetapi .NET Core tidak memiliki decimal.Round
metode pada saat penulisan.
Di .NET Core, saya harus menggunakan:
decimal roundedValue = Math.Round(rawNumber, 2, MidpointRounding.AwayFromZero);
Metode peretasan, termasuk konversi ke string, adalah:
public string FormatTo2Dp(decimal myNumber)
{
// Use schoolboy rounding, not bankers.
myNumber = Math.Round(myNumber, 2, MidpointRounding.AwayFromZero);
return string.Format("{0:0.00}", myNumber);
}
Tidak ada yang melakukan apa yang saya butuhkan, untuk memaksa 2 dp dan dibulatkan menjadi0.005 -> 0.01
Memaksa 2 dp membutuhkan peningkatan presisi sebesar 2 dp untuk memastikan kami memiliki setidaknya 2 dp
kemudian pembulatan untuk memastikan kita tidak memiliki lebih dari 2 dp
Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)
6.665m.ToString() -> "6.67"
6.6m.ToString() -> "6.60"
Jawaban berperingkat teratas menjelaskan metode untuk memformat representasi string dari nilai desimal, dan itu berfungsi.
Namun, jika Anda benar-benar ingin mengubah presisi yang disimpan ke nilai aktual, Anda perlu menulis sesuatu seperti berikut:
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;
}
}
Contoh uji unit:
[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"));
}
Anda dapat menggunakan system.globalisasi untuk memformat angka dalam format apa pun yang diperlukan.
Sebagai contoh:
system.globalization.cultureinfo ci = new system.globalization.cultureinfo("en-ca");
Jika Anda memiliki decimal d = 1.2300000
dan Anda perlu memotongnya ke 2 tempat desimal maka dapat dicetak seperti ini di d.Tostring("F2",ci);
mana F2 adalah string yang membentuk ke 2 tempat desimal dan ci adalah locale atau cultureinfo.
untuk info lebih lanjut, periksa tautan ini
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
https://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx
Tautan ini menjelaskan secara terperinci bagaimana Anda dapat menangani masalah Anda dan apa yang dapat Anda lakukan jika Anda ingin mempelajari lebih lanjut. Untuk tujuan kesederhanaan, apa yang ingin Anda lakukan adalah
double whateverYouWantToChange = whateverYouWantToChange.ToString("F2");
jika Anda menginginkan ini untuk mata uang, Anda dapat membuatnya lebih mudah dengan mengetikkan "C2" daripada "F2"
Double Amount = 0;
string amount;
amount=string.Format("{0:F2}", Decimal.Parse(Amount.ToString()));
Jika Anda hanya perlu menyimpan 2 tempat desimal (mis. Potong semua angka desimal lainnya):
decimal val = 3.14789m;
decimal result = Math.Floor(val * 100) / 100; // result = 3.14
Jika Anda hanya perlu menyimpan 3 tempat desimal:
decimal val = 3.14789m;
decimal result = Math.Floor(val * 1000) / 1000; // result = 3.147