62 lines
1.7 KiB
C#
62 lines
1.7 KiB
C#
|
|
using System.Text.Json;
|
||
|
|
|
||
|
|
namespace S8n.Components.Basics;
|
||
|
|
|
||
|
|
public class Calculator
|
||
|
|
{
|
||
|
|
public object Calc(string @operator, object[] args)
|
||
|
|
{
|
||
|
|
if (args == null || args.Length < 2)
|
||
|
|
{
|
||
|
|
throw new ArgumentException("At least two arguments are required");
|
||
|
|
}
|
||
|
|
|
||
|
|
// Convert arguments to decimal for precision, handling JsonElement
|
||
|
|
var numbers = args.Select(a =>
|
||
|
|
{
|
||
|
|
if (a is JsonElement jsonElement)
|
||
|
|
{
|
||
|
|
return jsonElement.GetDecimal();
|
||
|
|
}
|
||
|
|
return Convert.ToDecimal(a);
|
||
|
|
}).ToArray();
|
||
|
|
decimal result = 0;
|
||
|
|
|
||
|
|
switch (@operator?.ToLower())
|
||
|
|
{
|
||
|
|
case "add":
|
||
|
|
result = numbers.Sum();
|
||
|
|
break;
|
||
|
|
case "subtract":
|
||
|
|
result = numbers[0];
|
||
|
|
for (int i = 1; i < numbers.Length; i++)
|
||
|
|
{
|
||
|
|
result -= numbers[i];
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case "multiply":
|
||
|
|
result = numbers[0];
|
||
|
|
for (int i = 1; i < numbers.Length; i++)
|
||
|
|
{
|
||
|
|
result *= numbers[i];
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
case "divide":
|
||
|
|
result = numbers[0];
|
||
|
|
for (int i = 1; i < numbers.Length; i++)
|
||
|
|
{
|
||
|
|
if (numbers[i] == 0)
|
||
|
|
{
|
||
|
|
throw new DivideByZeroException("Division by zero is not allowed");
|
||
|
|
}
|
||
|
|
result /= numbers[i];
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
throw new ArgumentException($"Unknown operator: {@operator}");
|
||
|
|
}
|
||
|
|
|
||
|
|
return new { Result = result };
|
||
|
|
}
|
||
|
|
}
|