diff --git a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs
index be755509..6aeea9c4 100644
--- a/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs
+++ b/SabreTools.Metadata.Filter.Test/FilterObjectTests.cs
@@ -1,4 +1,5 @@
using System;
+using System.Globalization;
using SabreTools.Data.Models.Metadata;
using SabreTools.Hashing;
using Xunit;
@@ -1022,6 +1023,20 @@ public void Matches_Display(string itemField, string value)
Assert.True(actual);
}
+ [Theory]
+ [InlineData("en-US")]
+ [InlineData("de-DE")]
+ [InlineData("fr-FR")]
+ public void Matches_DisplayRefresh_CurrentCultureIgnored(string culture)
+ {
+ CultureInfo.CurrentCulture = new CultureInfo(culture);
+ var filter = new FilterObject("display.refresh", "123.45", Operation.Equals);
+ Display obj = new Display { Refresh = 123.45 };
+
+ bool actual = filter.Matches(obj);
+ Assert.True(actual);
+ }
+
#endregion
#region Driver
@@ -2085,6 +2100,20 @@ public void Matches_Video(string itemField, string value)
Assert.True(actual);
}
+ [Theory]
+ [InlineData("en-US")]
+ [InlineData("de-DE")]
+ [InlineData("fr-FR")]
+ public void Matches_VideoRefresh_CurrentCultureIgnored(string culture)
+ {
+ CultureInfo.CurrentCulture = new CultureInfo(culture);
+ var filter = new FilterObject("video.refresh", "123.45", Operation.Equals);
+ Video obj = new Video { Refresh = 123.45 };
+
+ bool actual = filter.Matches(obj);
+ Assert.True(actual);
+ }
+
#endregion
}
}
diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs
index 86d1d59d..0c941d98 100644
--- a/SabreTools.Metadata.Filter/FilterObject.cs
+++ b/SabreTools.Metadata.Filter/FilterObject.cs
@@ -1,4 +1,5 @@
using System;
+using System.Globalization;
using System.Text.RegularExpressions;
using SabreTools.Data.Extensions;
using SabreTools.Data.Models.Metadata;
@@ -1134,7 +1135,7 @@ private static bool GetCheckValue(Display obj, string fieldName, out string? che
return true;
case "refresh":
case "freq":
- checkValue = obj.Refresh?.ToString();
+ checkValue = obj.Refresh?.ToString(CultureInfo.InvariantCulture);
return true;
case "rotate":
case "orientation":
@@ -2512,7 +2513,7 @@ private static bool GetCheckValue(Video obj, string fieldName, out string? check
return true;
case "refresh":
case "freq":
- checkValue = obj.Refresh?.ToString();
+ checkValue = obj.Refresh?.ToString(CultureInfo.InvariantCulture);
return true;
case "displaytype":
case "screen":
diff --git a/SabreTools.Serialization.Readers.Test/ClrMameProTests.cs b/SabreTools.Serialization.Readers.Test/ClrMameProTests.cs
index dda42561..7736132e 100644
--- a/SabreTools.Serialization.Readers.Test/ClrMameProTests.cs
+++ b/SabreTools.Serialization.Readers.Test/ClrMameProTests.cs
@@ -1,3 +1,4 @@
+using System.Globalization;
using System.IO;
using System.Linq;
using Xunit;
@@ -171,6 +172,25 @@ public void RoundTripMachineWithoutQuotesTest()
Validate(newGame);
}
+ [Theory]
+ [InlineData("en-US")]
+ [InlineData("de-DE")]
+ [InlineData("fr-FR")]
+ public void SerializeFreq_CurrentCultureIgnored(string culture)
+ {
+ CultureInfo.CurrentCulture = new CultureInfo(culture);
+ var serializer = new Writers.ClrMamePro();
+
+ // Serialize to stream
+ Stream? actual = serializer.SerializeStream(Build(game: false));
+ Assert.NotNull(actual);
+
+ // Validate the freq value
+ string dat = new StreamReader(actual).ReadToEnd();
+ Assert.Contains("123.450000", dat);
+ Assert.DoesNotContain("123,45", dat);
+ }
+
///
/// Build model for serialization and deserialization
///
diff --git a/SabreTools.Serialization.Readers.Test/ListxmlTests.cs b/SabreTools.Serialization.Readers.Test/ListxmlTests.cs
index d525afa3..483b408e 100644
--- a/SabreTools.Serialization.Readers.Test/ListxmlTests.cs
+++ b/SabreTools.Serialization.Readers.Test/ListxmlTests.cs
@@ -1,3 +1,4 @@
+using System.Globalization;
using System.IO;
using System.Linq;
using Xunit;
@@ -125,6 +126,25 @@ public void RoundTripMachineTest()
Validate(newGame);
}
+ [Theory]
+ [InlineData("en-US")]
+ [InlineData("de-DE")]
+ [InlineData("fr-FR")]
+ public void SerializeRefresh_CurrentCultureIgnored(string culture)
+ {
+ CultureInfo.CurrentCulture = new CultureInfo(culture);
+ var serializer = new Writers.Listxml();
+
+ // Serialize to stream
+ Stream? actual = serializer.SerializeStream(Build(game: false));
+ Assert.NotNull(actual);
+
+ // Validate the refresh values
+ string xml = new StreamReader(actual).ReadToEnd();
+ Assert.Contains("refresh=\"123.450000\"", xml);
+ Assert.DoesNotContain("123,45", xml);
+ }
+
///
/// Build model for serialization and deserialization
///
diff --git a/SabreTools.Serialization.Readers.Test/M1Tests.cs b/SabreTools.Serialization.Readers.Test/M1Tests.cs
index 79a82b57..9f8d7a57 100644
--- a/SabreTools.Serialization.Readers.Test/M1Tests.cs
+++ b/SabreTools.Serialization.Readers.Test/M1Tests.cs
@@ -1,3 +1,4 @@
+using System.Globalization;
using System.IO;
using System.Linq;
using Xunit;
@@ -121,6 +122,25 @@ public void RoundTripMachineTest()
Validate(newGame);
}
+ [Theory]
+ [InlineData("en-US")]
+ [InlineData("de-DE")]
+ [InlineData("fr-FR")]
+ public void SerializeRefresh_CurrentCultureIgnored(string culture)
+ {
+ CultureInfo.CurrentCulture = new CultureInfo(culture);
+ var serializer = new Writers.M1();
+
+ // Serialize to stream
+ Stream? actual = serializer.SerializeStream(Build(game: false));
+ Assert.NotNull(actual);
+
+ // Validate the refresh values
+ string xml = new StreamReader(actual).ReadToEnd();
+ Assert.Contains("refresh=\"123.450000\"", xml);
+ Assert.DoesNotContain("123,45", xml);
+ }
+
///
/// Build model for serialization and deserialization
///
diff --git a/SabreTools.Serialization.Readers.Test/MessTests.cs b/SabreTools.Serialization.Readers.Test/MessTests.cs
index 5473df94..51d6f833 100644
--- a/SabreTools.Serialization.Readers.Test/MessTests.cs
+++ b/SabreTools.Serialization.Readers.Test/MessTests.cs
@@ -1,3 +1,4 @@
+using System.Globalization;
using System.IO;
using System.Linq;
using Xunit;
@@ -121,6 +122,25 @@ public void RoundTripMachineTest()
Validate(newGame);
}
+ [Theory]
+ [InlineData("en-US")]
+ [InlineData("de-DE")]
+ [InlineData("fr-FR")]
+ public void SerializeRefresh_CurrentCultureIgnored(string culture)
+ {
+ CultureInfo.CurrentCulture = new CultureInfo(culture);
+ var serializer = new Writers.Mess();
+
+ // Serialize to stream
+ Stream? actual = serializer.SerializeStream(Build(game: false));
+ Assert.NotNull(actual);
+
+ // Validate the refresh values
+ string xml = new StreamReader(actual).ReadToEnd();
+ Assert.Contains("refresh=\"123.450000\"", xml);
+ Assert.DoesNotContain("123,45", xml);
+ }
+
///
/// Build model for serialization and deserialization
///
diff --git a/SabreTools.Serialization.Writers/ClrMamePro.cs b/SabreTools.Serialization.Writers/ClrMamePro.cs
index d82bdb96..d10a9f4e 100644
--- a/SabreTools.Serialization.Writers/ClrMamePro.cs
+++ b/SabreTools.Serialization.Writers/ClrMamePro.cs
@@ -1,3 +1,4 @@
+using System.Globalization;
using System.IO;
using System.Text;
using SabreTools.Data.Extensions;
@@ -419,7 +420,7 @@ private static void WriteVideos(Video[]? videos, Writer writer)
writer.WriteOptionalAttributeString("y", video.Y.ToString());
writer.WriteOptionalAttributeString("aspectx", video.AspectX.ToString());
writer.WriteOptionalAttributeString("aspecty", video.AspectY.ToString());
- writer.WriteOptionalAttributeString("freq", video.Freq?.ToString("0.000000"));
+ writer.WriteOptionalAttributeString("freq", video.Freq?.ToString("0.000000", CultureInfo.InvariantCulture));
writer.WriteEndElement(); // video
}
}
diff --git a/SabreTools.Serialization.Writers/Listxml.cs b/SabreTools.Serialization.Writers/Listxml.cs
index 89b638e1..fcd83d73 100644
--- a/SabreTools.Serialization.Writers/Listxml.cs
+++ b/SabreTools.Serialization.Writers/Listxml.cs
@@ -1,3 +1,4 @@
+using System.Globalization;
using System.IO;
using System.Text;
using System.Xml;
@@ -395,7 +396,7 @@ private static void WriteDisplay(Display obj, XmlTextWriter writer)
writer.WriteOptionalAttributeString("flipx", obj.FlipX.FromYesNo());
writer.WriteOptionalAttributeString("width", obj.Width?.ToString());
writer.WriteOptionalAttributeString("height", obj.Height?.ToString());
- writer.WriteRequiredAttributeString("refresh", obj.Refresh?.ToString("0.000000"));
+ writer.WriteRequiredAttributeString("refresh", obj.Refresh?.ToString("0.000000", CultureInfo.InvariantCulture));
writer.WriteOptionalAttributeString("pixclock", obj.PixClock?.ToString());
writer.WriteOptionalAttributeString("htotal", obj.HTotal?.ToString());
writer.WriteOptionalAttributeString("hbend", obj.HBEnd?.ToString());
@@ -843,7 +844,7 @@ private static void WriteVideo(Video obj, XmlTextWriter writer)
writer.WriteOptionalAttributeString("height", obj.Height.ToString());
writer.WriteOptionalAttributeString("aspectx", obj.AspectX.ToString());
writer.WriteOptionalAttributeString("aspecty", obj.AspectY.ToString());
- writer.WriteRequiredAttributeString("refresh", obj.Refresh?.ToString("0.000000"));
+ writer.WriteRequiredAttributeString("refresh", obj.Refresh?.ToString("0.000000", CultureInfo.InvariantCulture));
writer.WriteEndElement();
}
diff --git a/SabreTools.Serialization.Writers/M1.cs b/SabreTools.Serialization.Writers/M1.cs
index af84c695..76879db9 100644
--- a/SabreTools.Serialization.Writers/M1.cs
+++ b/SabreTools.Serialization.Writers/M1.cs
@@ -1,3 +1,4 @@
+using System.Globalization;
using System.IO;
using System.Text;
using System.Xml;
@@ -393,7 +394,7 @@ private static void WriteDisplay(Display obj, XmlTextWriter writer)
writer.WriteOptionalAttributeString("flipx", obj.FlipX.FromYesNo());
writer.WriteOptionalAttributeString("width", obj.Width?.ToString());
writer.WriteOptionalAttributeString("height", obj.Height?.ToString());
- writer.WriteRequiredAttributeString("refresh", obj.Refresh?.ToString("0.000000"));
+ writer.WriteRequiredAttributeString("refresh", obj.Refresh?.ToString("0.000000", CultureInfo.InvariantCulture));
writer.WriteOptionalAttributeString("pixclock", obj.PixClock?.ToString());
writer.WriteOptionalAttributeString("htotal", obj.HTotal?.ToString());
writer.WriteOptionalAttributeString("hbend", obj.HBEnd?.ToString());
@@ -841,7 +842,7 @@ private static void WriteVideo(Video obj, XmlTextWriter writer)
writer.WriteOptionalAttributeString("height", obj.Height.ToString());
writer.WriteOptionalAttributeString("aspectx", obj.AspectX.ToString());
writer.WriteOptionalAttributeString("aspecty", obj.AspectY.ToString());
- writer.WriteRequiredAttributeString("refresh", obj.Refresh?.ToString("0.000000"));
+ writer.WriteRequiredAttributeString("refresh", obj.Refresh?.ToString("0.000000", CultureInfo.InvariantCulture));
writer.WriteEndElement();
}
diff --git a/SabreTools.Serialization.Writers/Mess.cs b/SabreTools.Serialization.Writers/Mess.cs
index ada680f8..0d3678b7 100644
--- a/SabreTools.Serialization.Writers/Mess.cs
+++ b/SabreTools.Serialization.Writers/Mess.cs
@@ -1,3 +1,4 @@
+using System.Globalization;
using System.IO;
using System.Text;
using System.Xml;
@@ -393,7 +394,7 @@ private static void WriteDisplay(Display obj, XmlTextWriter writer)
writer.WriteOptionalAttributeString("flipx", obj.FlipX.FromYesNo());
writer.WriteOptionalAttributeString("width", obj.Width?.ToString());
writer.WriteOptionalAttributeString("height", obj.Height?.ToString());
- writer.WriteRequiredAttributeString("refresh", obj.Refresh?.ToString("0.000000"));
+ writer.WriteRequiredAttributeString("refresh", obj.Refresh?.ToString("0.000000", CultureInfo.InvariantCulture));
writer.WriteOptionalAttributeString("pixclock", obj.PixClock?.ToString());
writer.WriteOptionalAttributeString("htotal", obj.HTotal?.ToString());
writer.WriteOptionalAttributeString("hbend", obj.HBEnd?.ToString());
@@ -841,7 +842,7 @@ private static void WriteVideo(Video obj, XmlTextWriter writer)
writer.WriteOptionalAttributeString("height", obj.Height.ToString());
writer.WriteOptionalAttributeString("aspectx", obj.AspectX.ToString());
writer.WriteOptionalAttributeString("aspecty", obj.AspectY.ToString());
- writer.WriteRequiredAttributeString("refresh", obj.Refresh?.ToString("0.000000"));
+ writer.WriteRequiredAttributeString("refresh", obj.Refresh?.ToString("0.000000", CultureInfo.InvariantCulture));
writer.WriteEndElement();
}