检查十进制是否指定为 2 dp 或更低
本文关键字:dp 十进制 是否 检查 | 更新日期: 2023-09-27 18:37:14
我有一个用户输入的字符串mystring
。 我检查它是否是有效的小数,因此
decimal val;
bool validDecimal = decimal.TryParse(mystring, out val);
if (!validDecimal)
isvalid = false;
但这不是我需要做的唯一验证。 我还需要检查此小数点是否指定为小数点后 2 位或更少
所以
23, 23.1, 23.45
都是有效的
但
23.345, 23.450
不是。
最好的方法是什么?
字符串解析怎么样。
static bool LessThan2DecimalPlaces(string mystring, out decimal val)
{
bool validDecimal = decimal.TryParse(mystring, out val);
if (!validDecimal)
{
return false;
}
var index = mystring.LastIndexOf(NumberFormatInfo.CurrentInfo.NumberDecimalSeparator);
if(index == -1)
{
return true;
}
return mystring.Substring(index).Count() < 3
}
您可以使用正则表达式来验证原始字符串:
Regex.Match(string.Format(@"^'d*({0}'d'd?)?$", CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator), mystring)
由于不允许
23.450
,尽管生成的数字与23.45
相同,但您无法测试数字本身。
相反,您必须测试字符串:
decimal val = 0m;
isvalid = isvalid &&
Regex(@"^'d+('.'d{1,2})?$").IsMatch(mystring) &&
decimal.TryParse(mystring, out val);
我采取了初始化val
的方法,因此它不会导致未达到TryParse
的问题,并且仅在当前为真时才进行测试isvalid
假设整个操作将拒绝继续如果由于其他原因已经为假。变体当然是可能的。
如果您还限制.
之前允许的字符数,那么您可以使用Parse
而不是TryParse
,但我保留了它,因为它仍然可以处理对于decimal
数据类型来说太大的数字的情况。
编辑:
值得更详细地查看我使用的正则表达式。
^
匹配字符串的开头 'd+
匹配一个或多个数字 .
匹配.
'd{1,2}
匹配一位或两位数字 ('.'d{1,2})?
匹配后跟一个或两个数字的.
或空字符串 $
匹配字符串的结尾
因此,^'d+('.'d{1,2})?$
一起意味着整个字符串必须是一个或多个数字,或者一个或多个数字后跟一个.
后跟一个或两个数字。
var decimalpos = mystring.ToString().Contains(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator) ? mystring.ToString().IndexOf(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator) : 0;
int numberofdecimals
if decimalpos >0 then
{
numberofdecimals = mystring.ToString().Substring(decimalpos,mystring.ToString().Length)
}
if numberofdecimals > 2 then False else True
查看Decimal.GetBits。
返回数组的第四个元素包含比例因子和符号。它由以下部分组成:
。
位 16 到 23 必须包含介于 0 和 28 之间的指数,该指数表示 10 除以整数的幂。
这行得通。
public int PlacesSpecified(decimal d)
{
var lastInt = decimal.GetBits(d)[3];
return (lastInt >> 16) & 255
}