Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit fa22d66

Browse files
committed
Add support for CsvConfig.RealNumberCultureInfo to modify CSV format of real numbers
1 parent a030887 commit fa22d66

File tree

5 files changed

+71
-9
lines changed

5 files changed

+71
-9
lines changed

src/ServiceStack.Text/Common/JsState.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ internal static class JsState
2121
[ThreadStatic]
2222
internal static int Depth = 0;
2323

24+
[ThreadStatic]
25+
internal static bool IsCsv = false;
26+
2427

2528
[ThreadStatic]
2629
internal static HashSet<Type> InSerializerFns = new HashSet<Type>();

src/ServiceStack.Text/CsvConfig.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Globalization;
34
using ServiceStack.Text.Common;
45

56
namespace ServiceStack.Text
@@ -11,6 +12,13 @@ static CsvConfig()
1112
Reset();
1213
}
1314

15+
private static CultureInfo sRealNumberCultureInfo;
16+
public static CultureInfo RealNumberCultureInfo
17+
{
18+
get { return sRealNumberCultureInfo ?? CultureInfo.InvariantCulture; }
19+
set { sRealNumberCultureInfo = value; }
20+
}
21+
1422
[ThreadStatic]
1523
private static string tsItemSeperatorString;
1624
private static string sItemSeperatorString;

src/ServiceStack.Text/CsvSerializer.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,8 @@ private static WriteObjectDelegate GetWriteFn()
164164

165165
if (propertyInfo.PropertyType == typeof(string)
166166
|| propertyInfo.PropertyType.IsValueType()
167-
|| propertyInfo.PropertyType == typeof(byte[])) continue;
167+
|| propertyInfo.PropertyType == typeof(byte[]))
168+
continue;
168169

169170
if (firstCandidate == null)
170171
{
@@ -263,7 +264,16 @@ static CsvSerializer()
263264

264265
public static void WriteObject(TextWriter writer, object value)
265266
{
266-
CacheFn(writer, value);
267+
var hold = JsState.IsCsv;
268+
JsState.IsCsv = true;
269+
try
270+
{
271+
CacheFn(writer, value);
272+
}
273+
finally
274+
{
275+
JsState.IsCsv = hold;
276+
}
267277
}
268278
}
269279
}

src/ServiceStack.Text/Jsv/JsvTypeSerializer.cs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -222,26 +222,32 @@ public void WriteFloat(TextWriter writer, object floatValue)
222222
{
223223
if (floatValue == null) return;
224224
var floatVal = (float)floatValue;
225-
if (Equals(floatVal, float.MaxValue) || Equals(floatVal, float.MinValue))
226-
writer.Write(floatVal.ToString("r", CultureInfo.InvariantCulture));
225+
var cultureInfo = JsState.IsCsv ? CsvConfig.RealNumberCultureInfo : null;
226+
227+
if (Equals(floatVal, float.MaxValue) || Equals(floatVal, float.MinValue))
228+
writer.Write(floatVal.ToString("r", cultureInfo ?? CultureInfo.InvariantCulture));
227229
else
228-
writer.Write(floatVal.ToString(CultureInfo.InvariantCulture));
230+
writer.Write(floatVal.ToString(cultureInfo ?? CultureInfo.InvariantCulture));
229231
}
230232

231233
public void WriteDouble(TextWriter writer, object doubleValue)
232234
{
233235
if (doubleValue == null) return;
234236
var doubleVal = (double)doubleValue;
235-
if (Equals(doubleVal, double.MaxValue) || Equals(doubleVal, double.MinValue))
236-
writer.Write(doubleVal.ToString("r", CultureInfo.InvariantCulture));
237+
var cultureInfo = JsState.IsCsv ? CsvConfig.RealNumberCultureInfo : null;
238+
239+
if (Equals(doubleVal, double.MaxValue) || Equals(doubleVal, double.MinValue))
240+
writer.Write(doubleVal.ToString("r", cultureInfo ?? CultureInfo.InvariantCulture));
237241
else
238-
writer.Write(doubleVal.ToString(CultureInfo.InvariantCulture));
242+
writer.Write(doubleVal.ToString(cultureInfo ?? CultureInfo.InvariantCulture));
239243
}
240244

241245
public void WriteDecimal(TextWriter writer, object decimalValue)
242246
{
243247
if (decimalValue == null) return;
244-
writer.Write(((decimal)decimalValue).ToString(CultureInfo.InvariantCulture));
248+
var cultureInfo = JsState.IsCsv ? CsvConfig.RealNumberCultureInfo : null;
249+
250+
writer.Write(((decimal)decimalValue).ToString(cultureInfo ?? CultureInfo.InvariantCulture));
245251
}
246252

247253
public void WriteEnum(TextWriter writer, object enumValue)
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System.Globalization;
2+
using NUnit.Framework;
3+
using ServiceStack.Text.Tests.Support;
4+
5+
namespace ServiceStack.Text.Tests
6+
{
7+
[TestFixture]
8+
public class CustomCultureInfoTests
9+
: TestBase
10+
{
11+
[Test]
12+
public void Does_not_use_custom_decimal()
13+
{
14+
CsvConfig.RealNumberCultureInfo = CultureInfo.CreateSpecificCulture("nl-NL");
15+
16+
var num = new NumberTypes
17+
{
18+
Int = 1111,
19+
Float = 2222.2222f,
20+
Double = 3333.3333,
21+
Decimal = 4444.4444M,
22+
};
23+
24+
num.ToJson().Print();
25+
num.ToJsv().Print();
26+
num.ToCsv().Print();
27+
28+
Assert.That(num.ToJson(), Is.StringContaining("4444.4444"));
29+
Assert.That(num.ToJsv(), Is.StringContaining("4444.4444"));
30+
Assert.That(num.ToCsv(), Is.StringContaining("4444,4444"));
31+
32+
CsvConfig.RealNumberCultureInfo = null;
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)