编辑:更新以简化处理不同的文化背景。
与 @Miguel 类似,以下是我将如何处理:
public static int getDecimalCount(double dVal, string sVal, string culture)
{
CultureInfo info = CultureInfo.GetCultureInfo(culture);
double test = Convert.ToDouble(sVal, info);
char[] sep = info.NumberFormat.NumberDecimalSeparator.ToCharArray();
if (dVal != test)
{
throw new System.ArgumentException("dVal doesn't equal sVal for the specified culture");
}
string[] segments = sVal.Split(sep);
switch (segments.Length)
{
case 1:
return 0;
case 2:
return segments[1].Length;
default:
throw new Exception("Something bad happened!");
}
}
还有一个美式英语的快捷方式:
public static int getDecimalCount(double dVal, string sVal)
{
return getDecimalCount(dVal, sVal, "en-US");
}
测试:
static void Main(string[] args)
{
int i = 0;
double d = 5900.00;
string s = "5900.00";
Console.WriteLine("Testing with dVal = {0} and sVal = {1}.", d, s);
i = getDecimalCount(d, s);
Console.WriteLine("Expected output: 2. Actual output: {0}", i);
Console.WriteLine();
d = 5900.09;
s = "5900.09";
Console.WriteLine("Testing with dVal = {0} and sVal = {1}.", d, s);
i = getDecimalCount(d, s);
Console.WriteLine("Expected output: 2. Actual output: {0}", i);
Console.WriteLine();
d = 5900.000;
s = "5900.000";
Console.WriteLine("Testing with dVal = {0} and sVal = {1}.", d, s);
i = getDecimalCount(d, s);
Console.WriteLine("Expected output: 3. Actual output: {0}", i);
Console.WriteLine();
d = 5900.001;
s = "5900.001";
Console.WriteLine("Testing with dVal = {0} and sVal = {1}.", d, s);
i = getDecimalCount(d, s);
Console.WriteLine("Expected output: 3. Actual output: {0}", i);
Console.WriteLine();
d = 1.0;
s = "1.0";
Console.WriteLine("Testing with dVal = {0} and sVal = {1}.", d, s);
i = getDecimalCount(d, s);
Console.WriteLine("Expected output: 1. Actual output: {0}", i);
Console.WriteLine();
d = 0.0000005;
s = "0.0000005";
Console.WriteLine("Testing with dVal = {0} and sVal = {1}.", d, s);
i = getDecimalCount(d, s);
Console.WriteLine("Expected output: 7. Actual output: {0}", i);
Console.WriteLine();
d = 1.0000000;
s = "1.0000000";
Console.WriteLine("Testing with dVal = {0} and sVal = {1}.", d, s);
i = getDecimalCount(d, s);
Console.WriteLine("Expected output: 7. Actual output: {0}", i);
Console.WriteLine();
d = 5900822;
s = "5900822";
Console.WriteLine("Testing with dVal = {0} and sVal = {1}.", d, s);
i = getDecimalCount(d, s);
Console.WriteLine("Expected output: 0. Actual output: {0}", i);
Console.ReadLine();
}
最后,测试结果如下:
测试dVal为5900,sVal为5900.00。
预期输出:2。 实际输出:2
测试dVal为5900.09,sVal为5900.09。
预期输出:2。 实际输出:2
测试dVal为5900,sVal为5900.000。
预期输出:3。 实际输出:3
测试dVal为5900.001,sVal为5900.001。
预期输出:3。 实际输出:3
测试dVal为1,sVal为1.0。
预期输出:1。 实际输出:1
测试dVal为5E-07,sVal为0.0000005。
预期输出:7。 实际输出:7
测试dVal为1,sVal为1.0000000。
预期输出:7。 实际输出:7
测试dVal为5900822,sVal为5900822。
预期输出:0。 实际输出:0
如果您有任何问题或不理解,请让我知道。