【问题标题】:Change system decimal delimiter in C#? [duplicate]在 C# 中更改系统十进制分隔符? [复制]
【发布时间】:2013-06-07 21:18:03
【问题描述】:

基本上,我有一个 C# 桌面应用程序,可以将 txt/csv 文件中的数据上传到数据库中。我会这样做:

OdbcConnection conn;
conn = new OdbcConnection(strConnString.Trim());
conn.Open();

sql_select = "select * from [" + this.csvFilePath.Trim() + "]";

这个想法是让用户决定分隔符是什么,比如“;”或“,”或“#”,或其他任何东西..

因此,当分隔符是“,”之外的任何内容时,应用程序运行良好......但是当我选择使用它时,我收到一个错误,告诉我字段分隔符与小数分隔符重合。

问题是在我的位置,十进制的分隔符是“,”。我发现将控制面板上的小数分隔符更改为“。”而不是 "," 让应用程序工作。

我的问题是,有没有办法让应用程序设置默认分隔符?

【问题讨论】:

    标签: c# odbc


    【解决方案1】:

    看看这个问题,它可能会引导你找到你的解决方案:

    How to fix an application that has a problem with decimal separator

    正确的问题可能是 TL;DR,但第一个答案与您的问题及其解决方案有关。您将基本上使用应用程序线程的CultureInfo class 实例来使应用程序使用给定的文化。这样您就可以更改您正在使用的小数分隔符,而无需更改操作系统使用的分隔符。

    据我所知,您可以提供自己的自定义文化,因此您可以将小数分隔符设置为您喜欢的任何内容。

    【讨论】:

      【解决方案2】:

      虽然您可以使用 API 调用来设置操作系统的默认分隔符,但这可能会惹恼用户。更好的选择是在文件字符串中的分隔符上运行查找和替换,将用户输入的任何分隔符更改为某个自定义分隔符(为此目的设计了 ASCII 字符 30)。然后始终使用该自定义分隔符将数据解析到您的文件中。当然,之后不要将更改保存到文件中。

      This page 包含由 ASCII 标准定义的所有字符的列表。

      【讨论】:

        【解决方案3】:
        var yourCulture = new CultureInfo("EN-US");
        yourCulture.NumberFormat.NumberDecimalSeparator = ";"; // an arbitrary separator
        Thread.CurrentThread.CurrentCulture = yourCulture;
        Console.WriteLine(1.5);                          // -> 1;5
        Console.WriteLine(Convert.ToDouble("1;5") + 1);  // -> 2;5
        

        【讨论】:

          【解决方案4】:

          这些解决方案都不适合我...即使我可以更改 CurrentCulture,我仍然收到错误“字段分隔符 = 十进制分隔符”。

          但是因为我很笨,我忘了正确设置schema.ini。这是我得到的:

              private void writeSchema()
              {
                  try
                  {
                      FileStream fsOutput = new FileStream(this.dirCSV + "\\schema.ini", FileMode.Create, FileAccess.Write);
                      StreamWriter srOutput = new StreamWriter(fsOutput);
                      string s1, s2, s3, s4, s5, s6, s7, s8;
          
                      s1 = "[" + this.FileNevCSV + "]";
                      s2 = "ColNameHeader=" + chkFirstRowColumnNames.Checked.ToString();
                      s3 = "Format=" + this.strFormat;
                      s4 = "MaxScanRows=25";
                      s5 = "CharacterSet=" + this.strEncoding;
                      s6 = "DecimalSymbol=.";
                      s7 = "CurrencyDecimalSymbol=.";
          
                      srOutput.WriteLine(s1.ToString() + "\r\n" + s2.ToString() + "\r\n" + s3.ToString() + "\r\n" + s4.ToString() + "\r\n" + s5.ToString() + "\r\n" + s6.ToString() + "\r\n" + s7.ToString());
                      srOutput.Close();
                      fsOutput.Close();
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show(ex.Message, "writeSchema");
                  }
                  finally
                  { }
              }
          

          这该死的东西可以正常工作。感谢大家的帮助!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-02-02
            • 2012-02-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-18
            • 1970-01-01
            相关资源
            最近更新 更多