根据小数的长度确定要调用的函数

时间:2010-01-17 17:17:42

标签: c# floating-point decimal

在C#中,我的情况是文本框控件中有两个可能的数字。

数字可以是:

a).xxxx

b).xx

如何编写一个条件,说“如果文本框有4位小数,则调用此函数,否则,如果文本框有2位小数,则调用此函数。”

似乎很简单,但我不知道如何评估小数位。

非常感谢!

5 个答案:

答案 0 :(得分:3)

if(txtNumber.Text.Split(new[]{'.'})[1].Length == 2)
{
    //case b
}
else
{
    //case a
}

你可能想从系统的当前文化中取小数分隔符,而不是硬编码点。

答案 1 :(得分:2)

您可以利用Decimal类型的一个非常模糊的功能。它的内部表示是一个带有指数的96位数字。指数等于分数中的位数,即使小数位数为零。因此:

public static int GetFractionalDigits(string txt) {
  decimal value = decimal.Parse(txt);
  return (decimal.GetBits(value)[3] >> 16) & 0x7fff;
}

如果需要验证用户输入,请使用decimal.TryParse()。

答案 2 :(得分:2)

您可以使用Regex

new Regex(@"\.\d{2}$").IsMatch(input.Value)

答案 3 :(得分:1)

条件将在两个但不是四个小数位上评估true

Math.Round( 100*x ) == 100*x

编辑:以上条件仅适用于十进制类型。好吧,以下适用于所有类型的实数:

( Math.Ceiling( 100 * x ) - 100 * x ) < 10e-8 )

编辑:好吧,如果您对字符串感兴趣,请使用以下内容(扩展字符串包含最后一个点和后续数字/数字):

System.IO.Path.GetExtension( input ).Length

答案 4 :(得分:1)

根据您的需要,这可能无法完美运行,但它可以用于我的目的,对其他人有用。

static class MathCustom
{
    static public byte NumberOfDecimals(decimal value)
    {
        sbyte places = -1;
        decimal testValue;

        do
        {
            places++;
            testValue = Math.Round(value, places);
        } while (testValue != value);

        return (byte)places;
    }

    static public byte NumberOfDecimals(float value)
    {
        sbyte places = -1;
        float testValue;

        do
        {
            places++;
            testValue = (float)Math.Round((decimal)value, places);
        } while (testValue != value);

        return (byte)places;
    }

    /// <summary>
    /// This version of NumberOfDecimals allows you to provide a Maximum
    /// for allowable decimals. This method will allow for the correction
    /// of floating point errors when it is less than 10 or passed in as null.
    /// </summary>
    /// <param name="value">Value to check the number of held decimal places</param>
    /// <param name="knownMaximum"></param>
    /// <returns>The number of decimal places in Value.</returns>
    static public byte NumberOfDecimals(decimal value, byte? knownMaximum)
    {
        byte maximum;
        decimal localValue;
        sbyte places = -1;
        decimal testValue;

        if (knownMaximum == null)
        {
            maximum = 9;
        }
        else
        {
            maximum = (byte)knownMaximum;
        }

        localValue = Math.Round(value, maximum);

        do
        {
            places++;
            testValue = Math.Round(localValue, places);
        } while (testValue != localValue);

        return (byte)places;
    }

}