2016-12-29 42 views
0

我有這樣的事情:如何對齊貨幣的點在打印過程中

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 
+0

@Steve我覺得Consolas是一個固定寬度的字體? http://graphicdesign.stackexchange.com/questions/13148/which-fonts-have-the-same-width-for-every-character – vbnewbie

+0

正確,我沒有看到字體聲明 – Steve

回答

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) 

當然,你應該刪除循環內所有空間的Calcs(計算)和該編碼也將刪除需要的。如果跳過失蹤折扣字段

+0

謝謝,它的工作! – vbnewbie