检查小数是否指定为2 dp或更小

时间:2012-06-14 10:30:40

标签: c# c#-4.0

我有一个用户输入的字符串mystring。我检查它是否是一个有效的小数

decimal val;
bool validDecimal = decimal.TryParse(mystring, out val);
if (!validDecimal)
   isvalid = false;

但这不是我需要做的唯一验证。我还需要检查这个小数是否指定为小数点后2位

所以,

23, 23.1, 23.45

都是有效的

但是

23.345, 23.450

不是。

最好的方法是什么?

5 个答案:

答案 0 :(得分:2)

字符串解析怎么样。

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
}

答案 1 :(得分:2)

您可以使用正则表达式验证原始字符串:

Regex.Match(string.Format(@"^\d*({0}\d\d?)?$", CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator), mystring)

答案 2 :(得分:1)

由于不允许使用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})?$表示整个字符串必须是一个或多个数字,或者一个或多个数字后跟一个.后跟一个或两个数字。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

查看Decimal.GetBits

  

返回数组的第四个元素包含比例因子和符号。它由以下部分组成:

     

...

     

第16位至第23位必须包含0到28之间的指数,表示10除以整数的幂。

这很有效。

public int PlacesSpecified(decimal d)
{
    var lastInt = decimal.GetBits(d)[3];
    return (lastInt >> 16) & 255
}