在C#中,我有一種情況,在文本框控件中有兩個可能的數字。根據小數長度確定調用哪個函數
的數字可以是:
一).XXXX
或
B).XX
我怎樣寫,說的條件,「如果文本有4個小數位,然後調用此函數,否則,如果文本框有2個小數位,則調用此函數。「
看起來很簡單,但我不知道如何評估小數位數。
非常感謝!
在C#中,我有一種情況,在文本框控件中有兩個可能的數字。根據小數長度確定調用哪個函數
的數字可以是:
一).XXXX
或
B).XX
我怎樣寫,說的條件,「如果文本有4個小數位,然後調用此函數,否則,如果文本框有2個小數位,則調用此函數。「
看起來很簡單,但我不知道如何評估小數位數。
非常感謝!
您可以使用正則表達式
new Regex(@"\.\d{2}$").IsMatch(input.Value)
這個正則表達式會匹配兩個*或更多*小數位,所以不回答這個問題。如果你想匹配*精確*兩位小數,你應該使用'$'行尾定位點。 – LukeH
@Luke謝謝,我糾正它 –
條件將評估true
兩個而不是四個小數位:
Math.Round(100*x) == 100*x
編輯:上述條件僅適用於十進制類型。那麼,對於所有類型的實數以下工作:
(Math.Ceiling(100 * x) - 100 * x) < 10e-8)
編輯:好吧,如果你有興趣的字符串,然後使用以下(擴展名字符串包含最後一個點和後續數字/數字):
System.IO.Path.GetExtension(input).Length
if(txtNumber.Text.Split(new[]{'.'})[1].Length == 2)
{
//case b
}
else
{
//case a
}
您可能希望從系統的當前文化中取出小數點分隔符,而不是硬編碼點。
您可以利用十進制類型的一個非常模糊的功能。它的內部表示是一個帶指數的96位數字。指數等於分數中的位數,即使小數位數爲零。因此:
public static int GetFractionalDigits(string txt) {
decimal value = decimal.Parse(txt);
return (decimal.GetBits(value)[3] >> 16) & 0x7fff;
}
如果您需要驗證用戶輸入,請使用decimal.TryParse()。
這可能不是完全根據您的需要工作,但它適合我的目的,可能是別人有用。
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;
}
}
如果用戶輸入「.1200」,您是否想要將其計爲4位小數或2? – DyingCactus
0是否顯着?即「3.4200」被認爲是2位數或4位數? –
感謝您的反饋...對不起,我不清楚。是的,如果用戶輸入1.4000,那麼它是4位小數。 – Woody