0) You need to use a non-proportional font.
1) You nee to write code that will format your outputted strings to the desired width.
2) I would think seriously about truncating names to a maximum size so that you don't get multiple lines for a single line item. This would greatly simplify the code.
3) Here's some rough and untested code for you to start with:
public string FormatLineItem(int lineType, int linewidth, int quantity, string name, double amount)
{
int qtyWidth = 3;
int amtWidth = 5;
int nameWidth = linewidth - (qtyWidth + amtWidth);
string result = string.Empty;
switch (lineType)
{
case 1 :
{
result = string.Format("{0:#0}x {1} {2:##.#0}", quantity, name.PadRight(nameWidth), amount);
}
break;
case 2 :
{
result = string.Format("QTY {0} AMOUNT", name.PadRight(nameWidth));
}
break;
case 3 :
{
result = string.Format("{0:##.#0"}, amount).PadLeft(linewidth-amtWidth));
}
break;
}
return result;
}