Browse Source

Merge pull request #132 from nuskey8/fix-pass-invariant-culture

Fix: invariant culture in not used in string.format
Akeit0 8 months ago
parent
commit
ad6a5a15a6
2 changed files with 24 additions and 9 deletions
  1. 10 9
      src/Lua/Standard/StringLibrary.cs
  2. 14 0
      tests/Lua.Tests/StringTests.cs

+ 10 - 9
src/Lua/Standard/StringLibrary.cs

@@ -2,6 +2,7 @@ using System.Text;
 using System.Text.RegularExpressions;
 using System.Text.RegularExpressions;
 using Lua.Internal;
 using Lua.Internal;
 using Lua.Runtime;
 using Lua.Runtime;
+using System.Globalization;
 
 
 namespace Lua.Standard;
 namespace Lua.Standard;
 
 
@@ -259,23 +260,23 @@ public sealed class StringLibrary
                         {
                         {
                             case 'f':
                             case 'f':
                                 formattedValue = precision < 0
                                 formattedValue = precision < 0
-                                    ? f.ToString()
-                                    : f.ToString($"F{precision}");
+                                    ? f.ToString(CultureInfo.InvariantCulture)
+                                    : f.ToString($"F{precision}",CultureInfo.InvariantCulture);
                                 break;
                                 break;
                             case 'e':
                             case 'e':
                                 formattedValue = precision < 0
                                 formattedValue = precision < 0
-                                    ? f.ToString()
-                                    : f.ToString($"E{precision}");
+                                    ? f.ToString(CultureInfo.InvariantCulture)
+                                    : f.ToString($"E{precision}",CultureInfo.InvariantCulture);
                                 break;
                                 break;
                             case 'g':
                             case 'g':
                                 formattedValue = precision < 0
                                 formattedValue = precision < 0
-                                    ? f.ToString()
-                                    : f.ToString($"G{precision}");
+                                    ? f.ToString(CultureInfo.InvariantCulture)
+                                    : f.ToString($"G{precision}",CultureInfo.InvariantCulture);
                                 break;
                                 break;
                             case 'G':
                             case 'G':
                                 formattedValue = precision < 0
                                 formattedValue = precision < 0
-                                    ? f.ToString().ToUpper()
-                                    : f.ToString($"G{precision}").ToUpper();
+                                    ? f.ToString(CultureInfo.InvariantCulture).ToUpper()
+                                    : f.ToString($"G{precision}",CultureInfo.InvariantCulture).ToUpper();
                                 break;
                                 break;
                         }
                         }
 
 
@@ -310,7 +311,7 @@ public sealed class StringLibrary
                                 break;
                                 break;
                             case LuaValueType.Number:
                             case LuaValueType.Number:
                                 // TODO: floating point numbers must be in hexadecimal notation
                                 // TODO: floating point numbers must be in hexadecimal notation
-                                formattedValue = parameter.Read<double>().ToString();
+                                formattedValue = parameter.Read<double>().ToString(CultureInfo.InvariantCulture);
                                 break;
                                 break;
                             default:
                             default:
                                 using (var strBuffer = new PooledArray<LuaValue>(1))
                                 using (var strBuffer = new PooledArray<LuaValue>(1))

+ 14 - 0
tests/Lua.Tests/StringTests.cs

@@ -1,5 +1,7 @@
 using Lua.CodeAnalysis.Syntax;
 using Lua.CodeAnalysis.Syntax;
 using Lua.CodeAnalysis.Syntax.Nodes;
 using Lua.CodeAnalysis.Syntax.Nodes;
+using Lua.Standard;
+using System.Globalization;
 
 
 namespace Lua.Tests;
 namespace Lua.Tests;
 
 
@@ -14,4 +16,16 @@ public class StringTests
         Assert.That(result, Has.Length.EqualTo(1));
         Assert.That(result, Has.Length.EqualTo(1));
         Assert.That(result[0], Is.EqualTo(new LuaValue("\n")));
         Assert.That(result[0], Is.EqualTo(new LuaValue("\n")));
     }
     }
+
+    [TestCase("fr-FR")]
+    public async Task Test_StringFormat_Culture(string newLine)
+    {
+        var state = LuaState.Create();
+        state.OpenBasicLibrary();
+        state.OpenStringLibrary();
+        var culture = CultureInfo.CurrentCulture;
+        CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo(newLine);
+        await state.DoStringAsync($"""assert(tonumber(string.format("%f", 10.3)) == 10.3)""");
+        CultureInfo.CurrentCulture = culture;
+    }
 }
 }