답변:
나는 다음을 사용한다 :
double x = Math.Truncate(myDoubleValue * 100) / 100;
예를 들어 :
숫자가 50.947563이고 다음을 사용하면 다음이 발생합니다.
- Math.Truncate(50.947563 * 100) / 100;
- Math.Truncate(5094.7563) / 100;
- 5094 / 100
- 50.94
그리고 답을 잘랐습니다. 이제 문자열을 포맷하려면 다음을 수행하십시오.
string s = string.Format("{0:N2}%", x); // No fear of rounding and takes the default number format
string.Format
문자열을 형식화하는 단계 와 동일한 단계 에서 문화권 구분 형식을 수행 할 수 있습니다 . 아래 답변을 참조하십시오.
다음 은 숫자를 반올림 하지만으로 인해 소수점 이하 2 자리까지 표시합니다 (마침표 0 제거) .##
.
decimal d0 = 24.154m;
decimal d1 = 24.155m;
decimal d2 = 24.1m;
decimal d3 = 24.0m;
d0.ToString("0.##"); //24.15
d1.ToString("0.##"); //24.16 (rounded up)
d2.ToString("0.##"); //24.1
d3.ToString("0.##"); //24
http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/
먼저 자른 다음 형식을 지정하는 것이 좋습니다.
double a = 123.4567;
double aTruncated = Math.Truncate(a * 100) / 100;
CultureInfo ci = new CultureInfo("de-DE");
string s = string.Format(ci, "{0:0.00}%", aTruncated);
2 자리 자르기에는 상수 100을 사용하십시오. 원하는 소수점 다음의 숫자만큼 1과 숫자 0을 사용하십시오. 서식 결과를 조정해야하는 문화권 이름을 사용하십시오.
new CultureInfo("de-DE")
, 당신은 정적 속성 사용해야합니다Culture.InvariantCulture
가장 간단한 방법은 숫자 형식 문자열을 사용하는 것입니다.
double total = "43.257"
MessageBox.Show(total.ToString("F"));
반올림 한 다음 버려야 할 소수를 하나 더 추가하는 방법은 다음과 같습니다.
var d = 0.241534545765;
var result1 = d.ToString("0.###%");
var result2 = result1.Remove(result1.Length - 1);
나는 이것이 오래된 실이라는 것을 알고 있지만 방금 이것을해야했습니다. 다른 접근 방식은 효과가 있지만에 대한 많은 호출에 영향을 줄 수있는 쉬운 방법을 원했습니다 string.format
. 따라서 Math.Truncate
모든 통화에를 추가하는 것은 실제로 좋은 옵션이 아닙니다. 또한 일부 서식이 데이터베이스에 저장되어 있기 때문에 훨씬 더 나빠졌습니다.
따라서 형식 지정 문자열에 잘림을 추가 할 수있는 사용자 지정 형식 공급자를 만들었습니다.
string.format(new FormatProvider(), "{0:T}", 1.1299); // 1.12
string.format(new FormatProvider(), "{0:T(3)", 1.12399); // 1.123
string.format(new FormatProvider(), "{0:T(1)0,000.0", 1000.9999); // 1,000.9
구현은 매우 간단하고 다른 요구 사항으로 쉽게 확장 할 수 있습니다.
public class FormatProvider : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof (ICustomFormatter))
{
return this;
}
return null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (arg == null || arg.GetType() != typeof (double))
{
try
{
return HandleOtherFormats(format, arg);
}
catch (FormatException e)
{
throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
}
}
if (format.StartsWith("T"))
{
int dp = 2;
int idx = 1;
if (format.Length > 1)
{
if (format[1] == '(')
{
int closeIdx = format.IndexOf(')');
if (closeIdx > 0)
{
if (int.TryParse(format.Substring(2, closeIdx - 2), out dp))
{
idx = closeIdx + 1;
}
}
else
{
throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
}
}
}
double mult = Math.Pow(10, dp);
arg = Math.Truncate((double)arg * mult) / mult;
format = format.Substring(idx);
}
try
{
return HandleOtherFormats(format, arg);
}
catch (FormatException e)
{
throw new FormatException(string.Format("The format of '{0}' is invalid.", format));
}
}
private string HandleOtherFormats(string format, object arg)
{
if (arg is IFormattable)
{
return ((IFormattable) arg).ToString(format, CultureInfo.CurrentCulture);
}
return arg != null ? arg.ToString() : String.Empty;
}
}
가치를 위해 통화를 표시하기 위해 다음을 사용할 수 있습니다 "C"
.
double cost = 1.99;
m_CostText.text = cost.ToString("C"); /*C: format as currentcy */
산출: $1.99
나 자신의 IFormatProvider를 작성할 수도 있지만 결국 실제 잘림을 수행하는 방법을 생각해야한다고 생각합니다.
.NET Framework는 사용자 지정 형식도 지원합니다. 여기에는 일반적으로 IFormatProvider 및 ICustomFormatter를 모두 구현하는 형식화 클래스 작성이 포함됩니다 . (msdn)
최소한 쉽게 재사용 할 수있을 것입니다.
CodeProject에 자신의 IFormatProvider / ICustomFormatter를 구현하는 방법에 대한 기사가 있습니다 . 이 경우 기존 숫자 형식을 "확장"하는 것이 가장 좋습니다. 너무 어려워 보이지 않습니다.
다음은 String 속성을 사용하는 디스플레이에만 사용할 수 있습니다.
double value = 123.456789;
String.Format("{0:0.00}", value);
시스템 의 CultureInformation 도 참고하십시오 . 반올림하지 않고 내 솔루션.
이 예에서는 변수 MyValue 를 double 로 정의하면 됩니다. 결과적으로 문자열 변수 NewValue 에서 형식화 된 값을 얻습니다 .
참고-C # using 문도 설정하십시오.
using System.Globalization;
string MyFormat = "0";
if (MyValue.ToString (CultureInfo.InvariantCulture).Contains (CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
{
MyFormat += ".00";
}
string NewValue = MyValue.ToString(MyFormat);