diff --git a/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/Excel/Cells/XLCell.cs index ac179bb..9e398e2 100644 --- a/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/Excel/Cells/XLCell.cs @@ -241,7 +241,7 @@ var dtTest = (DateTime)Convert.ChangeType(value, typeof (DateTime)); Style.NumberFormat.NumberFormatId = dtTest.Date == dtTest ? 14 : 22; - _cellValue = dtTest.ToOADate().ToString(XLHelper.ParseCulture); + _cellValue = dtTest.ToOADate().ToInvariantString(); } else if ( value is sbyte @@ -266,7 +266,7 @@ else { _dataType = XLCellValues.Number; - _cellValue = ((Double)Convert.ChangeType(value, typeof (Double))).ToString(XLHelper.ParseCulture); + _cellValue = ((Double)Convert.ChangeType(value, typeof (Double))).ToInvariantString(); } } else if (value is Boolean) @@ -813,9 +813,9 @@ DateTime dtTest; double dblTest; if (DateTime.TryParse(_cellValue, out dtTest)) - _cellValue = dtTest.ToOADate().ToString(XLHelper.ParseCulture); + _cellValue = dtTest.ToOADate().ToInvariantString(); else if (Double.TryParse(_cellValue, XLHelper.NumberStyle, XLHelper.ParseCulture, out dblTest)) - _cellValue = dblTest.ToString(XLHelper.ParseCulture); + _cellValue = dblTest.ToInvariantString(); else { throw new ArgumentException( @@ -1621,7 +1621,7 @@ else if (value is DateTime) val = ((DateTime)value).ToString("o"); else if (value is double) - val = ((double)value).ToString(XLHelper.ParseCulture); + val = ((double)value).ToInvariantString(); else val = value.ToString(); _richText = null; @@ -1669,11 +1669,11 @@ DateTime forMillis; if (value is DateTime && (forMillis = (DateTime)value).Millisecond > 0) { - val = forMillis.ToOADate().ToString(XLHelper.ParseCulture); + val = forMillis.ToOADate().ToInvariantString(); } else { - val = dtTest.ToOADate().ToString(XLHelper.ParseCulture); + val = dtTest.ToOADate().ToInvariantString(); } } diff --git a/ClosedXML/Excel/XLWorkbook_Load.cs b/ClosedXML/Excel/XLWorkbook_Load.cs index 58fa9ba..6aa64ab 100644 --- a/ClosedXML/Excel/XLWorkbook_Load.cs +++ b/ClosedXML/Excel/XLWorkbook_Load.cs @@ -950,7 +950,7 @@ else if (cell.DataType == CellValues.Date) { if (!XLHelper.IsNullOrWhiteSpace(cell.CellValue.Text)) - xlCell._cellValue = Double.Parse(cell.CellValue.Text, CultureInfo.InvariantCulture).ToString(XLHelper.ParseCulture); + xlCell._cellValue = Double.Parse(cell.CellValue.Text, CultureInfo.InvariantCulture).ToInvariantString(); xlCell._dataType = XLCellValues.DateTime; } else if (cell.DataType == CellValues.Boolean) @@ -961,7 +961,7 @@ else if (cell.DataType == CellValues.Number) { if (!XLHelper.IsNullOrWhiteSpace(cell.CellValue.Text)) - xlCell._cellValue = Double.Parse(cell.CellValue.Text, CultureInfo.InvariantCulture).ToString(XLHelper.ParseCulture); + xlCell._cellValue = Double.Parse(cell.CellValue.Text, CultureInfo.InvariantCulture).ToInvariantString(); if (s == null) { xlCell._dataType = XLCellValues.Number; @@ -987,7 +987,7 @@ { var numberFormatId = ((CellFormat) (s.CellFormats).ElementAt(styleIndex)).NumberFormatId; if (!XLHelper.IsNullOrWhiteSpace(cell.CellValue.Text)) - xlCell._cellValue = Double.Parse(cell.CellValue.Text, CultureInfo.InvariantCulture).ToString(XLHelper.ParseCulture); + xlCell._cellValue = Double.Parse(cell.CellValue.Text, CultureInfo.InvariantCulture).ToInvariantString(); if (s.NumberingFormats != null && s.NumberingFormats.Any(nf => ((NumberingFormat) nf).NumberFormatId.Value == numberFormatId)) { diff --git a/ClosedXML_Examples/ClosedXML_Examples.csproj b/ClosedXML_Examples/ClosedXML_Examples.csproj index 9cd5941..2d3008d 100644 --- a/ClosedXML_Examples/ClosedXML_Examples.csproj +++ b/ClosedXML_Examples/ClosedXML_Examples.csproj @@ -72,6 +72,7 @@ + diff --git a/ClosedXML_Examples/Creating/CreateFiles.cs b/ClosedXML_Examples/Creating/CreateFiles.cs index 956a13d..2b94f60 100644 --- a/ClosedXML_Examples/Creating/CreateFiles.cs +++ b/ClosedXML_Examples/Creating/CreateFiles.cs @@ -27,6 +27,7 @@ new InsertColumns().Create(Path.Combine(path, "InsertColumns.xlsx")); new ColumnCollection().Create(Path.Combine(path, "ColumnCollection.xlsx")); new DataTypes().Create(Path.Combine(path, "DataTypes.xlsx")); + new DataTypesUnderDifferentCulture().Create(Path.Combine(path, "DataTypesUnderDifferentCulture.xlsx")); new MultipleSheets().Create(Path.Combine(path, "MultipleSheets.xlsx")); new RowCollection().Create(Path.Combine(path, "RowCollection.xlsx")); new DefiningRanges().Create(Path.Combine(path, "DefiningRanges.xlsx")); diff --git a/ClosedXML_Examples/Misc/DataTypesUnderDifferentCulture.cs b/ClosedXML_Examples/Misc/DataTypesUnderDifferentCulture.cs new file mode 100644 index 0000000..4b77144 --- /dev/null +++ b/ClosedXML_Examples/Misc/DataTypesUnderDifferentCulture.cs @@ -0,0 +1,35 @@ +using System; +using ClosedXML.Excel; +using System.Threading; +using System.Globalization; +using System.IO; + +namespace ClosedXML_Examples.Misc +{ + public class DataTypesUnderDifferentCulture : IXLExample + { + public void Create(string filePath) + { + var backupCulture = Thread.CurrentThread.CurrentCulture; + + // Set thread culture to French, which should format numbers using decimal COMMA + Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("fr-FR"); + + string tempFile = ExampleHelper.GetTempFilePath(filePath); + try + { + new DataTypes().Create(tempFile); + var workbook = new XLWorkbook(tempFile); + workbook.SaveAs(filePath); + } + finally + { + Thread.CurrentThread.CurrentCulture = backupCulture; + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + } + } + } +} diff --git a/ClosedXML_Tests/ClosedXML_Tests.csproj b/ClosedXML_Tests/ClosedXML_Tests.csproj index 0d280d1..6b9f310 100644 --- a/ClosedXML_Tests/ClosedXML_Tests.csproj +++ b/ClosedXML_Tests/ClosedXML_Tests.csproj @@ -143,6 +143,7 @@ + diff --git a/ClosedXML_Tests/Examples/MiscTests.cs b/ClosedXML_Tests/Examples/MiscTests.cs index 2433aab..38f7e8e 100644 --- a/ClosedXML_Tests/Examples/MiscTests.cs +++ b/ClosedXML_Tests/Examples/MiscTests.cs @@ -74,6 +74,12 @@ } [Test] + public void DataTypesUnderDifferentCulture() + { + TestHelper.RunTestExample(@"Misc\DataTypesUnderDifferentCulture.xlsx"); + } + + [Test] public void DataValidation() { TestHelper.RunTestExample(@"Misc\DataValidation.xlsx"); diff --git a/ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx b/ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx new file mode 100644 index 0000000..ca68eee --- /dev/null +++ b/ClosedXML_Tests/Resource/Examples/Misc/DataTypesUnderDifferentCulture.xlsx Binary files differ