在C#中,我的情况是文本框控件中有两个可能的数字。
数字可以是:
a).xxxx
或
b).xx
如何编写一个条件,说“如果文本框有4位小数,则调用此函数,否则,如果文本框有2位小数,则调用此函数。”
似乎很简单,但我不知道如何评估小数位。
非常感谢!
答案 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;
}
}