小数分析在不同环境下的差异

晚间,

我正在用一个问题抨击我的头靠在墙上:

  • 我正在从一个size=16decimal places = 2Number列中的单元格中加载dBase III .dbf文件中的数字。

  • DbfViewer查看时,这些数字显示为: 12345.12 ,其中没有千位分隔符和小数点分隔符.

  • 我使用decimal.parse(val)从数据库中的单元格parsing数字。

  • 我做这个号码的东西。

  • 我正在使用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. 使用Visual Studio 2013 CommunityOffice 2010 Windows 8.1计算机。
    2. 使用Visual Studio 2013 UltimateOffice 2013 Windows 8.1计算机。
  • 我已经确认这两个环境对于Windows和Office都具有相同的Language, Date, Time and Number格式。

当我从Option 1 Environment构build并执行程序时,Excel文件内的所有东西都可以很好地粘贴。 我导航到包含公式的单元格,以及所获取的value是否有小数位,公式就在那里。

但是 ,如果我从Option 2 Environment构build并执行程序, 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时,没有任何问题。

我已经尝试了以下(在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 Sheet信息的XML文件,并发现:

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

而由Environment 1创build的同一XML文件的定义具有以下单元格值:

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

那么,这是一个Visual Studio语言环境的东西(它们都有相同的,据我所知),还是我错过了别的东西?


编辑:打印出当前的语言环境:

Console.WriteLine(CultureInfo.CurrentCulture.Name)

Environment 1Environment 2产生相同的es-ES


编辑2:取自: Microsoft Office XML格式。 devise缺陷。

为了节省时间,Microsoftselect使用美国英语区域设置存储XML,而不pipe上述所有设置。 […]

另外,对于Excel 公式 ,这意味着公式名称是美式英文公式名称,它意味着您愿意使用美式英文函数名称(加上美式英文分隔符 ,…)。

所以基本上,这一切都归结(我相信)预先定位到Excel XMLdecimal值的Excel XML考虑到某些地方

Environment 2 ,我写入Excel文件的任何其他(非公式)值作为en-US本地化值(即12345.12 )出现在XML中。 他们大部分都是通过dataTable导入来的。 但是,由于编写公式需要inputstring,并且Visual Studio将区域设置应用于所述string,所以在Excel XML最终为12345,12 ,这会导致前面提到的错误。

那么,Visual Studio从Environment 1采取的与Environment 1 不同的是什么呢? 所有可能的UI本地化选项在两台机器上完全相同。

我以前有过类似的问题,并发现我的项目引用中有一个不同的dll文件。 DLL的名称是相同的,我只注意到,因为文件大小的差异。 一旦我手动链接到两个开发机器上的同一个,我得到了预期的结果。

就像我说的,我的问题是不同的……但它也涉及excel文件,并且我在一台开发机器上安装了Excel 2010,而在另一台机器上安装了Excel 2010。

我甚至不知道这是否符合答案,因为我仍然不知道Environment 1Environment 2不同的本地化variables在哪里。

但是,似乎Visual Studio – 使用不同的本地化时 – 在内部处理去局部化的decimalvariables,但使用本地化的stringvariables。 即使在debugging过程中检查locals面板时,存储在dictionary条目中的decimal数字的值将在keyValuePair条目中显示为其本地化版本,并在展开时显示keyValuePair本地化的en-US值:

不同的地方取决于代表性

因此,在将整个 dataTable输出到Excel文件时,将其作为en-US值写入到XML中。 另一方面,当输出一个公式(aka一个string )时,它将注入相关decimal值的本地化版本。

结论:在处理本地化系统中的Office文件时,只需将数据写入去本地化(即en-US ),然后让软件为您本地化。

结束了以下脏补丁:

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