From b4e327d6fea8595a4ebe16ac5f17f33ebe1639e2 Mon Sep 17 00:00:00 2001 From: Simon Svensson Date: Mon, 7 Apr 2025 09:26:45 +0200 Subject: [PATCH] Fix numeric formatting patterns by unwrapping scalar values --- src/kOS.Safe.Test/Structures/StringValueTest.cs | 11 +++++++++++ src/kOS.Safe/Encapsulation/StringValue.cs | 17 ++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/kOS.Safe.Test/Structures/StringValueTest.cs b/src/kOS.Safe.Test/Structures/StringValueTest.cs index 001ecb7870..63b742d20c 100644 --- a/src/kOS.Safe.Test/Structures/StringValueTest.cs +++ b/src/kOS.Safe.Test/Structures/StringValueTest.cs @@ -219,5 +219,16 @@ public void CanParseScientificStrings() stringTest = new StringValue(" 1.23e+3a "); Assert.Throws(typeof(Exceptions.KOSNumberParseException), () => stringTest.ToScalar()); } + + [Test] + public void CanFormat() + { + var formatString = new StringValue("test1={0:0.0} test2='{0,10:0.0}'"); + + var expected = new StringValue("test1=13.4 test2=' 13.4'"); + var actual = formatString.Format(new ScalarDoubleValue(13.37)); + + Assert.That(expected.ToString(), Is.EqualTo(actual.ToString())); + } } } \ No newline at end of file diff --git a/src/kOS.Safe/Encapsulation/StringValue.cs b/src/kOS.Safe/Encapsulation/StringValue.cs index ecbe90ac3e..a7a509499b 100644 --- a/src/kOS.Safe/Encapsulation/StringValue.cs +++ b/src/kOS.Safe/Encapsulation/StringValue.cs @@ -7,6 +7,7 @@ using kOS.Safe.Serialization; using System.Collections.Generic; using System.Collections; +using System.Linq; namespace kOS.Safe.Encapsulation { @@ -257,7 +258,21 @@ public StringValue Format(params Structure[] args) { if (args.Length == 0) return this; - return new StringValue(string.Format(CultureInfo.InvariantCulture, this, args)); + + // Unwrap the primitive scalar value and send them + // into String.Format as-is. This is required to allow + // for numeric formatting patterns, like rounding. + var primitiveArgs = args + .Select(arg => { + if (arg is ScalarValue scalar) { + return scalar.ToPrimitive(); + } + + return arg; + }) + .ToArray(); + + return new StringValue(string.Format(CultureInfo.InvariantCulture, this, primitiveArgs)); } private void StringInitializeSuffixes()