如何在打印时对齐货币点

时间:2016-12-29 08:59:32

标签: vb.net printing alignment drawstring

我有这样的事情:

    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)

目前我正在使用spcLen计算空间以使它们对齐到左边,但我不知道如何将对齐方式改为右边...

这是输出:

output

如何像这样对齐点?除项目代码

外,所有数据都将对齐
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 个答案:

答案 0 :(得分:1)

当您必须打印数字列时,您应该将空格放在数字之前而不是之后,因为您希望它们在右边对齐

我会编写一个简单的方法,根据所需的空间和对齐方式,在右侧或左侧对齐列数据。

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

现在你可以用这种方式调用这个方法

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)

当然你应该删除循环中所有空间的计算,这个编码也将不再需要If跳过丢失的折扣字段

答案 1 :(得分:0)

您应该使用String.Format函数格式化字符串,该函数允许您在打印时创建有用的字符串表示。看看这两个链接:

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