diff --git a/Microsoft.Toolkit.Uwp.UI/Converters/StringFormatConverter.cs b/Microsoft.Toolkit.Uwp.UI/Converters/StringFormatConverter.cs index cb01f422c3f..fdf0d9b2bdc 100644 --- a/Microsoft.Toolkit.Uwp.UI/Converters/StringFormatConverter.cs +++ b/Microsoft.Toolkit.Uwp.UI/Converters/StringFormatConverter.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System; +using System.Globalization; using Windows.UI.Xaml.Data; namespace Microsoft.Toolkit.Uwp.UI.Converters @@ -18,29 +19,33 @@ public class StringFormatConverter : IValueConverter /// Object to transform to string. /// The type of the target property, as a type reference /// An optional parameter to be used in the string.Format method. - /// The language of the conversion (not used). + /// The language of the conversion. If language is null or empty then will be used. /// Formatted string. public object Convert(object value, Type targetType, object parameter, string language) { - if (value == null) + if (value is null) { return null; } - if (parameter == null) + // Retrieve the format string and use it to format the value. + string formatString = parameter as string; + if (string.IsNullOrEmpty(formatString)) { - return value; + // If the format string is null or empty, simply call ToString() + // on the value. + return value.ToString(); } try { - return string.Format((string)parameter, value); + CultureInfo culture = string.IsNullOrWhiteSpace(language) ? CultureInfo.InvariantCulture : new CultureInfo(language); + return string.Format(culture, formatString, value); } catch { + return value; } - - return value; } /// diff --git a/UnitTests/UnitTests.UWP/Converters/Test_StringFormatConverter.cs b/UnitTests/UnitTests.UWP/Converters/Test_StringFormatConverter.cs index 8bf74420b30..74696aa7108 100644 --- a/UnitTests/UnitTests.UWP/Converters/Test_StringFormatConverter.cs +++ b/UnitTests/UnitTests.UWP/Converters/Test_StringFormatConverter.cs @@ -5,58 +5,63 @@ using Microsoft.Toolkit.Uwp.UI.Converters; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; +using System.Globalization; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; namespace UnitTests.Converters { [TestClass] public class Test_StringFormatConverter { - private static readonly object NullString = null; private static readonly object NotEmptyString = "Hello, world"; private static readonly DateTime Date = DateTime.Now; - + [TestCategory("Converters")] [TestMethod] - public void WhenValueIsNull_ThenReturnNull() + [DataRow(null)] + [DataRow("en-us")] + public void WhenValueIsNull_ThenReturnNull(string language) { var converter = new StringFormatConverter(); - var result = converter.Convert(NullString, typeof(string), NullString, "en-us"); + var result = converter.Convert(null, typeof(string), null, language); + Assert.IsNull(result); } [TestCategory("Converters")] [TestMethod] - public void WhenValueExistsAndParameterIsNull_ThenReturnValue() + [DataRow(null)] + [DataRow("en-us")] + public void WhenValueExistsAndParameterIsNull_ThenReturnValue(string language) { var converter = new StringFormatConverter(); - var result = converter.Convert(NotEmptyString, typeof(string), NullString, "en-us"); + var result = converter.Convert(NotEmptyString, typeof(string), null, language); + Assert.AreEqual(NotEmptyString, result); } [TestCategory("Converters")] [TestMethod] - public void WhenParameterIsTimeFormat_ThenReturnValueOfTimeFormat() + [DataRow(null)] + [DataRow("en-us")] + public void WhenParameterIsInvalidFormat_ThenReturnValue(string language) { var converter = new StringFormatConverter(); - var result = converter.Convert(Date, typeof(string), "{0:HH:mm}", "en-us"); - Assert.AreEqual(Date.ToString("HH:mm"), result); - } + var result = converter.Convert(Date, typeof(string), "{1:}", language); - [TestCategory("Converters")] - [TestMethod] - public void WhenParameterIsInvalidFormat_ThenReturnValue() - { - var converter = new StringFormatConverter(); - var result = converter.Convert(Date, typeof(string), "{1:}", "en-us"); Assert.AreEqual(Date, result); } [TestCategory("Converters")] [TestMethod] - public void WhenParameterIsNotAString_ThenReturnValue() + [DataRow(null)] + [DataRow("en-us")] + public void WhenParameterIsNotAString_ThenReturnValue(string language) { var converter = new StringFormatConverter(); - var result = converter.Convert(NotEmptyString, typeof(string), 172, "en-us"); + var result = converter.Convert(NotEmptyString, typeof(string), 172, language); + Assert.AreEqual(NotEmptyString, result); } }