我有一个用户输入的字符串mystring
。我检查它是否是一个有效的小数
decimal val;
bool validDecimal = decimal.TryParse(mystring, out val);
if (!validDecimal)
isvalid = false;
但这不是我需要做的唯一验证。我还需要检查这个小数是否指定为小数点后2位
所以,
23, 23.1, 23.45
都是有效的
但是
23.345, 23.450
不是。
最好的方法是什么?
答案 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)
返回数组的第四个元素包含比例因子和符号。它由以下部分组成:
...
第16位至第23位必须包含0到28之间的指数,表示10除以整数的幂。
这很有效。
public int PlacesSpecified(decimal d)
{
var lastInt = decimal.GetBits(d)[3];
return (lastInt >> 16) & 255
}