Відповіді:
decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0
або
decimalVar.ToString ("0.##"); // returns "0" when decimalVar == 0
Decimal
and Double
type ToString
метод приймає аргумент для форматування. Спробуйте спочатку перетворити свою величину в десятковий / подвійний.
Я знаю, що це давнє запитання, але я був здивований, побачивши, що ніхто, схоже, не розмістив відповіді на це;
Це я б використовував:
decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);
decimalVar.ToString("F");
Це буде:
23.456
→23.46
23
→ 23.00
; 12.5
→12.50
Ідеально підходить для відображення валюти.
Ознайомтеся з документацією на ToString ("F") (завдяки Джону Шнайдеру).
.
Можливо, можна замінити ,
на основі культури. Вам слід CultureInfo.InvariantCulture
надати другий аргумент, щоб вимкнути це.
Якщо вам просто потрібно це для відображення, використовуйте string.Format
String.Format("{0:0.00}", 123.4567m); // "123.46"
http://www.csharp-examples.net/string-format-double/
"M" - це десятковий суфікс. Про десятковий суфікс:
Дано десятковий d = 12,345; вирази d.ToString ("C") або String.Format ("{0: C}", d) дають $ 12,35 - зауважте, що використовуються поточні налаштування валюти культури, включаючи символ.
Зауважте, що "C" використовує кількість цифр від поточної культури. Ви завжди можете змінити за замовчуванням, щоб змусити потрібну точність C{Precision specifier}
подібним чином String.Format("{0:C2}", 5.123d)
.
Якщо ви хочете, щоб він був відформатований комами, а також десятковою комою (але не символом валюти), наприклад, 3,456,789.12 ...
decimalVar.ToString("n2");
Уже є два відповіді на високу оцінку, які стосуються Decimal.Round (...), але я думаю, що потрібно трохи більше пояснень - адже є несподівана важлива властивість Decimal, яка не очевидна.
Десяткова знає «скільки знаків», скільки знаків після десяткового коду вона базується, звідки вона походить.
Наприклад, таке може бути несподіваним:
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"
Виконуючи ті ж самі операції, Double
не даватиме десяткових знаків ( "25"
) для кожного з перерахованих вище.
Коли ви хочете, щоб знаки від десятків до двох знаків після коми містили приблизно 95% шансів, тому що це валюта, в цьому випадку це, мабуть, добре протягом 95%:
Decimal.Parse("25.0").ToString("c") => "$25.00"
Або в XAML, який ви просто використовуєте {Binding Price, StringFormat=c}
Один випадок, коли я наштовхнувся на те, де мені знадобився десятковий знак AS, як десяткове, було при надсиланні XML у веб-сервіс Amazon. Служба скаржилась на те, що десяткове значення (спочатку з SQL Server) надсилалося як 25.1200
і відхилено, (25.12
був очікуваним форматом).
Все, що мені потрібно було зробити, - це Decimal.Round(...)
2 знаки після коми, щоб вирішити проблему.
// This is an XML message - with generated code by XSD.exe
StandardPrice = new OverrideCurrencyAmount()
{
TypedValue = Decimal.Round(product.StandardPrice, 2),
currency = "USD"
}
TypedValue
типу, Decimal
тому я не міг просто зробити, ToString("N2")
і мені потрібно було його округлити і зберегти як decimal
.
Ось невелика програма Linqpad для показу різних форматів:
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("===================");
}
Ось результати:
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
===================
Дуже рідко ви хочете пусту рядок, якщо значення дорівнює 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"
Відповідь із найкращим рейтингом невірна і витрачала 10 хвилин часу (більшість) людей.
"#"
означає цифру цифри (якщо потрібно) (без прокладки, якщо вона не потрібна) "0"
означає цифру числа (не матер що) (
Відповідь Майка М. була ідеальною для мене в .NET, але .NET Core не має decimal.Round
методу на момент написання.
У .NET Core мені довелося використовувати:
decimal roundedValue = Math.Round(rawNumber, 2, MidpointRounding.AwayFromZero);
Хокі-метод, включаючи перетворення в рядок, це:
public string FormatTo2Dp(decimal myNumber)
{
// Use schoolboy rounding, not bankers.
myNumber = Math.Round(myNumber, 2, MidpointRounding.AwayFromZero);
return string.Format("{0:0.00}", myNumber);
}
Нічого з цього не зробило саме те, що мені потрібно, щоб примусити 2 dp і округлити як0.005 -> 0.01
Примусовий 2 dp вимагає підвищення точності на 2 dp, щоб переконатися, що ми маємо принаймні 2 dp
то округлення, щоб переконатися, що у нас більше 2 дп
Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)
6.665m.ToString() -> "6.67"
6.6m.ToString() -> "6.60"
Відповідь з найвищою оцінкою описує метод форматування рядкового подання десяткового значення, і він працює.
Однак якщо ви дійсно хочете змінити збережену точність на фактичну величину, вам потрібно написати щось на зразок наступного:
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;
}
}
Приклад одиничного тесту:
[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"));
}
Ви можете використовувати system.globalization для форматування номера в будь-якому необхідному форматі.
Наприклад:
system.globalization.cultureinfo ci = new system.globalization.cultureinfo("en-ca");
Якщо у вас є a decimal d = 1.2300000
і вам потрібно порізати його на 2 десяткових знаки, він може бути надрукований таким чином, d.Tostring("F2",ci);
коли F2 - це рядковий формат до двох десяткових знаків, а ci - місцевість або інформація про культуру.
Для отримання додаткової інформації перегляньте це посилання
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
https://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx
Це посилання детально пояснює, як можна впоратися зі своєю проблемою та що ти можеш зробити, якщо хочеш дізнатися більше. Для простоти те, що ви хочете зробити
double whateverYouWantToChange = whateverYouWantToChange.ToString("F2");
якщо ви хочете це для валюти, ви можете зробити це простіше, ввівши "C2" замість "F2"
Double Amount = 0;
string amount;
amount=string.Format("{0:F2}", Decimal.Parse(Amount.ToString()));
Якщо вам потрібно зберегти лише два знаки після коми (тобто відрізати всі решта десяткових цифр):
decimal val = 3.14789m;
decimal result = Math.Floor(val * 100) / 100; // result = 3.14
Якщо вам потрібно зберегти лише 3 знаки після коми:
decimal val = 3.14789m;
decimal result = Math.Floor(val * 1000) / 1000; // result = 3.147