The ToString method has a number of overloaded versions that can be used to apply a custom format. As we have already seen the simple ToString() method returns a string formatted as (real,imaginary).
The ToString(string) method will apply a standard format string to the two double precision values that make up the number. You can look up "Standard Numeric Format Strings" in the documentation. For example:
Complex z = Complex.Exp( Complex.ImaginaryOne * Math.PI); Console.WriteLine(z.ToString("F3"));
That is two fixed point values with 3 digits after the decimal point. You can only use format specifiers that apply to Double.
The methods ToString(IFormatProvider) and ToString(string,IFormatProvider) will format the number using the culture specified by the IFormatProvider and in the second case will also format the doubles using the format string.
Console.WriteLine( z.ToString( new CultureInfo("es-ES"))); Console.WriteLine( z.ToString("F3",new CultureInfo("es-ES")));
(-1, 1,22460635382238E-16) (-1,000, 0,000)
Note: es-ES is the specifier for Spanish and Spain.
The documentation contains an example of building a custom formatter that can be used to print values in the form a+ib or a+jb. However because you can't inherit from a struct and even adding extension methods is difficult trying to extend Complex in any reasonably object-oriented way is doomed to fail.
If you would like to see an example of Complex in use then see:
Delegates are C#'s original way of allowing you to work with functions as if they were first class objects. The aim may be simple but the need to define a type and then an instance of the type can be [ ... ]
Passing parameters is easy as it always works in the same way, but the effects aren't always the same. It can be confusing and even error prone unless you understand how it all works. So does C# pass [ ... ]