Answers:
您是否需要显示最大小数位数?(您的示例最多为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文档。有一点说明,指出未指定精度时,十进制类型将保留尾随零。我不知道为什么要这么做,但是为我们的精度指定最大位数应该可以解决该问题。因此,格式化小数点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
这是我上面看到的另一种变化。就我而言,我需要保留小数点右边的所有有效数字,这意味着将所有零都放在最高有效数字之后。只是认为分享会很好。虽然我不能保证这样做的效率,但是当尝试实现美学效果时,您已经非常无效率了。
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;
}
仅此而已,我只想投入两分钱。
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','.');
这将删除十进制中的所有尾随零。
您唯一需要做的就是将其添加.ToString().TrimEnd('0','.');
到一个十进制变量中,以将a Decimal
转换为String
不带尾随零的a,如上例所示。
在某些区域,它应该是a .ToString().TrimEnd('0',',');
(使用逗号而不是点,但是您也可以添加点和逗号作为参数,以确保使用)。
(您也可以将两者都添加为参数)
params
参数时,不必显式构造数组。因此,TrimEnd("0".ToCharArray())
您无需编写冗长的代码TrimEnd('0')
(请注意:传递单值char
而不是char[]
)。
char
,而不是a 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
。