From 50887904a9ec9756796b2916e13cccd7a415d013 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 1 Mar 2026 15:31:51 +0000 Subject: [PATCH 1/2] Initial plan From a9db3c1dee5e6bada992388d560a1371f40c0765 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 1 Mar 2026 15:37:14 +0000 Subject: [PATCH 2/2] Fix phone number format: avoid misidentifying escaped literal chars as grouping chars, fix decimal cast in SSN/Zip/Phone format classes Co-authored-by: tonyqus <772561+tonyqus@users.noreply.github.com> --- main/SS/UserModel/DataFormatter.cs | 7 +++++-- main/SS/Util/Format.cs | 6 +++--- testcases/main/SS/UserModel/TestDataFormatter.cs | 13 +++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/main/SS/UserModel/DataFormatter.cs b/main/SS/UserModel/DataFormatter.cs index b248d6e350..5eba099ac2 100644 --- a/main/SS/UserModel/DataFormatter.cs +++ b/main/SS/UserModel/DataFormatter.cs @@ -894,12 +894,15 @@ public override object ParseObject(string source, int pos) private FormatBase CreateNumberFormat(string formatStr, double cellValue) { + // Check for alternate grouping BEFORE cleaning (backslash stripping) so that + // escaped literal characters like \- are not misidentified as grouping chars. + // eg for a format like #'##0 which wants 12'345 not 12,345 + Match agm = alternateGrouping.Match(formatStr); + string format = cleanFormatForNumber(formatStr); NumberFormatInfo symbols = decimalSymbols; // Do we need to change the grouping character? - // eg for a format like #'##0 which wants 12'345 not 12,345 - Match agm = alternateGrouping.Match(format); if (agm.Success) { char grouping = agm.Groups[2].Value[0]; diff --git a/main/SS/Util/Format.cs b/main/SS/Util/Format.cs index 0d3ffd683e..4a6f4cd98e 100644 --- a/main/SS/Util/Format.cs +++ b/main/SS/Util/Format.cs @@ -58,7 +58,7 @@ private SSNFormat() /** Format a number as an SSN */ public override string Format(object obj, CultureInfo culture) { - var result = ((double)obj).ToString(df, culture); + var result = Convert.ToDouble(obj, CultureInfo.InvariantCulture).ToString(df, culture); var sb = new StringBuilder(); sb.Append(result.Substring(0, 3)).Append('-'); sb.Append(result.Substring(3, 2)).Append('-'); @@ -99,7 +99,7 @@ private ZipPlusFourFormat() /** Format a number as Zip + 4 */ public override string Format(object obj, CultureInfo culture) { - var result = ((double)obj).ToString(df, culture); + var result = Convert.ToDouble(obj, CultureInfo.InvariantCulture).ToString(df, culture); return result.Substring(0, 5)+'-'+result.Substring(5, 4); } @@ -137,7 +137,7 @@ private PhoneFormat() /** Format a number as a phone number */ public override string Format(object obj, CultureInfo culture) { - var result = ((double)obj).ToString(df, culture); + var result = Convert.ToDouble(obj, CultureInfo.InvariantCulture).ToString(df, culture); var sb = new StringBuilder(); String seg1, seg2, seg3; var len = result.Length; diff --git a/testcases/main/SS/UserModel/TestDataFormatter.cs b/testcases/main/SS/UserModel/TestDataFormatter.cs index 0862ab6d70..3982a5c0cf 100644 --- a/testcases/main/SS/UserModel/TestDataFormatter.cs +++ b/testcases/main/SS/UserModel/TestDataFormatter.cs @@ -894,6 +894,19 @@ Excel displays the month instead of minutes." * bug 60422 : DataFormatter has issues with a specific NumberFormat in Germany default locale * Currently, this test only passes if you set LocaleUtil.setUserLocale(Locale.ROOT) or Locale.US. */ + [Test] + public void TestPhoneNumberFormat() + { + DataFormatter formatter = new DataFormatter(CultureInfo.GetCultureInfo("en-US")); + + // Bug: alternateGrouping regex should not misidentify escaped literal '-' as a grouping character + ClassicAssert.AreEqual("(123) 456-7890", formatter.FormatRawCellContents(1234567890, -1, "[<=9999999]###\\-####;\\(###\\)\\ ###\\-####")); + ClassicAssert.AreEqual("123-456-7890", formatter.FormatRawCellContents(1234567890, -1, "###\\-###\\-####")); + + // Bug: SSNFormat/ZipPlusFourFormat/PhoneFormat must handle decimal values passed by FormatRawCellContents + ClassicAssert.AreEqual("(123) 456-7890", formatter.FormatRawCellContents(1234567890, -1, "[<=9999999]###-####;(###) ###-####")); + } + [Test] public void TestBug60422() {