检查十进制是否指定为 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

不是。

最好的方法是什么?

检查十进制是否指定为 2 dp 或更低

字符串解析怎么样。

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
}