在C#中更改系统小数分隔符?

时间:2013-06-06 19:24:58

标签: c# odbc

基本上我有一个C#Desktop应用程序,可以将数据从txt / csv文件上传到数据库中。我做了类似的事情:

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

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

我们的想法是让用户决定分隔符的内容,例如“;”或“,”或“#”,或其他......

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

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

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

4 个答案:

答案 0 :(得分:0)

请检查此问题,它可能会引导您找到解决方案:

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这些解决方案都不适合我...即使我可以更改CurrentCulture,我仍然会收到错误“field delimiter = decimal delimiter”。

但是因为我很蠢,我忘了正确设置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
        { }
    }

那该死的东西工作得很好。谢谢大家的帮助!