Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion src/CsvHelper/Expressions/ObjectRecordWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,11 @@ protected override Action<T> CreateWriteDelegate<T>(Type type)
{
fieldExpression = Expression.Constant(memberMap.Data.Constant);
var typeConverterExpression = Expression.Constant(Writer.Context.TypeConverterCache.GetConverter(memberMap.Data.Constant.GetType()));

memberMap.Data.TypeConverterOptions = TypeConverterOptions.Merge(
new TypeConverterOptions { CultureInfo = Writer.Configuration.CultureInfo },
memberMap.Data.TypeConverterOptions);

var method = typeof(ITypeConverter).GetMethod(nameof(ITypeConverter.ConvertToString))!;
fieldExpression = Expression.Convert(fieldExpression, typeof(object));
fieldExpression = Expression.Call(typeConverterExpression, method, fieldExpression, Expression.Constant(Writer), Expression.Constant(memberMap.Data));
Expand All @@ -96,7 +101,10 @@ protected override Action<T> CreateWriteDelegate<T>(Type type)
fieldExpression = ExpressionManager.CreateGetMemberExpression(recordParameterConverted, Writer.Context.Maps[type]!, memberMap)!;

var typeConverterExpression = Expression.Constant(memberMap.Data.TypeConverter);
memberMap.Data.TypeConverterOptions = TypeConverterOptions.Merge(new TypeConverterOptions { CultureInfo = Writer.Configuration.CultureInfo }, Writer.Context.TypeConverterOptionsCache.GetOptions(memberMap.Data.Member!.MemberType()), memberMap.Data.TypeConverterOptions);
memberMap.Data.TypeConverterOptions = TypeConverterOptions.Merge(
new TypeConverterOptions { CultureInfo = Writer.Configuration.CultureInfo },
Writer.Context.TypeConverterOptionsCache.GetOptions(memberMap.Data.Member!.MemberType()),
memberMap.Data.TypeConverterOptions);

var method = typeof(ITypeConverter).GetMethod(nameof(ITypeConverter.ConvertToString))!;
fieldExpression = Expression.Convert(fieldExpression, typeof(object));
Expand Down
98 changes: 97 additions & 1 deletion tests/CsvHelper.Tests/Writing/ConstantTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

namespace CsvHelper.Tests.Writing
{

public class ConstantTests
{
[Fact]
Expand Down Expand Up @@ -90,6 +90,79 @@ public void IntConstantTest()
}
}

[Fact]
public void DoubleConstantTest_CultureInvariant()
{
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
};
using (var writer = new StringWriter())
using (var csv = new CsvWriter(writer, config))
{
var records = new List<Test>
{
new Test { Id = 1, Name = "one" },
};

csv.Context.RegisterClassMap<TestDoubleMap>();
csv.WriteRecords(records);
writer.Flush();

Assert.Equal("3.141592,3.1415\r\n", writer.ToString());
}
}

[Fact]
public void DoubleConstantTest_CultureDe()
{
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
var config = new CsvConfiguration(new CultureInfo("de-DE"))
{
HasHeaderRecord = false,
};
using (var writer = new StringWriter())
using (var csv = new CsvWriter(writer, config))
{
var records = new List<Test>
{
new Test { Id = 1, Name = "one" },
};

csv.Context.RegisterClassMap<TestDoubleMap>();
csv.WriteRecords(records);
writer.Flush();

Assert.Equal("3,141592;3,1415\r\n", writer.ToString());
}
}

[Fact]
public void DoubleConstantTest_CultureDeOverrideInvariant()
{
CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
var config = new CsvConfiguration(new CultureInfo("de-DE"))
{
HasHeaderRecord = false,
};
using (var writer = new StringWriter())
using (var csv = new CsvWriter(writer, config))
{
var records = new List<Test>
{
new Test { Id = 1, Name = "one" },
};

csv.Context.RegisterClassMap(new TestDoublCultureOverrideMap(CultureInfo.InvariantCulture));
csv.WriteRecords(records);
writer.Flush();

Assert.Equal("3,141592;3.1415\r\n", writer.ToString());
}
}


private class Test
{
public int Id { get; set; }
Expand Down Expand Up @@ -122,5 +195,28 @@ public TestStringMap()
Map(m => m.Name).Constant("constant");
}
}

private sealed class TestDoubleMap : ClassMap<Test>
{
public TestDoubleMap()
{
Map(m => m.Id).Ignore();
Map(m => m.Name).Ignore();
Map().Constant(3.141592);
Map().Constant(3.1415m);
}
}

private sealed class TestDoublCultureOverrideMap : ClassMap<Test>
{
public TestDoublCultureOverrideMap(CultureInfo culture)
{
Map(m => m.Id).Ignore();
Map(m => m.Name).Ignore();
Map().Constant(3.141592);
Map().Constant(3.1415m).TypeConverterOption.CultureInfo(culture);
}
}

}
}