获取十进制小数位数(包括非小数位)

时间:2014-01-22 05:39:17

标签: c# .net

如果您运行此代码:

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 - 因此混淆。

4 个答案:

答案 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];

(来自:https://stackoverflow.com/a/13493771/70140