From ac9d0ad9d495457be28ef7f5b0d21ad8b8731750 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 16 Sep 2015 02:03:19 +0200 Subject: [PATCH] Require culture when parsing numbers. --- .../GridLengthTests.cs | 17 +++++++++-------- .../ThicknessTests.cs | 9 +++++---- .../Converters/GridLengthTypeConverter.cs | 2 +- .../Converters/ThicknessTypeConverter.cs | 2 +- src/Perspex.Controls/ColumnDefinitions.cs | 3 ++- src/Perspex.Controls/GridLength.cs | 13 ++++++++----- src/Perspex.Controls/RowDefinitions.cs | 3 ++- 7 files changed, 28 insertions(+), 21 deletions(-) diff --git a/Tests/Perspex.Controls.UnitTests/GridLengthTests.cs b/Tests/Perspex.Controls.UnitTests/GridLengthTests.cs index 0a0d6c5352..f90b585d3d 100644 --- a/Tests/Perspex.Controls.UnitTests/GridLengthTests.cs +++ b/Tests/Perspex.Controls.UnitTests/GridLengthTests.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. See licence.md file in the project root for full license information. using System; +using System.Globalization; using System.Linq; using Xunit; @@ -12,7 +13,7 @@ namespace Perspex.Controls.UnitTests [Fact] public void Parse_Should_Parse_Auto() { - var result = GridLength.Parse("Auto"); + var result = GridLength.Parse("Auto", CultureInfo.InvariantCulture); Assert.Equal(GridLength.Auto, result); } @@ -20,7 +21,7 @@ namespace Perspex.Controls.UnitTests [Fact] public void Parse_Should_Parse_Auto_Lowercase() { - var result = GridLength.Parse("auto"); + var result = GridLength.Parse("auto", CultureInfo.InvariantCulture); Assert.Equal(GridLength.Auto, result); } @@ -28,7 +29,7 @@ namespace Perspex.Controls.UnitTests [Fact] public void Parse_Should_Parse_Star() { - var result = GridLength.Parse("*"); + var result = GridLength.Parse("*", CultureInfo.InvariantCulture); Assert.Equal(new GridLength(1, GridUnitType.Star), result); } @@ -36,7 +37,7 @@ namespace Perspex.Controls.UnitTests [Fact] public void Parse_Should_Parse_Star_Value() { - var result = GridLength.Parse("2*"); + var result = GridLength.Parse("2*", CultureInfo.InvariantCulture); Assert.Equal(new GridLength(2, GridUnitType.Star), result); } @@ -44,7 +45,7 @@ namespace Perspex.Controls.UnitTests [Fact] public void Parse_Should_Parse_Pixel_Value() { - var result = GridLength.Parse("2"); + var result = GridLength.Parse("2", CultureInfo.InvariantCulture); Assert.Equal(new GridLength(2, GridUnitType.Pixel), result); } @@ -52,13 +53,13 @@ namespace Perspex.Controls.UnitTests [Fact] public void Parse_Should_Throw_FormatException_For_Invalid_String() { - Assert.Throws(() => GridLength.Parse("2x")); + Assert.Throws(() => GridLength.Parse("2x", CultureInfo.InvariantCulture)); } [Fact] public void ParseLengths_Accepts_Comma_Separators() { - var result = GridLength.ParseLengths("*,Auto,2*,4").ToList(); + var result = GridLength.ParseLengths("*,Auto,2*,4", CultureInfo.InvariantCulture).ToList(); Assert.Equal( new[] @@ -74,7 +75,7 @@ namespace Perspex.Controls.UnitTests [Fact] public void ParseLengths_Accepts_Space_Separators() { - var result = GridLength.ParseLengths("* Auto 2* 4").ToList(); + var result = GridLength.ParseLengths("* Auto 2* 4", CultureInfo.InvariantCulture).ToList(); Assert.Equal( new[] diff --git a/Tests/Perspex.SceneGraph.UnitTests/ThicknessTests.cs b/Tests/Perspex.SceneGraph.UnitTests/ThicknessTests.cs index 426c033bc4..5b0839b552 100644 --- a/Tests/Perspex.SceneGraph.UnitTests/ThicknessTests.cs +++ b/Tests/Perspex.SceneGraph.UnitTests/ThicknessTests.cs @@ -1,6 +1,7 @@ // Copyright (c) The Perspex Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. +using System.Globalization; using Xunit; namespace Perspex.SceneGraph.UnitTests.Media @@ -10,7 +11,7 @@ namespace Perspex.SceneGraph.UnitTests.Media [Fact] public void Parse_Parses_Single_Uniform_Size() { - var result = Thickness.Parse("1.2"); + var result = Thickness.Parse("1.2", CultureInfo.InvariantCulture); Assert.Equal(new Thickness(1.2), result); } @@ -18,7 +19,7 @@ namespace Perspex.SceneGraph.UnitTests.Media [Fact] public void Parse_Parses_Horizontal_Vertical() { - var result = Thickness.Parse("1.2,3.4"); + var result = Thickness.Parse("1.2,3.4", CultureInfo.InvariantCulture); Assert.Equal(new Thickness(1.2, 3.4), result); } @@ -26,7 +27,7 @@ namespace Perspex.SceneGraph.UnitTests.Media [Fact] public void Parse_Parses_Left_Top_Right_Bottom() { - var result = Thickness.Parse("1.2, 3.4, 5, 6"); + var result = Thickness.Parse("1.2, 3.4, 5, 6", CultureInfo.InvariantCulture); Assert.Equal(new Thickness(1.2, 3.4, 5, 6), result); } @@ -34,7 +35,7 @@ namespace Perspex.SceneGraph.UnitTests.Media [Fact] public void Parse_Accepts_Spaces() { - var result = Thickness.Parse("1.2 3.4 5 6"); + var result = Thickness.Parse("1.2 3.4 5 6", CultureInfo.InvariantCulture); Assert.Equal(new Thickness(1.2, 3.4, 5, 6), result); } diff --git a/src/Markup/Perspex.Markup.Xaml/Converters/GridLengthTypeConverter.cs b/src/Markup/Perspex.Markup.Xaml/Converters/GridLengthTypeConverter.cs index 731af9465d..fd7b280cdf 100644 --- a/src/Markup/Perspex.Markup.Xaml/Converters/GridLengthTypeConverter.cs +++ b/src/Markup/Perspex.Markup.Xaml/Converters/GridLengthTypeConverter.cs @@ -22,7 +22,7 @@ namespace Perspex.Markup.Xaml.Converters public object ConvertFrom(IXamlTypeConverterContext context, CultureInfo culture, object value) { - return GridLength.Parse((string)value); + return GridLength.Parse((string)value, culture); } public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType) diff --git a/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessTypeConverter.cs b/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessTypeConverter.cs index 1e33525494..b5df4b5d35 100644 --- a/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessTypeConverter.cs +++ b/src/Markup/Perspex.Markup.Xaml/Converters/ThicknessTypeConverter.cs @@ -21,7 +21,7 @@ namespace Perspex.Markup.Xaml.Converters public object ConvertFrom(IXamlTypeConverterContext context, CultureInfo culture, object value) { - return Thickness.Parse((string)value); + return Thickness.Parse((string)value, culture); } public object ConvertTo(IXamlTypeConverterContext context, CultureInfo culture, object value, Type destinationType) diff --git a/src/Perspex.Controls/ColumnDefinitions.cs b/src/Perspex.Controls/ColumnDefinitions.cs index 11437c54ea..3d8ca60181 100644 --- a/src/Perspex.Controls/ColumnDefinitions.cs +++ b/src/Perspex.Controls/ColumnDefinitions.cs @@ -1,6 +1,7 @@ // Copyright (c) The Perspex Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. +using System.Globalization; using System.Linq; using Perspex.Collections; @@ -24,7 +25,7 @@ namespace Perspex.Controls /// A string representation of the column definitions. public ColumnDefinitions(string s) { - AddRange(GridLength.ParseLengths(s).Select(x => new ColumnDefinition(x))); + AddRange(GridLength.ParseLengths(s, CultureInfo.InvariantCulture).Select(x => new ColumnDefinition(x))); } } } \ No newline at end of file diff --git a/src/Perspex.Controls/GridLength.cs b/src/Perspex.Controls/GridLength.cs index a18b6b8f4f..af1aa32d61 100644 --- a/src/Perspex.Controls/GridLength.cs +++ b/src/Perspex.Controls/GridLength.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; namespace Perspex.Controls @@ -178,8 +179,9 @@ namespace Perspex.Controls /// Parses a string to return a . /// /// The string. + /// The current culture. /// The . - public static GridLength Parse(string s) + public static GridLength Parse(string s, CultureInfo culture) { s = s.ToUpperInvariant(); @@ -190,12 +192,12 @@ namespace Perspex.Controls else if (s.EndsWith("*")) { var valueString = s.Substring(0, s.Length - 1).Trim(); - var value = valueString.Length > 0 ? double.Parse(valueString) : 1; + var value = valueString.Length > 0 ? double.Parse(valueString, culture) : 1; return new GridLength(value, GridUnitType.Star); } else { - var value = double.Parse(s); + var value = double.Parse(s, culture); return new GridLength(value, GridUnitType.Pixel); } } @@ -204,10 +206,11 @@ namespace Perspex.Controls /// Parses a string to return a collection of s. /// /// The string. + /// The current culture. /// The . - public static IEnumerable ParseLengths(string s) + public static IEnumerable ParseLengths(string s, CultureInfo culture) { - return s.Split(new[] { ',', ' ' }).Select(x => Parse(x)); + return s.Split(new[] { ',', ' ' }).Select(x => Parse(x, culture)); } } } \ No newline at end of file diff --git a/src/Perspex.Controls/RowDefinitions.cs b/src/Perspex.Controls/RowDefinitions.cs index 6e7d7ba3e1..7ebc6a8fb5 100644 --- a/src/Perspex.Controls/RowDefinitions.cs +++ b/src/Perspex.Controls/RowDefinitions.cs @@ -1,6 +1,7 @@ // Copyright (c) The Perspex Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. +using System.Globalization; using System.Linq; using Perspex.Collections; @@ -24,7 +25,7 @@ namespace Perspex.Controls /// A string representation of the row definitions. public RowDefinitions(string s) { - AddRange(GridLength.ParseLengths(s).Select(x => new RowDefinition(x))); + AddRange(GridLength.ParseLengths(s, CultureInfo.InvariantCulture).Select(x => new RowDefinition(x))); } } } \ No newline at end of file