小数分析在不同环境下的差异
晚间,
我正在用一个问题抨击我的头靠在墙上:
-
我正在从一个
size=16
和decimal places = 2
的Number
列中的单元格中加载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
。
-
-
我正在使用两种编程环境:
- 使用
Visual Studio 2013 Community
和Office 2010
Windows 8.1
计算机。 - 使用
Visual Studio 2013 Ultimate
和Office 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 1
和Environment 2
产生相同的es-ES
。
编辑2:取自: Microsoft Office XML格式。 devise缺陷。
为了节省时间,Microsoftselect使用美国英语区域设置存储XML,而不pipe上述所有设置。 […]
另外,对于Excel 公式 ,这意味着公式名称是美式英文公式名称,它意味着您愿意使用美式英文函数名称(加上美式英文分隔符 ,…)。
所以基本上,这一切都归结(我相信)预先定位到Excel XML
的decimal
值的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 1
与Environment 2
不同的本地化variables在哪里。
但是,似乎Visual Studio – 使用不同的本地化时 – 在内部处理去局部化的decimal
variables,但使用本地化的string
variables。 即使在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(",", ".")