2015-04-06 97 views
3

晚報,十進制解析差異

我撲我的頭靠在牆上有以下問題:

  • 我加載人數從細胞免受Numbersize=16decimal places = 2dBase III .dbf文件中。

  • 這些數字,與DbfViewer查看時顯示爲:12345.12,那裏沒有千位分隔符和小數 分隔符.

  • 我使用decimal.parse(val)解析數據庫中單元格中的數字。

  • 我做這個號碼的東西。

  • 我使用ClosedXML庫數量粘貼到與下式的.xlsx Excel文件細胞:"=R[-1]C * 100/" & val其中val是我從dBaseIII數據庫文件而獲得的值。這是通過下面的語句來完成:

    • Dim formula as String = "=R[-1]C * 100/" & project.TotalIncome(i)
    • cell.FormulaR1C1 = formula
  • 我使用兩種編程環境:

    1. 一個Windows 8.1Visual Studio 2013 CommunityOffice 2010
    2. A Windows 8.1機器有Visual Studio 2013 UltimateOffice 2013
  • 我確定兩個環境的格式都是相同的,格式爲Language, Date, Time and Number,適用於Windows和Office。

當我從Option 1 Environment構建並執行程序時,所有東西都粘貼在Excel文件中。我導航到包含公式的單元格,並且無論是否獲得小數位數value,公式都在那裏。

然而,如果我建立並從Option 2 Environment執行程序,我得到一個:

  • Removed Records: Formula from /xl/worksheets/sheet.xml part
  • Removed Records: Formula from /xl/calcChain.xml part (calculation properties)

我試圖Environment 2加入了斷點,打開Locals窗口和編輯values有小數位,一切按預期工作,而當我使用Environment 1時,當value有小數位時我沒有任何問題。

我曾嘗試以下(在Environment 2):

Dim nfi As NumberFormatInfo = New CultureInfo("es-ES", False).NumberFormat 
nfi.NumberDecimalSeparator = "," 
value = Decimal.Parse(row("VALUECOL"), nfi) 

也:

value = Decimal.Parse(row("VALUECOL"), New CultureInfo("es-ES"))

無濟於事。

我已打開包含在Environment 2的Excel工作表信息的XML文件,並發現這一點:

<x:c r="L101" s="41"> 
    <x:f>L100 * 100/57125,71</x:f> 
</x:c> 

而對於由Environment 1創建相同的XML文件中的定義具有以下單元格值:

<x:c r="L101" s="41"> 
    <x:f>L100 * 100/57125.71</x:f> 
</x:c> 

那麼,它是一個Visual Studio Locale的東西(它們都有相同的,據我所知),還是我錯過了別的東西?


編輯:打印出當前區域設置有:

Console.WriteLine(CultureInfo.CurrentCulture.Name)

產生兩個Environment 1Environment 2相同es-ES


編輯2: 來自Microsoft Office XML formats. Defective by design.

爲了節省他們的時間,微軟選擇存儲使用美國英語語言環境 XML不論上述所有設置。 [...]

此外,對於Excel 公式,它是指式名稱是美國英語 公式名稱,[...]這意味着你願意與美國英語 函數名工作(加上美國英語分隔符,...)。

所以基本上這一切歸結(我相信)到decimal值到Excel XML考慮到東西,某處的預先定位。

Environment 2中,我寫入Excel文件的任何其他(非公式)值都作爲en-US本地值(即12345.12)出現在XML中。他們大部分是通過導入dataTable引入的。但是,由於編寫公式需要輸入字符串,並且Visual Studio將區域設置應用於所述字符串,因此Excel XML中的結果爲12345,12,這會導致前面提到的錯誤。

所以,究竟是什麼在Visual Studio中從Environment 1不同Environment 2服用?所有可能的UI本地化選項在兩臺機器上完全相同...

回答

1

我甚至不知道這是否符合答案,因爲我仍然不知道Environment 1Environment 2有什麼區別。

然而,這似乎Visual Studio中 - 使用不同的本地化時 - 使用去本地化decimal變量內部交易,但局部string變量。檢查調試期間locals面板即使,存儲在dictionary條目decimal數的值將出現在keyValuePair進入它的本地化版本,並作爲去本地化en-US值擴展時:

Different localisations depending on representation

因此,在向Excel文件輸出dataTable作爲整體時,將其作爲en-US值寫入XML。另一方面,當輸出公式(a.k.a.a string)時,它傾注了相關聯的decimal值的本地化版本。

結論:在處理本地化系統中的Office文件時,只需將數據寫入去局部化(即en-US)並讓軟件爲您本地化。

最終做以下髒補丁:

Dim formula As String = "=R[-1]C * 100/" & project.TotalIncome(i).ToString().Replace(",", ".") 
1

我以前有過類似的問題,並且發現在我的項目引用中有一個不同的dll文件。該dll的命名相同,我只注意到,因爲文件大小的差異。一旦我在兩臺開發機器上手動鏈接到同一個,我就得到了預期的結果。

就像我說的,我的問題是不同的......但它也涉及excel文件,並且我確實在一臺Dev機器上安裝了Excel 2010,另一臺上安裝了2013年。

+0

我已經檢查既有外部'dll'si使用('ClosedXML.dll' v.0.69.1.0和'DocumentFormat.OpenXml.dll' 2.0版.5022.0),並且都是完全相同的大小。感謝您的意見,但! :) –