Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions src/EPPlus/FormulaParsing/Excel/Functions/Text/NumberValue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ Date Author Change
*************************************************************************************************
01/27/2020 EPPlus Software AB Initial release EPPlus 5
*************************************************************************************************/
using OfficeOpenXml.FormulaParsing.Excel.Functions.Finance.Implementations;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Metadata;
using OfficeOpenXml.FormulaParsing.FormulaExpressions;
using System;
Expand Down Expand Up @@ -49,9 +50,16 @@ public override CompileResult Execute(IList<FunctionArgument> arguments, Parsing
return CreateResult(ExcelErrorValue.Values.Value, DataType.ExcelError);
}
var cultureInfo = new CultureInfo("en-US", true);
cultureInfo.NumberFormat.NumberDecimalSeparator = _decimalSeparator;
cultureInfo.NumberFormat.NumberGroupSeparator = _groupSeparator;
if(double.TryParse(_arg, NumberStyles.Any, cultureInfo, out double result))
cultureInfo.NumberFormat.NumberDecimalSeparator = _decimalSeparator;

//These are required. double.TryParse with NumberStyles.Any considers the input string a currency
//See s1018
cultureInfo.NumberFormat.CurrencyDecimalSeparator = _decimalSeparator;
cultureInfo.NumberFormat.CurrencyGroupSeparator = _groupSeparator;


if (double.TryParse(_arg, NumberStyles.Any, cultureInfo, out double result))
{
if(_nPercentage > 0)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,46 @@ public void NumberValueShouldCastDecinalValueWithCurrentCulture()
Thread.CurrentThread.CurrentCulture = currentCulture;
}

[TestMethod]
public void NumberValueDifferingFromCurrentCultureOrUsCultureShouldStillWork()
{
var currentCulture = CultureInfo.CurrentCulture;
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
var input = $"1{"."}000{","}15";
var func = new NumberValue();

var args = FunctionsHelper.CreateArgs(input, ",",".");
var result2 = func.Execute(args, _parsingContext);
Assert.AreEqual(1000.15d, result2.Result);
Thread.CurrentThread.CurrentCulture = currentCulture;
}

[TestMethod]
public void NumberValueInternalLogicCurrencyAndDoubleParse()
{
//This logic is used to make
var cultureInfo = new CultureInfo("en-US", true);
cultureInfo.NumberFormat.NumberGroupSeparator = ".";
cultureInfo.NumberFormat.NumberDecimalSeparator = ",";

var input = $"1{"."}000{","}15";

//Using NumberStyles.Any will consider this as a currency and fail to parse
var successFirst = double.TryParse(input, NumberStyles.Any, cultureInfo, out double result);

Assert.IsFalse(successFirst);
Assert.AreNotEqual(1000.15, result);

cultureInfo.NumberFormat.CurrencyGroupSeparator = ".";
cultureInfo.NumberFormat.CurrencyDecimalSeparator = ",";

//Setting the currency causes it to work correctly
var successSecond = double.TryParse(input, NumberStyles.Any, cultureInfo, out double currencyResult);

Assert.IsTrue(successSecond);
Assert.AreEqual(1000.15, currencyResult);
}

[TestMethod]
public void NumberValueShouldCastDecinalValueWithSeparators()
{
Expand Down
26 changes: 26 additions & 0 deletions src/EPPlusTest/Issues/FormulaCalculationIssues.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1472,6 +1472,32 @@ public void s965_3()

SaveAndCleanup(package);
}

[TestMethod]
public void s1018()
{
SwitchToCulture("fi-FI");
using (var package = OpenPackage("testValueAndNumberValue.xlsx", true))
{
var ws = package.Workbook.Worksheets.Add("Calculation");
ws.Cells["A2"].Value = "-9.388.757,91";
ws.Cells["C2"].Formula = "NUMBERVALUE(A2,\",\",\".\")";

package.Workbook.CalcMode = ExcelCalcMode.Automatic;
var options = new OfficeOpenXml.FormulaParsing.ExcelCalculationOption
{
PrecisionAndRoundingStrategy = OfficeOpenXml.FormulaParsing.PrecisionAndRoundingStrategy.Excel,
AllowCircularReferences = true,
EnableUnicodeAwareStringOperations = true

};
package.Workbook.Calculate(options);

Assert.AreEqual(-9388757.91, ws.Cells["C2"].Value);
}
SwitchBackToCurrentCulture();
}

}
}