diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs index af33d8b..a0edb8e 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs @@ -49,11 +49,11 @@ ce.RegisterFunction("PI", 0, Pi); ce.RegisterFunction("POWER", 2, Power); ce.RegisterFunction("PRODUCT", 1, 255, Product); - //ce.RegisterFunction("QUOTIENT", Quotient, 1); - //ce.RegisterFunction("RADIANS", Radians, 1); + ce.RegisterFunction("QUOTIENT", 2, Quotient); + ce.RegisterFunction("RADIANS", 1, Radians); ce.RegisterFunction("RAND", 0, Rand); ce.RegisterFunction("RANDBETWEEN", 2, RandBetween); - //ce.RegisterFunction("ROMAN", Roman, 1); + ce.RegisterFunction("ROMAN", 1, 2, Roman); //ce.RegisterFunction("ROUND", Round, 1); //ce.RegisterFunction("ROUNDDOWN", RoundDown, 1); //ce.RegisterFunction("ROUNDUP", RoundUp, 1); @@ -503,5 +503,30 @@ p.ForEach(v => total *= v); return total; } + + private static object Quotient(List p) + { + Double n = p[0]; + Double k = p[1]; + + return (int)(n / k); + } + + private static object Radians(List p) + { + return p[0] * Math.PI / 180.0; + } + + private static object Roman(List p) + { + Int32 intTemp; + Boolean boolTemp; + if (p.Count == 1 + || (Boolean.TryParse(p[1].ToString(), out boolTemp) && boolTemp) + || (Int32.TryParse(p[1].ToString(), out intTemp) && intTemp == 1)) + return XLMath.ToRoman((int)p[0]); + + throw new ArgumentException("Can only support classic roman types."); + } } } \ No newline at end of file diff --git a/ClosedXML/ClosedXML/ClosedXML/Excel/CalcEngine/Functions/XLMath.cs b/ClosedXML/ClosedXML/ClosedXML/Excel/CalcEngine/Functions/XLMath.cs index 9a3856c..63c052c 100644 --- a/ClosedXML/ClosedXML/ClosedXML/Excel/CalcEngine/Functions/XLMath.cs +++ b/ClosedXML/ClosedXML/ClosedXML/Excel/CalcEngine/Functions/XLMath.cs @@ -97,5 +97,26 @@ { return Math.Abs(value % 2) > XLHelper.Epsilon; } + + public static string ToRoman(int number) + { + if ((number < 0) || (number > 3999)) throw new ArgumentOutOfRangeException("insert value betwheen 1 and 3999"); + if (number < 1) return string.Empty; + if (number >= 1000) return "M" + ToRoman(number - 1000); + if (number >= 900) return "CM" + ToRoman(number - 900); + if (number >= 500) return "D" + ToRoman(number - 500); + if (number >= 400) return "CD" + ToRoman(number - 400); + if (number >= 100) return "C" + ToRoman(number - 100); + if (number >= 90) return "XC" + ToRoman(number - 90); + if (number >= 50) return "L" + ToRoman(number - 50); + if (number >= 40) return "XL" + ToRoman(number - 40); + if (number >= 10) return "X" + ToRoman(number - 10); + if (number >= 9) return "IX" + ToRoman(number - 9); + if (number >= 5) return "V" + ToRoman(number - 5); + if (number >= 4) return "IV" + ToRoman(number - 4); + if (number >= 1) return "I" + ToRoman(number - 1); + throw new ArgumentOutOfRangeException("something bad happened"); + } + } } diff --git a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/CalcEngine/FunctionsTests.cs b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/CalcEngine/FunctionsTests.cs index f547b9f..1e1970e 100644 --- a/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/CalcEngine/FunctionsTests.cs +++ b/ClosedXML/ClosedXML/ClosedXML_Tests/Excel/CalcEngine/FunctionsTests.cs @@ -175,5 +175,38 @@ var actual = XLWorkbook.EvaluateExpr("Product(2,3,4)"); Assert.AreEqual(24.0, actual); } + + [TestMethod] + public void Quotient() + { + var actual = XLWorkbook.EvaluateExpr("Quotient(5,2)"); + Assert.AreEqual(2, actual); + + actual = XLWorkbook.EvaluateExpr("Quotient(4.5,3.1)"); + Assert.AreEqual(1, actual); + + actual = XLWorkbook.EvaluateExpr("Quotient(-10,3)"); + Assert.AreEqual(-3, actual); + } + + [TestMethod] + public void Radians() + { + var actual = XLWorkbook.EvaluateExpr("Radians(270)"); + Assert.IsTrue(Math.Abs(4.71238898038469 - (double)actual) < XLHelper.Epsilon); + } + + [TestMethod] + public void Roman() + { + var actual = XLWorkbook.EvaluateExpr("Roman(3046)"); + Assert.AreEqual("MMMXLVI", actual); + + actual = XLWorkbook.EvaluateExpr("Roman(270)"); + Assert.AreEqual("CCLXX", actual); + + actual = XLWorkbook.EvaluateExpr("Roman(3999)"); + Assert.AreEqual("MMMCMXCIX", actual); + } } }