2012-08-23 25 views
2

我試着解決這個問題好幾個小時,絕對不明白編譯器在這裏做什麼。我有基本上看起來像這樣的字符串:從字符串中讀取一個double值

"KL10124 Traitor #2 - +XX-+0.25 - More Stuff" 

並且需要以編程方式讀取double'0.25'。調用以上人民政府字符串,下面兩行不起作用:

string[] h = s.Split('-'); 
string h2 = h[2].Substring(1,h[2].Length - 2); 
double d = Convert.ToDouble(h2); 

輸出,如果我顯示d是「25」。我認爲這可能取決於'。' 「如果我插入

double d = Convert.ToDouble(h2.Replace('.',',')); 

它不會改變一個東西,輸出仍然是」25「。

但最後,如果我做的蠻力方法如下我得到的逐字輸出「0,25」屏幕

double d; 
string[] h = s.Split('-'); 
string h2 = h[2].Substring(1,h[2].Length - 2); 
if (h2.Contains(".")) 
{ 
    string[] h3 = h2.Split('.'); 
    d = Convert.ToDouble(h3[0]) + Convert.ToDouble(h3[1])/100; 
} 
else 
{ 
    d = Convert.ToDouble(h2); 
} 
return d; 

爲什麼不完全相同的前兩個版本無法正常工作?代碼的最後一部分不能是這樣做的正確方法。

+0

在第一個代碼中,什麼是'h2'? – CodingGorilla

+1

當我運行它時,你的第一個代碼片段返回「0.25」。 – LarsTech

+0

我的文化是en-GB,第一位代碼給我0.25 –

回答

6

嘗試使用

double d = Convert.ToDouble(h2, CultureInfo.InvariantCulture); 

代替

double d = Convert.ToDouble(h2); 
+0

謝謝,這個工程。但是,可否請您告訴我爲什麼我的代碼,即使在替換'。'之後。與','不起作用? – EluciusFTW

+1

默認情況下,Convert.ToDouble中的逗號用於分隔數千分之一。例如,「1,635,555」被轉換爲1635555.因此,讓你編號爲「0,25」只是發出數字25. –

2
d = double.Parse(h2,CultureInfo.InvariantCulture); 

您需要將轉換操作的格式提供程序設置爲不變。

+0

Thx,這工程,但正如在伊萬諾夫的答案,我不明白爲什麼我的代碼手動替換'後'不工作。按',' – EluciusFTW

1

你應該看看H2你轉換之前。看起來它不包含小數點。 Convert.ToDouble可能需要領先的0才能知道它也是一小部分,我不確定。

一般來說,這是一個正則表達式更容易。見this answer

+0

謝謝,但我做到了,子字符串包括0在內。不想混入很多代碼原Q.會檢查出RegEx。 – EluciusFTW

0

在第一個代碼示例中打印h2,看看你是否正在進行子串提取。

同樣使用正則表達式來提取數字會更直截了當。

+0

是的,已經檢查了所有顯而易見的問題,例如子串等,無數次,不想用太多的代碼來混淆Q. – EluciusFTW

1

使用正則表達式查詢是這樣的:

^KL\d+ Traitor #\d \- \+XX\-\+(\d+\.\d+) \- .+ 

一個分組(括號表達式)會給你的結果。

請參閱sandbox

+0

謝謝,我會嘗試正則表達式。但它不會像你的代碼那麼容易,因爲我在我的Q中不清楚:'Traitor'這個詞,字符串的長度,'#2'的存在都是靈活的,但是我需要的所有字符串閱讀在' - '字符方面具有相同的結構,這就是爲什麼我選擇在這個charakter分割字符串。 – EluciusFTW

+0

@ ToaoG:當然,我明白了,我的正則表達式版本更加嚴格,但是您可以使用'。+'來表示「任何字符或更多」來降低嚴格性。 – abatishchev

2

嘗試正則表達式的方法:

string input = "KL10124 Traitor #2 - +XX-+0.25 - More Stuff"; 

Match match = Regex.Match(input, "^.*([0-9]+\\.[0-9]+).*$"); 

if (match.Success) 
{ 
    double value = Convert.ToDouble(match.Groups[1].Value, CultureInfo.InvariantCulture); 
    Console.Write(value); 
} 
+0

謝謝,將def。嘗試正則表達式。 – EluciusFTW