2024年7月18日 星期四

21.VB.NET 筆記 基礎篇 - 整數 (Integer)

VB.NET 整數(Integer)筆記(基礎篇)

VB.NET 整數(Integer) 筆記(基礎篇)

Integer 是 VB.NET 中最常用的整數型別,適合保存沒有小數的數量,例如件數、頁數、次數、索引、庫存、分數與計算結果。

整數的重點不只是能加減乘除,還包含範圍限制、整除與餘數、使用者輸入轉型、除以 0 檢查,以及運算結果是否可能超出型別可保存範圍。只要資料來自 TextBox,通常就應先用 Integer.TryParse 驗證,再進行後續計算。

先理解 Integer 的用途與範圍

Integer:32 位元有號整數型別,可保存沒有小數的正數、負數與 0。可用範圍是 -2,147,483,6482,147,483,647

Integer 適合表示沒有小數的資料

  • 數量:份數、頁數、箱數、張數。
  • 計數:完成筆數、重試次數、排序位置。
  • 索引:陣列位置、清單位置、目前第幾筆。
  • 差額:庫存增減、剩餘數量、超出數量。
型別 範圍 適合情境
Short -32,768 到 32,767 很小範圍的整數資料。
Integer -2,147,483,648 到 2,147,483,647 一般整數計算最常用。
Long 比 Integer 更大的整數範圍。 大型編號、累計量或可能很大的數值。

基本宣告

VB.NET
Dim copyCount As Integer = 25
Dim retryCount As Integer = 0
Dim differenceValue As Integer = -3
Dim maxValue As Integer = Integer.MaxValue

算術運算、整除與餘數

場景一:手作材料包分裝

這個範例用材料包分裝來示範整數加減、整除與餘數。若每盒放 6 份材料,整除可算出完整盒數,Mod 可算出剩下幾份。

需要的主控項
  • TextBoxPackCount:輸入材料份數。
  • ButtonPack:計算分裝結果。
  • LabelPackResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonPack_Click(sender As Object, e As EventArgs) Handles ButtonPack.Click
        Dim totalPacks As Integer

        If Not Integer.TryParse(TextBoxPackCount.Text.Trim(), totalPacks) OrElse totalPacks < 0 Then
            LabelPackResult.Text = "請輸入 0 以上的材料份數"
            Return
        End If

        Dim perBox As Integer = 6
        Dim fullBoxCount As Integer = totalPacks \ perBox
        Dim leftoverCount As Integer = totalPacks Mod perBox

        LabelPackResult.Text = "完整盒數:" & fullBoxCount.ToString() & vbCrLf &
                               "剩餘份數:" & leftoverCount.ToString()
    End Sub
End Class
畫面輸出結果(TextBoxPackCount = 29)
完整盒數:4 剩餘份數:5
邏輯解析
  • \ 是整數除法,只取整數商。
  • Mod 會取得餘數,適合分組、輪替與檢查倍數。
  • 份數沒有小數,因此適合使用 Integer
運算子 用途 範例
+ 加法。 8 + 3 = 11
- 減法。 8 - 3 = 5
* 乘法。 8 * 3 = 24
\ 整數除法。 8 \ 3 = 2
Mod 取得餘數。 8 Mod 3 = 2

比較判斷與門檻檢查

場景二:飲水機杯架補杯提醒

整數常用來判斷數量是否低於門檻。這個範例用目前杯數與安全杯數比較,決定是否顯示補杯提醒。

需要的主控項
  • TextBoxCupCount:輸入目前杯數。
  • ButtonCheckCup:檢查杯數。
  • LabelCupResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonCheckCup_Click(sender As Object, e As EventArgs) Handles ButtonCheckCup.Click
        Dim cupCount As Integer

        If Not Integer.TryParse(TextBoxCupCount.Text.Trim(), cupCount) OrElse cupCount < 0 Then
            LabelCupResult.Text = "請輸入正確杯數"
            Return
        End If

        Dim safeLevel As Integer = 20

        If cupCount < safeLevel Then
            LabelCupResult.Text = "杯數不足,請補杯"
        ElseIf cupCount = safeLevel Then
            LabelCupResult.Text = "杯數剛好達到安全量"
        Else
            LabelCupResult.Text = "杯數充足"
        End If
    End Sub
End Class
畫面輸出結果(TextBoxCupCount = 14)
杯數不足,請補杯
邏輯解析
  • 比較運算結果會形成 Boolean,再交給 If 判斷流程。
  • <=> 適合處理門檻、上下限與分級判斷。
  • 輸入先驗證,再比較,避免非數字內容進入流程。

TryParse:把文字安全轉成整數

表單輸入本質是文字。 TextBox.Text 取得的是 String,即使看起來像數字,也必須先轉成 Integer 才能進行整數運算。

場景三:候補號碼輸入檢查

使用者輸入可能是空白、中文字、符號或超出整數範圍的內容。Integer.TryParse 能在轉換失敗時回傳 False,避免程式直接中斷。

需要的主控項
  • TextBoxWaitingNo:輸入候補號碼。
  • ButtonReadWaitingNo:讀取號碼。
  • LabelWaitingResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonReadWaitingNo_Click(sender As Object, e As EventArgs) Handles ButtonReadWaitingNo.Click
        Dim waitingNo As Integer
        Dim sourceText As String = TextBoxWaitingNo.Text.Trim()

        If Not Integer.TryParse(sourceText, waitingNo) Then
            LabelWaitingResult.Text = "候補號碼必須是整數"
            Return
        End If

        If waitingNo <= 0 Then
            LabelWaitingResult.Text = "候補號碼必須大於 0"
            Return
        End If

        LabelWaitingResult.Text = "候補號碼:" & waitingNo.ToString("000")
    End Sub
End Class
畫面輸出結果(TextBoxWaitingNo = 7)
候補號碼:007
邏輯解析
  • Integer.TryParse 轉換成功時會回傳 True
  • 轉換成功後,再檢查是否大於 0。
  • ToString("000") 可把整數顯示成三位數格式。
方法 特性 適合情境
Integer.TryParse 成功或失敗用 True / False 表示。 使用者輸入、外部資料。
Integer.Parse 格式錯誤會拋出例外。 已確定格式正確的資料。
CInt 可把多種數值或文字轉成整數。 來源可信,且已掌握轉換規則。

CInt 與小數轉整數

場景四:評分平均轉成整數分

CInt 可以把數值轉成整數,但它不是單純刪掉小數。若要處理小數轉整數,必須清楚轉換規則,避免評分或金額結果和預期不同。

需要的主控項
  • ButtonConvertScore:轉換平均分數。
  • LabelScoreResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonConvertScore_Click(sender As Object, e As EventArgs) Handles ButtonConvertScore.Click
        Dim averageScore As Decimal = 82.6D
        Dim roundedScore As Integer = CInt(averageScore)

        LabelScoreResult.Text = "平均分數:" & averageScore.ToString("N1") & vbCrLf &
                                "整數分數:" & roundedScore.ToString()
    End Sub
End Class
畫面輸出結果(LabelScoreResult.Text)
平均分數:82.6 整數分數:83
邏輯解析
  • CInt(82.6D) 會轉成 83
  • CInt 不適合用來表達「一律無條件捨去」。
  • 若需要明確無條件捨去、無條件進位或四捨五入,應使用對應的數學方法,讓意圖更清楚。

溢位與安全運算

Integer 常見風險

  • 超出範圍:運算結果可能大於 Integer.MaxValue 或小於 Integer.MinValue
  • 除以 0:整除或取餘時,除數不能是 0。
  • 輸入未驗證:TextBox 內容不能直接當整數使用。
  • 把金額小數用 Integer:金額與精確小數通常應使用 Decimal

場景五:大型資料筆數加總

若加總結果可能超過 Integer 範圍,應使用 Long 承接結果。這個範例用兩批資料筆數相加,示範為什麼大型累計不一定適合直接用 Integer。

需要的主控項
  • ButtonSumRows:計算資料筆數。
  • LabelRowsResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub ButtonSumRows_Click(sender As Object, e As EventArgs) Handles ButtonSumRows.Click
        Dim firstFileRows As Integer = 1500000000
        Dim secondFileRows As Integer = 900000000

        Dim totalRows As Long = CLng(firstFileRows) + CLng(secondFileRows)

        LabelRowsResult.Text = "總筆數:" & totalRows.ToString("N0")
    End Sub
End Class
畫面輸出結果(LabelRowsResult.Text)
總筆數:2,400,000,000
邏輯解析
  • 2,400,000,000 已超過 Integer.MaxValue
  • 先用 CLng 轉成 Long 後再相加,可讓結果由較大範圍型別承接。
  • 大型累計、流水號或資料量統計,應先評估是否需要 Long

位元旗標:多個開關集中保存

場景六:文件審核功能權限

整數可以透過位元運算保存多個開關狀態。每個權限使用 1、2、4、8 這類值,透過 Or 組合,透過 And 檢查。

需要的主控項
  • ButtonCheckRight:檢查權限。
  • LabelRightResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Const RightView As Integer = 1
    Private Const RightApprove As Integer = 2
    Private Const RightArchive As Integer = 4

    Private Sub ButtonCheckRight_Click(sender As Object, e As EventArgs) Handles ButtonCheckRight.Click
        Dim currentRights As Integer = RightView Or RightArchive
        Dim canArchive As Boolean = (currentRights And RightArchive) = RightArchive

        If canArchive Then
            LabelRightResult.Text = "權限檢查:可封存文件"
        Else
            LabelRightResult.Text = "權限檢查:不可封存文件"
        End If
    End Sub
End Class
畫面輸出結果(LabelRightResult.Text)
權限檢查:可封存文件
邏輯解析
  • Or 用來把多個旗標組合在同一個整數中。
  • And 用來檢查指定旗標是否存在。
  • 若旗標會成為正式資料模型,通常可改用 <Flags> Enum 讓語意更清楚。

綜合應用:簡易整數計算

場景七:桌遊點數計算器

這個範例整合輸入驗證、運算符號判斷與除數檢查。整數計算器看似簡單,但正好可以看出 TryParseSelect Case 與除以 0 檢查的基本流程。

需要的主控項
  • TextBoxLeftScore:輸入左側點數。
  • TextBoxRightScore:輸入右側點數。
  • ComboBoxOperator:選擇 +-*\Mod
  • ButtonCalculateScore:計算結果。
  • LabelCalculateResult:顯示結果。
範例程式碼
VB.NET / Windows Forms
Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ComboBoxOperator.Items.Clear()
        ComboBoxOperator.Items.Add("+")
        ComboBoxOperator.Items.Add("-")
        ComboBoxOperator.Items.Add("*")
        ComboBoxOperator.Items.Add("\")
        ComboBoxOperator.Items.Add("Mod")
        ComboBoxOperator.SelectedIndex = 0
    End Sub

    Private Sub ButtonCalculateScore_Click(sender As Object, e As EventArgs) Handles ButtonCalculateScore.Click
        Dim leftScore As Integer
        Dim rightScore As Integer

        If Not Integer.TryParse(TextBoxLeftScore.Text.Trim(), leftScore) Then
            LabelCalculateResult.Text = "左側點數格式錯誤"
            Return
        End If

        If Not Integer.TryParse(TextBoxRightScore.Text.Trim(), rightScore) Then
            LabelCalculateResult.Text = "右側點數格式錯誤"
            Return
        End If

        Dim operatorText As String = ComboBoxOperator.SelectedItem.ToString()
        Dim resultValue As Integer

        Select Case operatorText
            Case "+"
                resultValue = leftScore + rightScore
            Case "-"
                resultValue = leftScore - rightScore
            Case "*"
                resultValue = leftScore * rightScore
            Case "\"
                If rightScore = 0 Then
                    LabelCalculateResult.Text = "整除時右側點數不可為 0"
                    Return
                End If
                resultValue = leftScore \ rightScore
            Case "Mod"
                If rightScore = 0 Then
                    LabelCalculateResult.Text = "取餘數時右側點數不可為 0"
                    Return
                End If
                resultValue = leftScore Mod rightScore
            Case Else
                LabelCalculateResult.Text = "運算符號無效"
                Return
        End Select

        LabelCalculateResult.Text = "計算結果:" & resultValue.ToString()
    End Sub
End Class
畫面輸出結果(左側 37,右側 5,運算符號 Mod)
計算結果:2
邏輯解析
  • 兩個輸入都先使用 Integer.TryParse 驗證。
  • Select Case 依照運算符號選擇計算方式。
  • \Mod 都需要檢查右側數值是否為 0。

實務判斷與常見誤區

常見問題整理

  • 把 TextBox 文字直接拿來計算:應先使用 Integer.TryParse
  • 把小數資料放進 Integer:若需要小數或金額,通常應使用 Decimal
  • 忽略整除差異:/\ 不同,整數除法應使用 \
  • 忘記除以 0 檢查:整除與取餘數都不能以 0 當除數。
  • 大型累計仍用 Integer:可能超過範圍時,應改用 Long
  • 誤解 CInt:CInt 不是單純移除小數。
資料情境 建議型別 原因
一般數量、次數、索引 Integer 最直覺也最常用。
很小範圍整數 ShortByte 需確定範圍真的很小。
大型累計、很大編號 Long 避免超出 Integer 範圍。
金額、折扣、小數 Decimal 需要精確小數。

重點整理

  1. Integer 適合保存沒有小數的一般整數資料。
  2. Integer 的範圍是 -2,147,483,6482,147,483,647
  3. 一般數量、次數、頁數、索引與門檻判斷通常適合使用 Integer
  4. \ 是整數除法,Mod 可取得餘數。
  5. 表單輸入轉整數時,建議使用 Integer.TryParse
  6. CInt 可轉成整數,但不是單純捨去小數。
  7. 大型累計可能超過 Integer 範圍時,應使用 Long
  8. 若資料需要小數或金額計算,通常應改用 Decimal