2012-07-19 166 views
32

我正在嘗試編寫一個基本上將字符串數組轉換爲字符串數組的函數,其中數組中的所有雙精度都舍入爲我設置的小數位數。數組中也可以有字符串,根本沒有雙精度值。解析字符串以逗號和點加倍

string[,] values = new string[1, 3]; 

values[0, 0] = "hello"; 
values[0, 1] = "0.123"; 
values[0, 2] = "0,123"; 

int decimalPlaces = 2; 

double tmp; 
string format = "F" + decimalPlaces.ToString(); 
IFormatProvider provider = CultureInfo.InvariantCulture; 
for (int i = 0; i < values.GetLength(0); i++) 
{ 
    for (int j = 0; j < values.GetLength(1); j++) 
    { 
     if (double.TryParse(values[i, j], out tmp)) 
     { 
      values[i, j] = tmp.ToString(format, provider); 
     } 
    } 
} 

Console.ReadLine(); 

結果卻是:「你好」,「0.12」,「0.12」,但它是「你好」,「123.00」,「0.12」將把逗號以錯誤的方式。有沒有人有一個簡單而有效的解決方案呢?

回答

26

您想要像逗號(,)一樣處理點(.)。因此,更換

if (double.TryParse(values[i, j], out tmp)) 

if (double.TryParse(values[i, j].Replace('.', ','), out tmp)) 
+12

解析時需要指定文化,否則只能在當前文化使用「,」作爲小數點的地方使用。 – hultqvist 2013-10-30 09:39:58

+0

沒錯。謝謝你的提醒。 – mmdemirbas 2013-10-30 09:44:04

+1

我知道這個線程已經很長時間了,但是我會用'replace(char,char)'替換'Replace(string,string)'以獲得更好的性能..... – Unknown6656 2016-02-22 09:11:19

12

問題是,您(或系統)無法區分千位分隔符的小數點分隔符,它們可以是逗號或點。例如:

以我培養,

1.123爲1000以上的號碼的常規表示法;而

1,123是一個數接近1

使用不變區域性默認使用的點作爲十進制分隔。一般而言,您應該確保所有數字都是在所有系統上使用相同的恆定文化編寫的(例如不變文化)。

如果你確定你的數字除了小數點分隔符(即沒有數千個分隔符)之外從不包含任何逗號或點以外的任何內容,我會用逗號作爲String.Replace(),並像你一樣做其餘的事情。

否則,您將很難編程能夠區分1.1231,123而不知道文化的東西。

+0

同意,對我來說這是最合乎邏輯的解決方案。您還可以檢查字符串是否包含「,」或「。」但這些解決方案中的任何一個都應該很好。 – eandersson 2012-07-19 12:15:23

0

您可以檢查是否字符串包含使用

string s="";

 if (s.Contains(',')) 
     { 
     //treat as double how you wish 
     } 

一個小數點,然後可以把它作爲一個小數,否則只是一起傳遞非雙重價值。

79

要同時治療,和。作爲小數點,您不僅必須將其中一個替換爲另一個,還要確保Culture使用的解析將其解釋爲小數點。

text = text.Replace(',', '.'); 
return double.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out value); 
+0

謝謝你,這對我有用。 – 2018-01-05 12:23:37

+0

爲我工作。只是想我想要的。 – radbyx 2018-02-08 07:39:45

+0

最佳答案!整潔和高尚。 – 2018-02-26 17:32:30

18

你不需要替換逗號和點..

我遇到了同樣的問題。原因很簡單,轉換文化起着很大的作用,逗號或點被解釋。我使用德國文化,逗號區分分數,其中點在其他地方也是這樣。

在這裏我做了一個完整的例子,以明確區別。

string[] doubleStrings = {"hello", "0.123", "0,123"}; 
     double localCultreResult; 
     foreach (var doubleString in doubleStrings) 
     { 
      double.TryParse(doubleString, NumberStyles.Any, CultureInfo.CurrentCulture, out localCultreResult); 
      Console.WriteLine(string.Format("Local culture results for the parsing of {0} is {1}",doubleString,localCultreResult)); 

     } 


     double invariantCultureResult; 
     foreach (var doubleString in doubleStrings) 
     { 
      double.TryParse(doubleString, NumberStyles.Any, CultureInfo.InvariantCulture, out invariantCultureResult); 
      Console.WriteLine(string.Format("Invariant culture results for the parsing of {0} is {1}", doubleString, invariantCultureResult)); 

     } 

結果在下面 enter image description here

玩的文化,你會得到你需要的結果。

+0

我在幾臺具有不同文化設置的電腦上嘗試了這種解決方案。它沒有按預期工作。我稍後會發布另一個解決方案。 – Andrew 2016-11-08 03:11:02

+0

我試過這個,但它不適合我。請參閱鏈接中的圖片。 CurrentCulture參數是德語。 https://imgur.com/QvtPt7S – batmaci 2017-10-09 00:49:26

0

試試這個......它適用於我。

double vdouble = 0; 
string sparam = "2,1"; 

if (!Double.TryParse(sparam, NumberStyles.Float, CultureInfo.InvariantCulture, out vdouble)) 
{ 
    if (sparam.IndexOf('.') != -1) 
    { 
     sparam = sparam.Replace('.', ','); 
    } 
    else 
    { 
     sparam = sparam.Replace(',', '.'); 
    } 

    if (!Double.TryParse(sparam, NumberStyles.Float, CultureInfo.InvariantCulture, out vdouble)) 
    { 
     vdouble = 0; 
    } 
} 
+3

也許你可以解釋一下你在做什麼。 「適合我」不是很具描述性。 – firelynx 2015-05-27 15:46:30

0

從字符串解析十進制數的擴展。

  • 無論數字在開頭,結尾還是在字符串中間。
  • 無論是否只有數字或大量的「垃圾」字母。
  • 無論在PC上的文化設置中配置了什麼分隔符:它都會正確解析點和逗號。
  • 手動設置小數點符號的能力。

    public static class StringExtension 
    { 
        public static double DoubleParseAdvanced(this string strToParse, char decimalSymbol = ',') 
        { 
         string tmp = Regex.Match(strToParse, @"([-]?[0-9]+)([\s])?([0-9]+)?[." + decimalSymbol + "]?([0-9 ]+)?([0-9]+)?").Value; 
    
         if (tmp.Length > 0 && strToParse.Contains(tmp)) 
         { 
          var currDecSeparator = System.Windows.Forms.Application.CurrentCulture.NumberFormat.NumberDecimalSeparator; 
    
          tmp = tmp.Replace(".", currDecSeparator).Replace(decimalSymbol.ToString(), currDecSeparator); 
    
          return double.Parse(tmp); 
         } 
    
         return 0; 
        } 
    } 
    

如何使用:

"It's 4.45 O'clock now".DoubleParseAdvanced(); // will return 4.45 
"It's 4,45 O'clock now".DoubleParseAdvanced(); // will return 4.45 
"It's 4:45 O'clock now".DoubleParseAdvanced(':'); // will return 4.45 
+0

4:45應該等於4.75:P – Logman 2018-02-12 18:49:50

相關問題