From 87d20f30b99ed8242e48b33e6875995c1ac26103 Mon Sep 17 00:00:00 2001 From: Carsten Jendro <15619117+Machibuse@users.noreply.github.com> Date: Thu, 30 Oct 2025 21:45:19 +0100 Subject: [PATCH] Ensure unit formatting uses requested fallback length --- Source/Porticle.CLDR.Units.Tests/UnitTests.cs | 26 +++++++++++++++++++ Source/Porticle.CLDR.Units/CldrUnits.cs | 8 +++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/Source/Porticle.CLDR.Units.Tests/UnitTests.cs b/Source/Porticle.CLDR.Units.Tests/UnitTests.cs index 7a82439..fd3307f 100644 --- a/Source/Porticle.CLDR.Units.Tests/UnitTests.cs +++ b/Source/Porticle.CLDR.Units.Tests/UnitTests.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Porticle.CLDR.Units.Serialization; namespace Porticle.CLDR.Units.Tests; @@ -63,4 +64,29 @@ public void TestAll() } } } + + [TestMethod] + public void GetFormatString_UsesLengthSpecificFallback() + { + var cldrUnits = new CldrUnits(Unit.LengthMeter); + + var shortFormat = cldrUnits.GetFormatString("xx", 1, PluralFormLength.Short, GrammaticalCase.Oblique); + var narrowFormat = cldrUnits.GetFormatString("xx", 1, PluralFormLength.Narrow, GrammaticalCase.Oblique); + + Assert.AreEqual("{0} m", shortFormat); + Assert.AreEqual("{0}m", narrowFormat); + } + + [TestMethod] + public void FormatUnit_UsesLengthSpecificFallback() + { + var cldrUnits = new CldrUnits(Unit.LengthMeter); + var culture = CultureInfo.InvariantCulture; + + var shortFormat = cldrUnits.FormatUnit(culture, 1, PluralFormLength.Short, GrammaticalCase.Oblique); + var narrowFormat = cldrUnits.FormatUnit(culture, 1, PluralFormLength.Narrow, GrammaticalCase.Oblique); + + Assert.AreEqual("1 m", shortFormat); + Assert.AreEqual("1m", narrowFormat); + } } \ No newline at end of file diff --git a/Source/Porticle.CLDR.Units/CldrUnits.cs b/Source/Porticle.CLDR.Units/CldrUnits.cs index 155d7ab..ab54b2a 100644 --- a/Source/Porticle.CLDR.Units/CldrUnits.cs +++ b/Source/Porticle.CLDR.Units/CldrUnits.cs @@ -48,7 +48,7 @@ public CldrUnits(Unit unit) /// The format String like "{0} weeks" public string GetFormatString(string language, int count, PluralFormLength length, GrammaticalCase grammaticalCase) { - return _patterns.GetFormat(language, count, length, grammaticalCase) ?? GetFallbackPattern(PluralFormLength.Long); + return _patterns.GetFormat(language, count, length, grammaticalCase) ?? GetFallbackPattern(length); } /// @@ -61,7 +61,7 @@ public string GetFormatString(string language, int count, PluralFormLength lengt /// A format string that matches the specified culture, count, plural form length, and grammatical case. If no specific format string is found, a fallback pattern is returned. public string GetFormatString(CultureInfo culture, int count, PluralFormLength length, GrammaticalCase grammaticalCase) { - return _patterns.GetFormat(culture.Name, count, length, grammaticalCase) ?? GetFallbackPattern(PluralFormLength.Long); + return _patterns.GetFormat(culture.Name, count, length, grammaticalCase) ?? GetFallbackPattern(length); } /// @@ -81,10 +81,10 @@ public string FormatUnit(CultureInfo culture, int count, PluralFormLength length { if (numberFormat == null) { - return string.Format(culture, _patterns.GetFormat(culture.Name, count, length, grammaticalCase) ?? GetFallbackPattern(PluralFormLength.Long), count); + return string.Format(culture, _patterns.GetFormat(culture.Name, count, length, grammaticalCase) ?? GetFallbackPattern(length), count); } - return string.Format(culture, _patterns.GetFormat(culture.Name, count, length, grammaticalCase) ?? GetFallbackPattern(PluralFormLength.Long), + return string.Format(culture, _patterns.GetFormat(culture.Name, count, length, grammaticalCase) ?? GetFallbackPattern(length), count.ToString(numberFormat, culture)); }