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

Commit 13a9f3b

Browse files
committed
Allow commas in decimals + add tests for nullable float numbers
1 parent d00eb3d commit 13a9f3b

File tree

3 files changed

+104
-3
lines changed

3 files changed

+104
-3
lines changed

src/ServiceStack.Text/Common/DeserializeBuiltin.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ private static ParseStringDelegate GetParseFn()
6666
case TypeCode.Double:
6767
return value => double.Parse(value, CultureInfo.InvariantCulture);
6868
case TypeCode.Decimal:
69-
return value => decimal.Parse(value, NumberStyles.Float, CultureInfo.InvariantCulture);
69+
return value => decimal.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture);
7070
case TypeCode.DateTime:
7171
return value => DateTimeSerializer.ParseShortestXsdDateTime(value);
7272
case TypeCode.Char:
@@ -119,7 +119,7 @@ private static ParseStringDelegate GetParseFn()
119119
case TypeCode.Double:
120120
return value => string.IsNullOrEmpty(value) ? (double?)null : double.Parse(value, CultureInfo.InvariantCulture);
121121
case TypeCode.Decimal:
122-
return value => string.IsNullOrEmpty(value) ? (decimal?)null : decimal.Parse(value, CultureInfo.InvariantCulture);
122+
return value => string.IsNullOrEmpty(value) ? (decimal?)null : decimal.Parse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture);
123123
case TypeCode.DateTime:
124124
return value => DateTimeSerializer.ParseShortestNullableXsdDateTime(value);
125125
case TypeCode.Char:

tests/ServiceStack.Text.Tests/JsvTests/JsvBasicDataTests.cs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,73 @@ public void Can_serialize_ModelWithFloatTypes()
3434
fromJsv = jsv.FromJsv<ModelWithFloatTypes>();
3535
Assert.That(fromJsv, Is.EqualTo(dto));
3636
}
37+
38+
[Test]
39+
public void Can_serialize_ModelWithNullableFloatTypes()
40+
{
41+
var dto = new ModelWithNullableFloatTypes
42+
{
43+
Float = 1.1f,
44+
Double = 2.2d,
45+
Decimal = 3.3m
46+
};
47+
48+
var jsv = dto.ToJsv();
49+
Assert.That(jsv, Is.EqualTo("{Float:1.1,Double:2.2,Decimal:3.3}"));
50+
51+
var fromJsv = jsv.FromJsv<ModelWithNullableFloatTypes>();
52+
Assert.That(fromJsv, Is.EqualTo(dto));
53+
54+
dto = new ModelWithNullableFloatTypes
55+
{
56+
Float = 111111.1f,
57+
Double = 2222222.22d,
58+
Decimal = 33333333.333m
59+
};
60+
61+
jsv = dto.ToJsv();
62+
Assert.That(jsv, Is.EqualTo("{Float:111111.1,Double:2222222.22,Decimal:33333333.333}"));
63+
64+
fromJsv = jsv.FromJsv<ModelWithNullableFloatTypes>();
65+
Assert.That(fromJsv, Is.EqualTo(dto));
66+
}
67+
68+
[Test]
69+
public void Can_serialize_ModelWithFloatTypes_From_String()
70+
{
71+
var dto = new ModelWithFloatTypes
72+
{
73+
Float = 1111.1f,
74+
Double = 2222.2d,
75+
Decimal = 3333.3m
76+
};
77+
78+
var jsv = "{Float:\"1111.1\",Double:\"2222.2\",Decimal:\"3333.3\"}";
79+
var fromJsv = jsv.FromJsv<ModelWithFloatTypes>();
80+
Assert.That(fromJsv, Is.EqualTo(dto));
81+
82+
jsv = "{Float:\"1,111.1\",Double:\"2,222.2\",Decimal:\"3,333.3\"}";
83+
fromJsv = jsv.FromJsv<ModelWithFloatTypes>();
84+
Assert.That(fromJsv, Is.EqualTo(dto));
85+
}
86+
87+
[Test]
88+
public void Can_serialize_ModelWithNullableFloatTypes_From_String()
89+
{
90+
var dto = new ModelWithNullableFloatTypes
91+
{
92+
Float = 1111.1f,
93+
Double = 2222.2d,
94+
Decimal = 3333.3m
95+
};
96+
97+
var jsv = "{Float:\"1111.1\",Double:\"2222.2\",Decimal:\"3333.3\"}";
98+
var fromJsv = jsv.FromJsv<ModelWithNullableFloatTypes>();
99+
Assert.That(fromJsv, Is.EqualTo(dto));
100+
101+
jsv = "{Float:\"1,111.1\",Double:\"2,222.2\",Decimal:\"3,333.3\"}";
102+
fromJsv = jsv.FromJsv<ModelWithNullableFloatTypes>();
103+
Assert.That(fromJsv, Is.EqualTo(dto));
104+
}
37105
}
38106
}

tests/ServiceStack.Text.Tests/Shared/ModelWithFloatTypes.cs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ public class ModelWithFloatTypes
88

99
protected bool Equals(ModelWithFloatTypes other)
1010
{
11-
return Float.Equals(other.Float) && Double.Equals(other.Double) && Decimal == other.Decimal;
11+
return Float.Equals(other.Float)
12+
&& Double.Equals(other.Double)
13+
&& Decimal == other.Decimal;
1214
}
1315

1416
public override bool Equals(object obj)
@@ -30,4 +32,35 @@ public override int GetHashCode()
3032
}
3133
}
3234
}
35+
36+
public class ModelWithNullableFloatTypes
37+
{
38+
public float? Float { get; set; }
39+
public double? Double { get; set; }
40+
public decimal? Decimal { get; set; }
41+
42+
protected bool Equals(ModelWithNullableFloatTypes other)
43+
{
44+
return Float.Equals(other.Float) && Double.Equals(other.Double) && Decimal == other.Decimal;
45+
}
46+
47+
public override bool Equals(object obj)
48+
{
49+
if (ReferenceEquals(null, obj)) return false;
50+
if (ReferenceEquals(this, obj)) return true;
51+
if (obj.GetType() != this.GetType()) return false;
52+
return Equals((ModelWithNullableFloatTypes) obj);
53+
}
54+
55+
public override int GetHashCode()
56+
{
57+
unchecked
58+
{
59+
var hashCode = Float.GetHashCode();
60+
hashCode = (hashCode * 397) ^ Double.GetHashCode();
61+
hashCode = (hashCode * 397) ^ Decimal.GetHashCode();
62+
return hashCode;
63+
}
64+
}
65+
}
3366
}

0 commit comments

Comments
 (0)