使用点分隔符将双精度写入文本文件

Write double to text file with dot separator

提问人:Perotto 提问时间:10/29/2019 最后编辑:Michał TurczynPerotto 更新时间:10/29/2019 访问量:959

问:

我需要用点分隔符在文本文件中写几个双精度。我知道,这段代码就是解决方案:

StreamWriter f = new StreamWriter(file, Encoding.ASCII, 128, false);
double a = 1.057887;
f.Write(a.ToString("G5", CultureInfo.InvariantCulture));

但是我有太多的数字要写,所以我尝试了这个答案的方法:

f.Write("{0:0.#####} {0:0.#####} {0:0.#####} {0:0.#####} {0:0.#####}", a, a, a, a, a));

并试图在全球范围内改变文化

System.Threading.Thread.CurrentCulture.NumberFormat.NumberDecimalSeparator = ".";

但是第一个“{0:0.#.####”导致逗号分隔符 (1,05789),第二个“线程”在 CS0120 中:非静态字段、方法或属性需要对象引用。

另一个问题是:

f.Write("{0:0.#####} {0:0.#####} ...", a, a, ...);

复制字符串后面的第一个对象,因此即使我写

f.Write("{0:0.#####} {0:0.#####} ...", a, b, ...);
C# IO 文本文件 Streamwriter invariantculture

评论

0赞 styx 10/29/2019
您需要创建一个新的区域性,并且可以使用当前区域性作为模板,并且只更改分隔符
0赞 TaW 10/29/2019
但我有太多的数字要写所以?是什么让您怀疑自己可能存在性能问题?对我来说听起来像是过早的优化..
0赞 Perotto 10/29/2019
“数字太多”意味着我无法循环该命令,因为它会为我生成多达 8 行代码,而不是一行包含我所有参数的代码。它与优化没有任何共同之处,但具有清晰的代码。f.Write(a.ToString("G5", CultureInfo.InvariantCulture));f.Write("{0:0.#####} {0:0.#####} ...", a, a, ...);

答:

1赞 Michał Turczyn 10/29/2019 #1

您可以通过以下方式使用它:string.Format

string.Format(CultureInfo.InvariantCluture, "{0:0.###} {0:0.#####}", a)
1赞 Martin 10/29/2019 #2

为了实现这一点,您应该能够使用和指定适当的方法。string.FormatCultureInfo

例如:

string.Format(CultureInfo.InvariantCulture, "{0:0.#####} {0:0.#####} {0:0.#####} {0:0.#####} {0:0.#####}", a, a, a, a, a)

生产:

1.05789 1.05789 1.05789 1.05789 1.05789

您的文件写入代码可能变为:

f.Write(string.Format(CultureInfo.InvariantCulture, "{0:0.#####} {0:0.#####} {0:0.#####} {0:0.#####} {0:0.#####}", a, a, a, a, a));
1赞 Jonas Høgh 10/29/2019 #3

上一个示例的问题:

f.Write("{0:0.#####} {0:0.#####} ...", a, b, ...);

冒号之前的格式字符串部分是格式参数数组的索引,因此,如果您使用所有零,则只会得到一个,即第 0 个参数。请改用

f.Write("{0:0.#####} {1:0.#####} ...", a, b, ...);

这里将使用 b 等。{1:0.#####}

除非您的代码对性能非常关键,否则在固定区域性中设置字符串格式的首选方法是使用 System.FormattableString.Invariant 方法在固定区域性中执行字符串插值:

using static System.FormattableString;


...
f.Write(Invariant($"{a:G5} {b:G5} {c:G5} {d:G5}"));
...