diff --git a/base/src/expressions/parser/static_analysis.rs b/base/src/expressions/parser/static_analysis.rs index 50e9d82..c198a47 100644 --- a/base/src/expressions/parser/static_analysis.rs +++ b/base/src/expressions/parser/static_analysis.rs @@ -846,6 +846,8 @@ fn get_function_args_signature(kind: &Function, arg_count: usize) -> Vec args_signature_scalars(arg_count, 1, 0), Function::Factdouble => args_signature_scalars(arg_count, 1, 0), Function::Sign => args_signature_scalars(arg_count, 1, 0), + Function::Radians => args_signature_scalars(arg_count, 1, 0), + Function::Degrees => args_signature_scalars(arg_count, 1, 0), } } @@ -1080,5 +1082,7 @@ fn static_analysis_on_function(kind: &Function, args: &[Node]) -> StaticResult { Function::Fact => scalar_arguments(args), Function::Factdouble => scalar_arguments(args), Function::Sign => scalar_arguments(args), + Function::Radians => scalar_arguments(args), + Function::Degrees => scalar_arguments(args), } } diff --git a/base/src/functions/mathematical.rs b/base/src/functions/mathematical.rs index 549d9c6..6fee9c1 100644 --- a/base/src/functions/mathematical.rs +++ b/base/src/functions/mathematical.rs @@ -485,6 +485,8 @@ impl Model { Ok(acc) }); single_number_fn!(fn_sign, |f| Ok(f64::signum(f))); + single_number_fn!(fn_degrees, |f| Ok(f * (180.0 / PI))); + single_number_fn!(fn_radians, |f| Ok(f * (PI / 180.0))); pub(crate) fn fn_pi(&mut self, args: &[Node], cell: CellReferenceIndex) -> CalcResult { if !args.is_empty() { diff --git a/base/src/functions/mod.rs b/base/src/functions/mod.rs index fcc5f9f..79e3432 100644 --- a/base/src/functions/mod.rs +++ b/base/src/functions/mod.rs @@ -90,6 +90,9 @@ pub enum Function { Factdouble, Sign, + Radians, + Degrees, + // Information ErrorType, Formulatext, @@ -283,7 +286,7 @@ pub enum Function { } impl Function { - pub fn into_iter() -> IntoIter { + pub fn into_iter() -> IntoIter { [ Function::And, Function::False, @@ -334,6 +337,8 @@ impl Function { Function::Product, Function::Rand, Function::Randbetween, + Function::Radians, + Function::Degrees, Function::Round, Function::Rounddown, Function::Roundup, @@ -607,6 +612,9 @@ impl Function { "EXP" => Some(Function::Exp), "SIGN" => Some(Function::Sign), + "RADIANS" => Some(Function::Radians), + "DEGREES" => Some(Function::Degrees), + "PI" => Some(Function::Pi), "ABS" => Some(Function::Abs), "SQRT" => Some(Function::Sqrt), @@ -1051,6 +1059,8 @@ impl fmt::Display for Function { Function::Fact => write!(f, "FACT"), Function::Factdouble => write!(f, "FACTDOUBLE"), Function::Sign => write!(f, "SIGN"), + Function::Radians => write!(f, "RADIANS"), + Function::Degrees => write!(f, "DEGREES"), } } } @@ -1306,6 +1316,8 @@ impl Model { Function::Fact => self.fn_fact(args, cell), Function::Factdouble => self.fn_factdouble(args, cell), Function::Sign => self.fn_sign(args, cell), + Function::Radians => self.fn_radians(args, cell), + Function::Degrees => self.fn_degrees(args, cell), } } } diff --git a/xlsx/tests/calc_tests/RADIANS_DEGREES.xlsx b/xlsx/tests/calc_tests/RADIANS_DEGREES.xlsx new file mode 100644 index 0000000..6c8ac84 Binary files /dev/null and b/xlsx/tests/calc_tests/RADIANS_DEGREES.xlsx differ