我有一个重载的扩展方法,可以将小数或双数四舍五入到小数点后的N位,而且工作得很完美。
public static class NumberExtensions
{
public static string ToStringNDecimalPlaces(this double dbValue, int nDecimal)
{
return dbValue.ToString("N" + nDecimal);
}
public static string ToStringNDecimalPlaces(this decimal dbValue, int nDecimal)
{
return dbValue.ToString("N" + nDecimal);
}
}
我的问题是,我想创建另一个类似 "ToStringFirstDecimalPlace "或类似的方法,它接收小数值并将其四舍五入到0之后的第一个逻辑小数值。让我给一些,我希望这个方法是这样的。
例如:
因此,它忽略了前导的0,并将第n位取为第一个有意义的逻辑数,而不是仅仅取整为0.0。
那么你就不能先算出0的个数,然后再进行相应的格式化吗?
例如对于正值。
string result;
if(dbValue != 0)
{
int count = 0;
var copyDb = dbValue;
while(copyDb < 1)
{
copyDb *= 10;
count++;
}
result = dbValue.ToStringNDecimalPlaces(count);
}
else
{
result = "0";
}
你可以写下面的函数来实现这个功能。
public static string ToStringNDecimalPlacesIgnoreZeros(this double dbValue)
{
var value = dbValue - Math.Floor(dbValue); // Get rid of integer digits
int position = 0;
while (value > 0 && Math.Floor(value) == 0)
{
value = value * 10;
position += 1;
}
if (value == 0)
return dbValue.ToString("N");
else
return dbValue.ToStringNDecimalPlaces( position);
}
首先,假设输入值在0到1之间,包括在内。如果不是,则先减去整数部分(如果是负数,则否定剩余部分),然后再对其余部分进行四舍五入(这个过程可以在四舍五入完成后反过来)。然后,做类似这样的事情。
RountToFirstLogical(input)
1. place = 1
2. while place > input
3. place = place / 10
4. input = round(input/place) * place
5. return input
例子:
input=0.000345879
place=1, 0.1, 0.01, 0.001, 0.0001
input/place = 3.45879
round(input/place) = 3
round(input/place) * place = 0.0003
input=0.019356
place=1, 0.1, 0.01
input/place = 1.9356
round(input/place) = 2
round(input/place)*place = 0.02
input=0.1
place=1, 0.1
input/place=1
round(input/place)=1
round(input/place)*place=0.1