Skip to content

Commit ca55ade

Browse files
Arlodotexetutkus
andauthored
Fixed StringFormatConverter ignoring Language parameter, cleanup (#4764)
* Added CultureInfo to StringFormatConverter * Cleanup uneeded CultureInfo property * Only construct CultureInfo if needed * Remove unnecessary tests * Remove unused decimal Co-authored-by: tutkus <tutka.pawel@gmail.com>
1 parent cadc08b commit ca55ade

File tree

2 files changed

+35
-25
lines changed

2 files changed

+35
-25
lines changed

Microsoft.Toolkit.Uwp.UI/Converters/StringFormatConverter.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// See the LICENSE file in the project root for more information.
44

55
using System;
6+
using System.Globalization;
67
using Windows.UI.Xaml.Data;
78

89
namespace Microsoft.Toolkit.Uwp.UI.Converters
@@ -18,29 +19,33 @@ public class StringFormatConverter : IValueConverter
1819
/// <param name="value">Object to transform to string.</param>
1920
/// <param name="targetType">The type of the target property, as a type reference</param>
2021
/// <param name="parameter">An optional parameter to be used in the string.Format method.</param>
21-
/// <param name="language">The language of the conversion (not used).</param>
22+
/// <param name="language">The language of the conversion. If language is null or empty then <see cref="CultureInfo"/> will be used.</param>
2223
/// <returns>Formatted string.</returns>
2324
public object Convert(object value, Type targetType, object parameter, string language)
2425
{
25-
if (value == null)
26+
if (value is null)
2627
{
2728
return null;
2829
}
2930

30-
if (parameter == null)
31+
// Retrieve the format string and use it to format the value.
32+
string formatString = parameter as string;
33+
if (string.IsNullOrEmpty(formatString))
3134
{
32-
return value;
35+
// If the format string is null or empty, simply call ToString()
36+
// on the value.
37+
return value.ToString();
3338
}
3439

3540
try
3641
{
37-
return string.Format((string)parameter, value);
42+
CultureInfo culture = string.IsNullOrWhiteSpace(language) ? CultureInfo.InvariantCulture : new CultureInfo(language);
43+
return string.Format(culture, formatString, value);
3844
}
3945
catch
4046
{
47+
return value;
4148
}
42-
43-
return value;
4449
}
4550

4651
/// <summary>

UnitTests/UnitTests.UWP/Converters/Test_StringFormatConverter.cs

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,58 +5,63 @@
55
using Microsoft.Toolkit.Uwp.UI.Converters;
66
using Microsoft.VisualStudio.TestTools.UnitTesting;
77
using System;
8+
using System.Globalization;
9+
using Windows.UI.Xaml;
10+
using Windows.UI.Xaml.Controls;
811

912
namespace UnitTests.Converters
1013
{
1114
[TestClass]
1215
public class Test_StringFormatConverter
1316
{
14-
private static readonly object NullString = null;
1517
private static readonly object NotEmptyString = "Hello, world";
1618
private static readonly DateTime Date = DateTime.Now;
17-
19+
1820
[TestCategory("Converters")]
1921
[TestMethod]
20-
public void WhenValueIsNull_ThenReturnNull()
22+
[DataRow(null)]
23+
[DataRow("en-us")]
24+
public void WhenValueIsNull_ThenReturnNull(string language)
2125
{
2226
var converter = new StringFormatConverter();
23-
var result = converter.Convert(NullString, typeof(string), NullString, "en-us");
27+
var result = converter.Convert(null, typeof(string), null, language);
28+
2429
Assert.IsNull(result);
2530
}
2631

2732
[TestCategory("Converters")]
2833
[TestMethod]
29-
public void WhenValueExistsAndParameterIsNull_ThenReturnValue()
34+
[DataRow(null)]
35+
[DataRow("en-us")]
36+
public void WhenValueExistsAndParameterIsNull_ThenReturnValue(string language)
3037
{
3138
var converter = new StringFormatConverter();
32-
var result = converter.Convert(NotEmptyString, typeof(string), NullString, "en-us");
39+
var result = converter.Convert(NotEmptyString, typeof(string), null, language);
40+
3341
Assert.AreEqual(NotEmptyString, result);
3442
}
3543

3644
[TestCategory("Converters")]
3745
[TestMethod]
38-
public void WhenParameterIsTimeFormat_ThenReturnValueOfTimeFormat()
46+
[DataRow(null)]
47+
[DataRow("en-us")]
48+
public void WhenParameterIsInvalidFormat_ThenReturnValue(string language)
3949
{
4050
var converter = new StringFormatConverter();
41-
var result = converter.Convert(Date, typeof(string), "{0:HH:mm}", "en-us");
42-
Assert.AreEqual(Date.ToString("HH:mm"), result);
43-
}
51+
var result = converter.Convert(Date, typeof(string), "{1:}", language);
4452

45-
[TestCategory("Converters")]
46-
[TestMethod]
47-
public void WhenParameterIsInvalidFormat_ThenReturnValue()
48-
{
49-
var converter = new StringFormatConverter();
50-
var result = converter.Convert(Date, typeof(string), "{1:}", "en-us");
5153
Assert.AreEqual(Date, result);
5254
}
5355

5456
[TestCategory("Converters")]
5557
[TestMethod]
56-
public void WhenParameterIsNotAString_ThenReturnValue()
58+
[DataRow(null)]
59+
[DataRow("en-us")]
60+
public void WhenParameterIsNotAString_ThenReturnValue(string language)
5761
{
5862
var converter = new StringFormatConverter();
59-
var result = converter.Convert(NotEmptyString, typeof(string), 172, "en-us");
63+
var result = converter.Convert(NotEmptyString, typeof(string), 172, language);
64+
6065
Assert.AreEqual(NotEmptyString, result);
6166
}
6267
}

0 commit comments

Comments
 (0)