2


0

10進数の長さに基づいて呼び出す関数を決定する

C#では、テキストボックスコントロールに2つの可能な数値がある状況があります。

番号は次のいずれかです。

{空} a).xxxx

or

b).xx

「テキストボックスに小数点以下4桁がある場合はこの関数を呼び出し、そうでない場合はテキストボックスに小数点以下2桁がある場合にこの関数を呼び出す」という条件を記述するにはどうすればよいですか。

簡単に思えますが、小数点以下の桁数を評価する方法がわかりません。

どうもありがとう!

5 Answer


3


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

ドットをハードコーディングする代わりに、システムの現在のカルチャから小数点記号を使用することもできます。


2


Decimalタイプの非常にあいまいな機能を利用できます。 その内部表現は、指数付きの96ビット数です。 小数桁がゼロであっても、指数は小数の桁数に等しくなります。 したがって:

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

ユーザー入力を検証する必要がある場合は、decimal.TryParse()を使用します。


2


正規表現を使用できます

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


1


Condition will evaluate true on two but not four 小数位:

Math.Round( 100*x ) == 100*x
  • EDIT:*上記の条件は、Decimalタイプでのみ機能します。 さて、以下はすべてのタイプの実数で動作します:

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

*編集:*文字列に興味がある場合は、次を使用します(拡張文字列には最後のポイントとそれに続く数字/数字が含まれます):

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


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;
    }

    ///
    /// 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.
    ///
    /// Value to check the number of held decimal places
    ///
    /// The number of decimal places in Value.
    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;
    }

}