[英]check if decimal is specified to 2 dp or less
我有一個用戶輸入的字符串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
數據類型而言太大的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
返回數組的第四個元素包含比例因子和符號。 它由以下部分組成:
...
位16到23必須包含一個介於0到28之間的指數,該指數表示10的冪除以整數。
這可行。
public int PlacesSpecified(decimal d)
{
var lastInt = decimal.GetBits(d)[3];
return (lastInt >> 16) & 255
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.