2013-02-01 38 views
1

最近的新工作,並得到了有關客戶的軟件錯誤的問題。錯誤是「從字符串'0.5'轉換爲類型'雙'無效。」必須String.format()聲明文化不變性?

我相信我找到了違規行。因爲客戶在法國,並且他的電腦設置全部使用法語(編號系統,語言......),所以「0.5」不能被鑄造成法語版本的「0,5」法語系統沒有小數點在他們的數字任何地方所以,如果string.format看到「0.5」,它不會知道該怎麼做,因爲沒有'。'字符在法國文化環境中被鑄造成雙倍。我在這裏嗎?

context.Append(String.Format("{0} {1} exceeds fine {2} limit of {3:N0}", _ 
     context.OccupancyState, context.Size, _ 
     Reg.Alert.ToLower, context.Limit)) 

其中context.Size包含「0.5」字符串。

Format.string是否考慮到文化設置,或者我在這裏丟失了什麼?

編輯:

剛在法國的窗口VM和(不幸),它能夠解析爲「0,5」成功......所以,也許這是沒有問題嗎?

+0

'String.Format'不_parse_。它根據您使用的類型格式化字符串。如果你傳遞一個字符串,它將不會被格式化。所以或者這是不正確的:_「...其中context.Size保存着」0.5「字符串」_或this:_「,它能夠成功地將它解析爲」0,5「。 –

+0

字符串「0.5」是如何在法國計算機中結束的?爲什麼大小存儲爲字符串而不是數字?該語句不會另外將context.Size從一個字符串轉換爲double,因此您還沒有發現問題。 –

+0

對不起,我還是新進入這個軟件,它似乎做了很多奇怪的事情:( – Cerealkiller050

回答

0

您需要先將字符串轉換爲雙精度,否則String.Format將僅對字符串進行精簡,而不進行任何格式化。

double d = double.Parse(context.Size, CultureInfo.InvariantCulture); 
string formatted = String.Format("{0} {1} exceeds fine {2} limit of {3:N0}" 
           , context.OccupancyState, context.Size 
           , Reg.Alert.ToLower, context.Limit); 

現在string.Format將使用System.Globalization.CultureInfo.CurrentCulture當格式化雙成字符串一次。

2
CultureInfo culture = new CultureInfo("en-US"); 
context.Append(String.Format(culture, "{0} {1} exceeds fine {2} limit of {3:N0}", _ 
     context.OccupancyState, context.Size, _ 
     Reg.Alert.ToLower, context.Limit)) 
1

字符串格式化和分析確實需要計算機的文化/語言環境考慮進去,所以如果你知道,所有的數字都將輸出一個小數點,並在同一格式輸入,那麼你將不得不通過一個不變文化的格式和解析方法。

雖然你說context.Size持有字符串「0.5」。這是沒有意義的,因爲它是第二個參數,所以將替換string.Format中的{1}

什麼可能是錯誤的是,該代碼正試圖context.Limit到一個十進制輸出{3:N0}格式。如果這個字符串是「0.5」,那麼這將導致法國機器(或任何帶有小數點逗號的PC)上的錯誤,因爲這不是具有該格式的有效數字。

因此,要麼將數字存儲爲數字,要麼不要嘗試將已格式化的字符串格式化爲數字。