2015-04-06 102 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),并且都是完全相同的大小。感谢您的意见,但! :) –