2

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

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中的第二个'Thread':非静态字段需要对象引用,方法,或财产。

另一个问题是:

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

复制字符串后的第一个对象,所以即使我写了,我也将所有数字都设为“a”

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

3 回答 3

1

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

string.Format(CultureInfo.InvariantCluture, "{0:0.###} {0:0.#####}", a)
于 2019-10-29T08:07:47.717 回答
1

您应该能够使用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));
于 2019-10-29T08:08:01.517 回答
1

你最后一个例子的问题:

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}"));
...
于 2019-10-29T08:09:21.393 回答