2014-10-07 2 views
1

Я пишу конвертер 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, 
      transaction.Category, 
      transaction.Memo, 
      transaction.Outflow, 
      transaction.Inflow)); 
     output.AppendLine(); 
    } 

Это все работает отлично, маленькая проблема, я имею в виду, что свойство Outflow является плавающей точкой, и моя локаль использует запятые в качестве десятичного разделителя, что, очевидно, представляет собой проблему в CSV CSV, поэтому вместо того, чтобы получать, скажем, 10.50, он выдаст 10,50, есть ли какие-либо простой способ решить эту проблему?

+0

Ответ Saeb действителен, но если вы решите оставить запятые, что хорошо, поскольку CSV-файлы должны использовать кавычки вокруг полей, содержащих встроенные кавычки. См. Раздел 2.6 RFC 4180. http://tools.ietf.org/html/rfc4180 –

+0

Использование культуры «Инвариант» - это рекомендуемый подход, поскольку он означает постоянную (инвариантную) культуру, которая использует периоды для десятичных знаков, а не запятых. –

ответ

-2

Вы можете заменить их. как это:

transaction.Outflow.ToString().Replace(',','.'); 
+0

'Outflow' - это поплавок, а не строка, поэтому я не могу этого сделать. –

+0

как насчет конвертации? – Moondustt

4

Вы можете указать инвариантную культуру, которая использует .:

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 

Этот вывод будет ложным, потому что сумма будет на самом деле 3.69999981

Вы можете прочитать больше на эту тему от этого C# in Depth excerpt.

+0

Почему десятичной основе для денег? –

+0

@OverlyExcessive, обновил ответ с дополнительной информацией. –

Смежные вопросы