使用点分隔符将双精度写入文本文件
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}"));
...
我需要用点分隔符在文本文件中写几个双打。我知道,这段代码就是解决方案:
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}"));
...