【问题标题】:Exporting to csv in German notation以德语表示法导出到 csv
【发布时间】:2016-11-16 02:13:38
【问题描述】:

我想将我的 DataGrid 对象导出到 CSV 文件,并让用户可以选择查看 double 类型值的德语表示法。

foreach (DataGridViewRow dr in dataGridView1.Rows)
{
    foreach (DataGridViewColumn column in dgv1)
    {
        double val;
        if (double.TryParse(dr.Cells[column.Name].Value.ToString(), out val))
        {
            sw.Write(string.Format(System.Globalization.CultureInfo.GetCultureInfo("de-DE"), "{0:0.0}", val));
            sw.Write(",");
        }
    }
}

sw 这里是一个新的StreamWriter 对象。 我为此使用了正确的区域性,但是当我看到结果时,我看到应该是“18,54”,是 18,在它旁边的单元格中有一个 5,然后通过点 (.)。我在这段代码中做错了什么?

【问题讨论】:

  • 什么val?你在调试器中检查过它的值吗?
  • ¿您是在 Excel 中打开它吗?如果是这样,请尝试用分号而不是逗号分隔值。
  • @HimBromBeere 整个 string.Format 行返回 18,5(逗号)。 val 本身是 18.54(点)
  • 更改 sw.Write(",");到 sw.Write(";");
  • 请记住,如果您使用逗号作为分隔符和十进制表示法,您将会遇到问题。您需要使 CSV 使用不同于逗号的分隔符。否则 18,54 变为值 18 和 54!

标签: c# .net csv export-to-csv


【解决方案1】:

曾经遇到过同样的问题。

该值被分成两个单元格,因为德语数字逗号“,”只是 csv 中的分隔符。我所做的是使用分号“;”作为分隔符,OpenOffice 以某种方式做了正确的事情。 (要么自动,要么我在打开时指定了编码,不记得了)。

哦,我刚刚在维基百科上找到了这个:

Year;Make;Model;Length
1997;Ford;E350;2,34
2000;Mercury;Cougar;2,38

后一种格式不符合 RFC 4180。可以通过使用逗号而不是分号作为分隔符以及表示小数点的国际符号或的做法来实现合规性引用所有带小数点的数字

所以 "1,2","3,4" 应该是正确的。

【讨论】:

  • 你能给我这个的代码表示吗?
【解决方案2】:

这就是我在 cmets 中写的:

foreach (DataGridViewRow dr in dataGridView1.Rows)
    {
        foreach (DataGridViewColumn column in dgv1)
        {
            double val;
            if (double.TryParse(dr.Cells[column.Name].Value.ToString(), out val))
            {
                sw.Write(string.Format(System.Globalization.CultureInfo.GetCultureInfo("de-DE"), "{0:0.00}", val));
                sw.Write(";");
            }
        }
    }

【讨论】:

  • 不幸的是,同样的问题仍然存在:oe 单元格中的 18 和下一个中的 54。
  • @Iason 您是否更改了 CSV 类型以指示它使用分号作为分隔符。 Look here for an example of making a CSV file with different delimiters
  • 好的,我明天需要测试一下。但有可能我还需要为其他数据设置 , 分隔符。不知道能不能动态设置分隔符。
  • 您可以将文本用双引号括起来并继续使用逗号作为分隔符: sw.Write("\""+string.Format(System.Globalization.CultureInfo.GetCultureInfo("de-DE") , "{0:0.00}", val)+"\"");
【解决方案3】:

您只在点/逗号后显示一个位置。如果将“{0:0.0}”替换为“{0:0.00}”,则应显示 18,54。有关格式化浮点数的更多信息,请参阅此站点:http://www.csharp-examples.net/string-format-double/

逗号是用于代替点的德语字符,因此它不适用于 csv。那就是你的结果是 18,5,... 你应该替换你的 sw.Write(",");用 sw.Write(";");或其他字符,或在数字周围使用引号。

【讨论】:

  • 这出于某种原因在一个单元格中显示 18,在下一个单元格中显示 54。
  • 那是因为您也使用单元格分隔符(',')作为数字。你应该试试 sw.Write(",");或在数字周围加上引号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2013-01-09
  • 1970-01-01
相关资源
最近更新 更多