C# 使用点分隔符格式化浮点
我正在编写一个csv转换器,将事务的文本文档转换为csv文档,我遇到了一个小问题C# 使用点分隔符格式化浮点,c#,csv,locale,C#,Csv,Locale,我正在编写一个csv转换器,将事务的文本文档转换为csv文档,我遇到了一个小问题 foreach (var transaction in transactions) { output.Append( string.Format("{0:dd/MM/yy},{1},{2},{3},{4:0.##},{5}", transaction.Date, transaction.Payee,
foreach (var transaction in transactions)
{
output.Append(
string.Format("{0:dd/MM/yy},{1},{2},{3},{4:0.##},{5}",
transaction.Date,
transaction.Payee,
transaction.Category,
transaction.Memo,
transaction.Outflow,
transaction.Inflow));
output.AppendLine();
}
这一切都很好,我遇到的一个小问题是,
Outflow
属性是一个float,我的区域设置使用逗号作为十进制分隔符,这在CSV中显然是一个相当大的问题,因此它将输出10,50,而不是10.50,有什么简单的方法来解决这个问题吗 您可以用替换。像这样:
transaction.Outflow.ToString().Replace(',','.');
您可以指定使用
的固定区域性:
foreach (var transaction in transactions)
{
output.Append(
string.Format("{0:dd/MM/yy},{1},{2},{3},{4},{5}",
transaction.Date,
transaction.Payee,
transaction.Category,
transaction.Memo,
transaction.Outflow.ToString("F2", CultureInfo.InvariantCulture),
transaction.Inflow));
output.AppendLine();
}
在旁注中,使用decimal
表示货币而不是float
:
decimal
是以10为基数的,因此它可以精确地表示零碎货币值,如0.1
,float
是以2为基数的,它不能。使用float
将导致奇怪的舍入错误,比较将无法按预期进行。考虑这一点:
float a = 3.6f, b = 0.1f, expected = 3.7f;
float sum = a + b;
Console.WriteLine(sum == expected); // false
这将输出false,因为总和实际上是3.69999981
你可以从这里读到更多关于这个主题的内容。
流出是一个浮点数而不是一个字符串,所以我不能这样做。转换怎么样?为什么用十进制表示货币?Saeb的回答是有效的,但是如果你选择保留逗号,那很好,因为CSV文件必须在包含嵌入引号的字段周围使用引号。见RFC 4180第2.6节。建议使用Invariant
区域性,因为它表示一个常量(不变)区域性,恰好使用句点表示小数而不是逗号。