2011-11-24 36 views
4

我試圖將字符串解析爲小數,如果字符串中的小數點後面有2位以上的數字,解析應該失敗。無法限制在C語言中將字符串解析爲十進制數時的小數位數

e.g:

1.25是有效的,但1.256無效。

我試圖用decimal.TryParse方法在C#中以下面的方式來解決,但是這並不能幫助......

NumberFormatInfo nfi = new NumberFormatInfo(); 
nfi.NumberDecimalDigits = 2; 
if (!decimal.TryParse(test, NumberStyles.AllowDecimalPoint, nfi, out s)) 
{ 
    Console.WriteLine("Failed!"); 
    return; 
}    
Console.WriteLine("Passed"); 

有什麼建議?

回答

4

看看Regex。有涵蓋這個主題的各種線程。

例如: Regex to match 2 digits, optional decimal, two digits

Regex decimalMatch = new Regex(@"[0-9]?[0-9]?(\.[0-9]?[0-9]$)");這應該在你的情況做。

var res = decimalMatch.IsMatch("1111.1"); // True 
    res = decimalMatch.IsMatch("12111.221"); // False 
    res = decimalMatch.IsMatch("11.21"); // True 
    res = decimalMatch.IsMatch("11.2111"); // False 
    res = decimalMatch.IsMatch("1121211.21143434"); // false 
+0

謝謝!我也意識到使用正則表達式來檢查是最好的選擇,因爲我無論如何都將字符串轉換爲小數。我的正則表達式模式看起來像「\。(\ d {3})」 因爲我只是想檢查字符串是否有超過3小數,這種模式應該足夠我猜。 – vignesh

+0

雖然如果你的應用程序需要處理不同的文化,它將不會如此。 –

+0

好的輸入,但對不同的文化有一個正則表達式不應該是一個實現的問題! – Alex

1

我發現計算器內的解決方案:

(發佈者carlosfigueira:C# Check if a decimal has more than 3 decimal places?

static void Main(string[] args) 
    { 
     NumberFormatInfo nfi = new NumberFormatInfo(); 
     nfi.NumberDecimalDigits = 2; 
     decimal s; 
     if (decimal.TryParse("2.01", NumberStyles.AllowDecimalPoint, nfi, out s) && CountDecimalPlaces(s) < 3) 
     { 
      Console.WriteLine("Passed"); 
      Console.ReadLine(); 
      return; 
     } 
     Console.WriteLine("Failed"); 
     Console.ReadLine(); 
    } 

    static decimal CountDecimalPlaces(decimal dec) 
    { 
     int[] bits = Decimal.GetBits(dec); 
     int exponent = bits[3] >> 16; 
     int result = exponent; 
     long lowDecimal = bits[0] | (bits[1] >> 8); 
     while ((lowDecimal % 10) == 0) 
     { 
      result--; 
      lowDecimal /= 10; 
     } 
     return result; 
    } 
+0

CountDecimalPlaces不支持十進制值0。 –

0

或者你可以做一些簡單的整數運算:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string s1 = "1.25"; 
     string s2 = "1.256"; 
     string s3 = "1.2"; 

     decimal d1 = decimal.Parse(s1); 
     decimal d2 = decimal.Parse(s2); 
     decimal d3 = decimal.Parse(s3); 

     Console.WriteLine(d1 * 100 - (int)(d1 * 100) == 0); 
     Console.WriteLine(d2 * 100 - (int)(d2 * 100) == 0); 
     Console.WriteLine(d3 * 100 - (int)(d3 * 100) == 0); 
    } 
} 
1

也許不像其他選項那樣優雅,但我認爲更簡單:

 string test= "1,23"; //Change to your locale decimal separator 
     decimal num1; decimal num2; 
     if(decimal.TryParse(test, out num1) && decimal.TryParse(test, out num2)) 
     { 
      //we FORCE one of the numbers to be rounded to two decimal places 
      num1 = Math.Round(num1, 2); 
      if(num1 == num2) //and compare them 
      { 
       Console.WriteLine("Passed! {0} - {1}", num1, num2); 
      } 
      else Console.WriteLine("Failed! {0} - {1}", num1, num2); 
     } 
     Console.ReadLine(); 
相關問題