如果您运行此代码:
decimal d1 = 0m;
decimal d2 = 0.0m;
decimal d3 = 0.0000m;
string str1 = d1.ToString(System.Globalization.CultureInfo.InvariantCulture);
string str2 = d2.ToString(System.Globalization.CultureInfo.InvariantCulture);
string str3 = d3.ToString(System.Globalization.CultureInfo.InvariantCulture);
你得到:
str1: "0",
str2: "0.0",
str3: "0.0000"
在代码中是否有某种方法可以获得十进制变量中的小数位数(如上面的decimal.ToString输出)?
即。想得到:
d1: 0
d2: 1
d3: 4
(如果有人想知道为什么这是必需的,那么对于涉及SSRS和Excel的问题的某些变通方法代码:http://social.technet.microsoft.com/Forums/sqlserver/en-US/5c4fc104-5d69-409d-9a6e-a6354922729a/exporting-ssrs-report-to-excel-2007-excel-found-unreadable-content-in-file-xlsx)
修改
标题已更改。伙计们,我们很抱歉。在我试图解决的潜在问题中,小数始终为0 - 因此混淆。
答案 0 :(得分:2)
我认为这正是你所需要的MarcinJuraszek所说的
decimal d = 0.0000m;
int count = d.ToString(CultureInfo.InvariantCulture).
Substring(d.ToString(CultureInfo.InvariantCulture).
IndexOf(".") + 1).Length;
答案 1 :(得分:1)
decimal d3 = 0.0000m;
bool control = true;
string str = d3.ToString(CultureInfo.InvariantCulture);
int zeroCount = str.Select((c, index) =>
{
if (index > str.IndexOf('.') && c == '0' && control) return 1;
control = false;
return 0;
}).Sum();
答案 2 :(得分:1)
无效数字是介于十进制分隔符和第一个非零数字之间的数字,前提是该数字具有零整数部分,例如:
0.000 - 3 unsignificant digits
0.0001 - 3
0.000100 - 3 unsignificant digits (not 5!)
0.12301 - 0
0.1230 - 0
0.0123 - 1
1.0 - 0 unsignificant digits (not 1!)
1.0000 - 0 unsignificant digits (not 3!)
-0.0001 - 3
所以,解决方案可以是
public static int UnsignificantDigits(Decimal value) {
int result = 0;
String St = value.ToString(CultureInfo.InvariantCulture);
if (St.StartsWith("0.") || St.StartsWith("-0."))
for (int i = St.IndexOf('.') + 1; i < St.Length && St[i] == '0'; ++i)
result += 1;
return result;
}
...
int count = UnsignificantDigits(0.000m); // <- returns 3
答案 3 :(得分:0)
感谢@ V4Vendetta指点我另一个问题。
这就是诀窍:
int count = BitConverter.GetBytes(decimal.GetBits(yourDecimalHere)[3])[2];