답변:
decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0
또는
decimalVar.ToString ("0.##"); // returns "0" when decimalVar == 0
Decimal
및 Double
type ToString
메소드는 형식화를위한 인수를 허용합니다. 먼저 값을 10 진수 / 더블로 변환 해보십시오.
나는 이것이 오래된 질문이라는 것을 알고 있지만 아무도 그 답을 올리지 않는 것 같았다.
이것이 내가 사용하는 것입니다 :
decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);
decimalVar.ToString("F");
이것은 :
23.456
→23.46
23
→ 23.00
; 12.5
→12.50
통화 표시에 이상적입니다.
ToString ( "F") 에 대한 문서를 확인하십시오 (Jon Schneider 덕분에).
.
대체 될 수 있습니다 ,
. CultureInfo.InvariantCulture
이를 비활성화하려면 두 번째 인수로 전달해야 합니다.
표시를 위해 이것을 필요로하는 경우 string을 사용하십시오.
String.Format("{0:0.00}", 123.4567m); // "123.46"
http://www.csharp-examples.net/string-format-double/
"m"은 10 진수 접미사입니다. 소수 접미사 정보 :
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"
) 가 표시되지 않습니다 .
소수점 이하 2 자리를 원할 때 약 95 % 확률이 있습니다. 통화 인 경우 통화 시간이 95 %에 해당 할 수 있습니다.
Decimal.Parse("25.0").ToString("c") => "$25.00"
또는 XAML에서 그냥 사용하십시오. {Binding Price, StringFormat=c}
XML을 Amazon의 웹 서비스에 보낼 때 10 진수로 10 진수가 필요한 경우가 발생했습니다. 10 진수 값 (원래 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"
의미 합니다 (필요하지 않은 경우 패딩 없음) (사용할 수없는 경우 0으로
Mike M.의 대답 은 .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);
}
최상위 답변은 문자열 표현의 형식을 지정하는 방법을 설명합니다 은 십진수 값 작동합니다.
그러나 실제로 저장된 정밀도를 실제 값으로 변경하려면 다음과 같이 작성해야합니다.
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는 소수점 2 자리까지의 문자열 형식이고 ci는 로케일 또는 cultureinfo 인 경우와 같이 인쇄 할 수 있습니다 .
자세한 내용은이 링크를 확인하십시오
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");
통화에 대해 원하는 경우 "F2"대신 "C2"를 입력하여 더 쉽게 만들 수 있습니다.