I have to manage a particular string formatting/padding condition. To be short I need to pad a string argument only if the argument length is 0. If I use the typical aligment parameter the padding is made if the length of the argument is smaller then the provided alignment value. For example:
string format = "#{0,10}#";
string argument;
string output;
argument = Console.ReadLine();
output = String.Format(format, argument);
String.WriteLine(output);
If I enter "try" as a value I got this result:
#try #
If I enter "trytrytrytry" I got:
#trytrytrytry#
What I would like to happen is depicted below: Entering "" I would like to have:
# #
but entering "try" I would like to have:
#try#
The code I'm going to write should be as much generic as possibile since the format parameter is not static and is defined at runtime.
The best practice to do this is to define a custom string formatter. Unluckly it seems that the customization code can only act on the 'format' portion of the format parameter of the String.Format() method.
Indeed If I define a custom formatter:
public class EmptyFormatter : IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return this;
else
return null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (!this.Equals(formatProvider))
return null;
if (string.IsNullOrEmpty(format))
throw new ArgumentNullException();
return numericString;
}
}
The format and arg parameters of the Format method didn't contain the alignment parameter then I cannot actually check what lenght of the padding value should be applied and therefore I cannot act properly. Moreover this part of the 'formatting' of the string seems to be applied somewhere else but I have not idea where.
Is there a way to 'alter' this behaviour ?
""produce 11 spaces?argfor String.Empty you can output 11 spaces else you handle the default.arg? Why a custom formatter for this and not just use anifstatement?