diff --git a/plist-cil.test/IssueTest.cs b/plist-cil.test/IssueTest.cs
index 84209a7..13f5cdf 100644
--- a/plist-cil.test/IssueTest.cs
+++ b/plist-cil.test/IssueTest.cs
@@ -147,6 +147,16 @@ namespace plistcil.test
Assert.Equal(expected, actual, false, true);
}
+
+ [Fact]
+ public static void RoundtripRealTest()
+ {
+ var expected = File.ReadAllText(@"test-files\RoundtripReal.plist");
+ var value = XmlPropertyListParser.Parse(new FileInfo(@"test-files\RoundtripReal.plist"));
+ var actual = value.ToXmlPropertyList();
+
+ Assert.Equal(expected, actual, false, true);
+ }
}
}
diff --git a/plist-cil.test/NSNumberTests.cs b/plist-cil.test/NSNumberTests.cs
index 3a6e97c..d5672ba 100644
--- a/plist-cil.test/NSNumberTests.cs
+++ b/plist-cil.test/NSNumberTests.cs
@@ -20,6 +20,13 @@ namespace plistcil.test
Assert.Equal(10032936613, number.ToObject());
}
+ [Fact]
+ public static void NSNumberWithDecimalTest()
+ {
+ var number = new NSNumber("1360155352.748765", NSNumber.REAL);
+ Assert.Equal("1360155352.748765", number.ToString());
+ }
+
// The tests below make sure the numbers are being parsed correctly, and do not depend on the culture info
// being set. Especially, decimal point may vary between cultures and we don't want to take a dependency on that
// The value being used comes seen in a real property list:
diff --git a/plist-cil.test/plist-cil.test.csproj b/plist-cil.test/plist-cil.test.csproj
index af444f8..6d498f9 100644
--- a/plist-cil.test/plist-cil.test.csproj
+++ b/plist-cil.test/plist-cil.test.csproj
@@ -100,6 +100,9 @@
PreserveNewest
+
+ PreserveNewest
+
diff --git a/plist-cil.test/test-files/RoundtripReal.plist b/plist-cil.test/test-files/RoundtripReal.plist
new file mode 100644
index 0000000..3ea7eb1
--- /dev/null
+++ b/plist-cil.test/test-files/RoundtripReal.plist
@@ -0,0 +1,5 @@
+
+
+
+1360155352.748765
+
diff --git a/plist-cil/NSNumber.cs b/plist-cil/NSNumber.cs
index 876601b..49d9628 100644
--- a/plist-cil/NSNumber.cs
+++ b/plist-cil/NSNumber.cs
@@ -331,7 +331,7 @@ namespace Claunia.PropertyList
}
case REAL:
{
- return ToDouble().ToString(CultureInfo.InvariantCulture);
+ return ToDouble().ToString("G17", CultureInfo.InvariantCulture);
}
case BOOLEAN:
{
@@ -369,7 +369,9 @@ namespace Claunia.PropertyList
}
else
{
- xml.Append(ToDouble().ToString(CultureInfo.InvariantCulture));
+ // ToString() can truncate the decimals, so use "G17". See
+ // https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings#the-round-trip-r-format-specifier
+ xml.Append(ToDouble().ToString("G17", CultureInfo.InvariantCulture));
}
xml.Append("");