2013-06-26 135 views
1

我需要將字符串轉換回double,但字符串並不總是相同的格式。在一種情況下,它是「N0」,在另一個「#,##」中,另一種是貨幣「C0」。好的是,我知道該字符串的格式與之前的過程相同,它已經從double轉換爲string。將字符串轉換爲已知格式的雙精度值

我怎樣才能轉換回雙。數字只是簡單地賦值double.parse或Convert.ToDouble,但貨幣值不會。

string format = "{0:C0}"; 
double dollar = 1,234.00; 
string dollarString = String.Format(format, doubleValue); // == "$1,234" 
double newDollar = Convert.ToDouble(dollarString); // Fails 

最後一行是問題所在。我假設我需要使用IFormatProvider或文化或什麼的,但我不完全確定。

我不能具體引用格式是貨幣,因爲「格式」並不總是貨幣。

想法?

回答

1

當我打字時,我想出了以下內容。關於這是否是一種好的做法或者如果我以後可能遇到問題的進一步反饋。

double newDollar; 
double.TryParse(dollarString, NumberStyles.Any, CultureInfo.CurrentCulture.NumberFormat, out newDollar); 
+1

您也可以傳入'TryParseExact'並傳遞格式化字符串,您知道它將匹配。 (如果可以是多個選項之一,則還可以傳入一組字符串) –

+0

注意:如果計算機語言設置不同,則CurrentCulture最終可能會以錯誤的方式解析它。 例如在瑞士,貨幣分隔符是一個點(。),而在德國是逗號(,)。 –

+1

@ScottChamberlain在.NET中沒有像TryParseExact這樣的函數。 –

0

如果您使用CultureInfo.CurrentCulture確保您設置你的線程的的CurrentCulture。

否則它最終可能會在解析錯誤的方式(取決於您的計算機上的語言設置)。

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); 

然後你就可以放心地使用此:

double.TryParse(dollarString, NumberStyles.Any, 
CultureInfo.CurrentCulture.NumberFormat, out newDollar); 

或者,你可以創建這樣的功能(要得到正確的格式,無需設置文化)。

備註:在瑞士,這可能會導致麻煩,因爲歐元仍然可以解析。 所以5,05(€)將被成功解析爲505(CHF)。相信我,你不希望發生這種情況。

public static double GetDouble(string value, double defaultValue) 
{ 
    double numberToConvert; 

    if (!double.TryParse(value, System.Globalization.NumberStyles.Any, 
CultureInfo.CurrentCulture, out numberToConvert) && 
     !double.TryParse(value, System.Globalization.NumberStyles.Any, 
CultureInfo.GetCultureInfo("en-US"), out numberToConvert) && 
     !double.TryParse(value, System.Globalization.NumberStyles.Any, 
CultureInfo.InvariantCulture, out numberToConvert)) 
    { 
     numberToConvert= defaultValue; 
    } 

    return numberToConvert; 
} 
相關問題