2010-01-17 74 views
2

在C#中,我有一種情況,在文本框控件中有兩個可能的數字。根據小數長度確定調用哪個函數

的數字可以是:

一).XXXX

B).XX

我怎樣寫,說的條件,「如果文本有4個小數位,然後調用此函數,否則,如果文本框有2個小數位,則調用此函數。「

看起來很簡單,但我不知道如何評估小數位數。

非常感謝!

+1

如果用戶輸入「.1200」,您是否想要將其計爲4位小數或2? – DyingCactus

+0

0是否顯着?即「3.4200」被認爲是2位數或4位數? –

+0

感謝您的反饋...對不起,我不清楚。是的,如果用戶輸入1.4000,那麼它是4位小數。 – Woody

回答

2

您可以使用正則表達式

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

這個正則表達式會匹配兩個*或更多*小數位,所以不回答這個問題。如果你想匹配*精確*兩位小數,你應該使用'$'行尾定位點。 – LukeH

+0

@Luke謝謝,我糾正它 –

1

條件將評估true兩個而不是四個小數位:

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

編輯:上述條件僅適用於十進制類型。那麼,對於所有類型的實數以下工作:

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

編輯:好吧,如果你有興趣的字符串,然後使用以下(擴展名字符串包含最後一個點和後續數字/數字):

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

如果OP期望Decimal類型,則此方法有效。但是,浮動,它不。所以,只要OP檢查它是一個小數,它應該沒問題。 – keyboardP

+0

那麼,如果用戶輸入1.0000 – Stilgar

+0

啊,是的,我沒有想到這一點。 – keyboardP

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

您可能希望從系統的當前文化中取出小數點分隔符,而不是硬編碼點。

2

您可以利用十進制類型的一個非常模糊的功能。它的內部表示是一個帶指數的96位數字。指數等於分數中的位數,即使小數位數爲零。因此:

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

如果您需要驗證用戶輸入,請使用decimal.TryParse()。

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

}