답변:
표시해야 할 소수점 이하 자릿수가 최대입니까? (귀하의 예제는 최대 5 개입니다).
그렇다면 "0. #####"로 서식을 지정하면 원하는 작업을 수행 할 수 있다고 생각합니다.
static void Main(string[] args)
{
var dList = new decimal[] { 20, 20.00m, 20.5m, 20.5000m, 20.125m, 20.12500m, 0.000m };
foreach (var d in dList)
Console.WriteLine(d.ToString("0.#####"));
}
"0.0#"
.
G
형식 지정자 를 올바르게 사용하는 방법을 방금 배웠습니다 . MSDN 문서를 참조하십시오 . 정밀도가 지정되지 않은 경우 10 진수 유형에 대해 후행 0이 보존된다는 메모가 약간 있습니다. 그들이 이것을하는 이유는 모르겠지만 정밀도에 대한 최대 자릿수를 지정하면 문제가 해결됩니다. 따라서 소수 형식을 지정 G29
하는 것이 가장 좋습니다.
decimal test = 20.5000m;
test.ToString("G"); // outputs 20.5000 like the documentation says it should
test.ToString("G29"); // outputs 20.5 which is exactly what we want
이 문자열 형식은 "0. ############################"입니다. 그러나 소수는 최대 29 자리의 유효 자릿수를 가질 수 있습니다.
예 :
? (1000000.00000000000050000000000m).ToString("0.#############################")
-> 1000000.0000000000005
? (1000000.00000000000050000000001m).ToString("0.#############################")
-> 1000000.0000000000005
? (1000000.0000000000005000000001m).ToString("0.#############################")
-> 1000000.0000000000005000000001
? (9223372036854775807.0000000001m).ToString("0.#############################")
-> 9223372036854775807
? (9223372036854775807.000000001m).ToString("0.#############################")
-> 9223372036854775807.000000001
이것은 위에서 본 것의 또 다른 변형입니다. 제 경우에는 소수점 오른쪽에있는 모든 유효 자릿수를 보존해야합니다. 즉, 최상위 자릿수 뒤에있는 모든 0을 삭제합니다. 공유하는 것이 좋을 것이라고 생각했습니다. 나는 이것의 효율성을 보증 할 수는 없지만 미학을 얻으려고 할 때 이미 비 효율성에 거의 휩싸입니다.
public static string ToTrimmedString(this decimal target)
{
string strValue = target.ToString(); //Get the stock string
//If there is a decimal point present
if (strValue.Contains("."))
{
//Remove all trailing zeros
strValue = strValue.TrimEnd('0');
//If all we are left with is a decimal point
if (strValue.EndsWith(".")) //then remove it
strValue = strValue.TrimEnd('.');
}
return strValue;
}
그게 다야, 그냥 내 2 센트를 던지고 싶었어.
strValue.TrimEnd('0').TrimEnd('.')
대신 왜 EndsWith
안되는가?
dyslexicanaboko의 답변을 기반으로 하지만 현재 문화와는 무관 한 또 다른 솔루션 :
public static string ToTrimmedString(this decimal num)
{
string str = num.ToString();
string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
if (str.Contains(decimalSeparator))
{
str = str.TrimEnd('0');
if(str.EndsWith(decimalSeparator))
{
str = str.RemoveFromEnd(1);
}
}
return str;
}
public static string RemoveFromEnd(this string str, int characterCount)
{
return str.Remove(str.Length - characterCount, characterCount);
}
연장 방법 :
public static class Extensions
{
public static string TrimDouble(this string temp)
{
var value = temp.IndexOf('.') == -1 ? temp : temp.TrimEnd('.', '0');
return value == string.Empty ? "0" : value;
}
}
예제 코드 :
double[] dvalues = {20, 20.00, 20.5, 20.5000, 20.125, 20.125000, 0.000};
foreach (var value in dvalues)
Console.WriteLine(string.Format("{0} --> {1}", value, value.ToString().TrimDouble()));
Console.WriteLine("==================");
string[] svalues = {"20", "20.00", "20.5", "20.5000", "20.125", "20.125000", "0.000"};
foreach (var value in svalues)
Console.WriteLine(string.Format("{0} --> {1}", value, value.TrimDouble()));
산출:
20 --> 20
20 --> 20
20,5 --> 20,5
20,5 --> 20,5
20,125 --> 20,125
20,125 --> 20,125
0 --> 0
==================
20 --> 20
20.00 --> 2
20.5 --> 20.5
20.5000 --> 20.5
20.125 --> 20.125
20.125000 --> 20.125
0.000 --> 0
IndexOf
문자열 내에서 문자를 찾는 데 사용 하는 방법 을 알려줍니다 . 소수없이 문제를 해결하기 위해 예제를 조정하는 것은 매우 쉽습니다.
나는 그것이 즉시 가능하다고 생각하지 않지만 이와 같은 간단한 방법으로 할 수 있습니다.
public static string TrimDecimal(decimal value)
{
string result = value.ToString(System.Globalization.CultureInfo.InvariantCulture);
if (result.IndexOf('.') == -1)
return result;
return result.TrimEnd('0', '.');
}
상자에서 꺼내는 것은 매우 쉽습니다.
Decimal YourValue; //just as example
String YourString = YourValue.ToString().TrimEnd('0','.');
Decimal에서 모든 후행 0을 제거합니다.
당신이해야 할 유일한 일은 위의 예와 같이 .ToString().TrimEnd('0','.');
소수점 변수에 추가 하여 Decimal
a String
를 후행 0없이 로 변환하는 것입니다.
일부 지역에서는 a .ToString().TrimEnd('0',',');
(점 대신 쉼표를 사용하지만 확인을 위해 점과 쉼표를 매개 변수로 추가 할 수도 있음) 여야합니다.
(둘 다 매개 변수로 추가 할 수도 있습니다)
params
인수를 다룰 때 명시 적으로 배열을 구성 할 필요는 없습니다. 따라서 자세한 정보 대신 TrimEnd("0".ToCharArray())
쓸 수 있습니다 TrimEnd('0')
(참고 : char
a 대신 단일 전달됨 char[]
).
char
합니다 string
(따라서 큰 따옴표가 아니라 작은 따옴표). 나는 당신을 위해 그것을 고쳤습니다.
다음 코드로 끝났습니다.
public static string DropTrailingZeros(string test)
{
if (test.Contains(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
{
test = test.TrimEnd('0');
}
if (test.EndsWith(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
{
test = test.Substring(0,
test.Length - CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator.Length);
}
return test;
}
이 변종으로 끝났습니다.
public static string Decimal2StringCompact(decimal value, int maxDigits)
{
if (maxDigits < 0) maxDigits = 0;
else if (maxDigits > 28) maxDigits = 28;
return Math.Round(value, maxDigits, MidpointRounding.ToEven).ToString("0.############################", CultureInfo.InvariantCulture);
}
장점 :
런타임에 표시 할 포인트 이후의 최대 유효 자릿수를 지정할 수 있습니다.
라운드 방법을 명시 적으로 지정할 수 있습니다.
문화를 명시 적으로 제어 할 수 있습니다.
내 프로젝트 중 하나에 맞게 아래 확장 방법을 만들었지 만 다른 사람에게 도움이 될 수도 있습니다.
using System.Numerics;
using System.Text.RegularExpressions;
internal static class ExtensionMethod
{
internal static string TrimDecimal(this BigInteger obj) => obj.ToString().TrimDecimal();
internal static string TrimDecimal(this decimal obj) => new BigInteger(obj).ToString().TrimDecimal();
internal static string TrimDecimal(this double obj) => new BigInteger(obj).ToString().TrimDecimal();
internal static string TrimDecimal(this float obj) => new BigInteger(obj).ToString().TrimDecimal();
internal static string TrimDecimal(this string obj)
{
if (string.IsNullOrWhiteSpace(obj) || !Regex.IsMatch(obj, @"^(\d+([.]\d*)?|[.]\d*)$")) return string.Empty;
Regex regex = new Regex("^[0]*(?<pre>([0-9]+)?)(?<post>([.][0-9]*)?)$");
MatchEvaluator matchEvaluator = m => string.Concat(m.Groups["pre"].Length > 0 ? m.Groups["pre"].Value : "0", m.Groups["post"].Value.TrimEnd(new[] { '.', '0' }));
return regex.Replace(obj, matchEvaluator);
}
}
에 대한 참조가 필요하지만 System.Numerics
.