From 85ef06d300b73f93cb76269a9259c0e47b4d17a1 Mon Sep 17 00:00:00 2001
From: Naveen Albert <asterisk@phreaknet.org>
Date: Mon, 28 Jun 2021 14:25:24 +0000
Subject: [PATCH] func_math: Return integer instead of float if possible

The MIN, MAX, and ABS functions all support float
arguments, but currently return floats even if the
arguments are all integers and the response is
a whole number, in which case the user is likely
expecting an integer. This casts the float to an integer
before printing into the response buffer if possible.

ASTERISK-29495

Change-Id: I902d29eacf3ecd0f8a6a5e433c97f0421d205488
---
 funcs/func_math.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/funcs/func_math.c b/funcs/func_math.c
index b8a6eb6fde..76d1a745fe 100644
--- a/funcs/func_math.c
+++ b/funcs/func_math.c
@@ -525,7 +525,11 @@ static int acf_min_exec(struct ast_channel *chan, const char *cmd,
 	}
 
 	ast_debug(1, "%f is the minimum of [%f,%f]\n", response_num, num1, num2);
-	snprintf(buffer, buflen, "%f", response_num);
+	if ((int) response_num == response_num) {
+		snprintf(buffer, buflen, "%d", (int) response_num);
+	} else {
+		snprintf(buffer, buflen, "%f", response_num);
+	}
 
 	return 0;
 }
@@ -567,7 +571,11 @@ static int acf_max_exec(struct ast_channel *chan, const char *cmd,
 	}
 
 	ast_debug(1, "%f is the maximum of [%f,%f]\n", response_num, num1, num2);
-	snprintf(buffer, buflen, "%f", response_num);
+	if ((int) response_num == response_num) {
+		snprintf(buffer, buflen, "%d", (int) response_num);
+	} else {
+		snprintf(buffer, buflen, "%f", response_num);
+	}
 
 	return 0;
 }
@@ -589,7 +597,11 @@ static int acf_abs_exec(struct ast_channel *chan, const char *cmd,
 
 	response_num = fabs(num1);
 	ast_debug(1, "%f is the absolute value of %f\n", response_num, num1);
-	snprintf(buffer, buflen, "%f", response_num);
+	if ((int) response_num == response_num) {
+		snprintf(buffer, buflen, "%d", (int) response_num);
+	} else {
+		snprintf(buffer, buflen, "%f", response_num);
+	}
 
 	return 0;
 }
-- 
GitLab