簡體   English   中英

檢查是否將小數指定為2 dp或更小

[英]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

Decimal.GetBits

返回數組的第四個元素包含比例因子和符號。 它由以下部分組成:

...

位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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM