It is not as difficult as you might think to write a very simple interpreter for this sort of thing, especially if you keep the formulas in the style of FunctionName(Parameter, Parameter2 ...)
. I once did something similar within a day. You could perhaps use a function called CONCATENATE (à la Excel) instead of the + operator to keep it simple.
One approach would be to write a simple language object model with a class for each function you want to support, e.g.:
public abstract class ScriptFunction
{
public abstract string Name { get; }
public abstract int ParameterCount { get; }
public abstract object Execute(params object[] parameters);
}
...then write a recursive Eval function that examines the provided script string, extracts the name and parameters of the function using the brackets as delimiters, looks up which ScriptFunction to call and then calls Execute on it.
The advantage of this approach over dynamic compilation is that you know that the code will only ever be able to do the things you have programmed it to do, whereas with something that compiled the expression to C# code you would have to be careful that the user did not input something catastrophic to the rest of the application.
For a more advanced approach see Regex for matching Functions and Capturing their Arguments