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

Write double to text file with dot separator

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

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

但是我有太多的数字要写,所以我尝试了this answer:

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

也尝试过 change the culture globally:

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

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

另一个问题是:

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

复制字符串后的第一个对象,所以我得到的所有数字都是 'a',即使我写

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

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

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

您应该能够使用 string.Format 并指定适当的 CultureInfo 以实现此目的。

例如:

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));

你最后一个例子的问题:

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

格式字符串中冒号之前的部分是格式参数数组的索引,所以如果你使用全零,你只会得到一个,第0个参数。而是使用

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

这里{1:0.#####}会用到b等

除非您的代码对性能要求很高,否则我在不变区域性中格式化字符串的首选方法是使用方法 System.FormattableString.Invariant 在不变区域性中进行字符串插值:

using static System.FormattableString;


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