1

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

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

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

所以,

23, 23.1, 23.45

都是有效的

23.345, 23.450

不是。

最好的方法是什么?

4

5 回答 5

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
}
于 2012-06-14T10:35:35.107 回答
2

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

Regex.Match(string.Format(@"^\d*({0}\d\d?)?$", CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator), mystring)
于 2012-06-14T10:46:17.500 回答
1

由于23.450不允许,尽管产生的数字与 with 相同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+匹配一位或多位数字 .匹配 a. \d{1,2}匹配一位或两位数字 (\.\d{1,2})?匹配 a.后跟一位或两位数字,或者空字符串 $匹配字符串结尾

所以合在一起,^\d+(\.\d{1,2})?$意味着整个字符串必须是一个或多个数字,或者一个或多个数字后跟.一个或两个数字。

于 2012-06-14T10:48:47.800 回答
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
于 2012-06-14T10:40:37.473 回答
0

查看Decimal.GetBits

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

...

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

这行得通。

public int PlacesSpecified(decimal d)
{
    var lastInt = decimal.GetBits(d)[3];
    return (lastInt >> 16) & 255
}
于 2012-06-14T10:41:03.263 回答