How to align dot in currency while printing

533 views Asked by At

I have something like this:

    Public Function ItemsToBePrinted()
    Dim p_dt As DataTable = Model_Query(2)
    Dim p_str As String = ""
    Dim StringToPrint As String = ""

    For Each drow As DataRow In p_dt.Rows
        Dim str_itemName As New String(drow.Item("item_name").ToString)
        Dim str_itemQty As New String(drow.Item("item_qty").ToString)
        Dim str_itemUnitPrice As New String(drow.Item("item_unitprice").ToString)
        Dim str_itemDisc As New String(drow.Item("item_disamt").ToString)
        Dim str_itemTotalAmt As New String(drow.Item("item_totamt").ToString)
        Dim lineLen1 As String = str_itemName.Length
        Dim lineLen2 As String = str_itemQty.Length
        Dim lineLen3 As String = str_itemUnitPrice.Length
        Dim lineLen4 As String = str_itemDisc.Length
        Dim spcLen1 As New String(" "c, 20 - lineLen1)
        Dim spcLen2 As New String(" "c, 5 - lineLen2)
        Dim spcLen3 As New String(" "c, 5 - lineLen3)
        Dim spcLen4 As New String(" "c, 8 - lineLen4)
        If drow.Item("item_disamt") = 0 Then
            StringToPrint = $"{str_itemName}{spcLen1}{str_itemQty}{spcLen2}{str_itemUnitPrice}{spcLen3}{spcLen4}{str_itemTotalAmt}"
        Else
            StringToPrint = $"{str_itemName}{spcLen1}{str_itemQty}{spcLen2}{str_itemUnitPrice}{spcLen3}{str_itemDisc}{spcLen4}{str_itemTotalAmt}"
        End If

        p_str &= StringToPrint & Environment.NewLine
    Next

    Return p_str
End Function

    Public Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    Dim p_font As Font = New Font("Consolas", 10)

    e.Graphics.DrawString(PrintItemHeader(), p_font, Brushes.Black, 2 * 8, 305)
    e.Graphics.DrawLine(p_pen, 16, 340, 350, 340)
    e.Graphics.DrawString(ItemsToBePrinted(), p_font, Brushes.Black, 2 * 8, 345)

Currently Im using the spcLen to count the space to make them align to left but I have no idea how to change alignment to right...

Here is the output:

output

How can I align the dot like this? All the data will align to right except Item Code

Item Code           Qty   Unit   Disc   Amount
                         Price
----------------------------------------------
XXXX                 33   4.70          155.10
XXXX                  2   3.00            6.00
XXXX                  2   9.00   1.80    16.20
XXXX                  1   7.50            7.50
XXXX                 11  12.00  10.00   122.00
2

There are 2 answers

0
Steve On BEST ANSWER

When you have to print the numeric columns you should put the spaces before the number and not after it because you want them aligned on the right

I would write a simple method that aligns your columns data on the right or on the left according to the space and the alignment required.

Function AlignText(text As String, TotalSpace As Integer, AlignRight As Boolean)

    Dim alignResult As String

    if string.IsNullOrEmpty Then
       alignResult = new String(" "c, TotalSpace)
    Else
        if text.Length > TotalSpace Then
            text = text.SubString(0, TotalSpace)
        End If
        If AlignRight Then
            alignResult = New String(" "c, TotalSpace - text.Length) & text
        Else
            alignResult = text & New String(" "c, TotalSpace - text.Length)
        End If
    End If
    Return alignResult
End Function

Now you can call this method in this way

Dim str_itemName = AlignText(drow.Item("item_name").ToString, 20, False)
Dim str_itemQty = AlignText(drow.Item("item_qty").ToString, 3, True)
Dim str_itemUnitPrice = AlignText(drow.Item("item_unitprice").ToString, 10, True)
Dim str_itemDisc = AlignText(drow.Item("item_disamt").ToString), 10, True)
Dim str_itemTotalAmt = AlignText(drow.Item("item_totamt").ToString), 10, True)

Of course you should remove all your space's calcs inside the loop and this coding will also remove the need of an If to skip the missing discount field

0
minimalist On

You should format your string using the String.Format function which allows you to create useful string representation when printing. Check out these 2 links:

https://www.dotnetperls.com/format-vbnet https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx