NEWS

[C#] Hướng dẫn kiểm tra số Container hợp lệ hay không

[C#] Hướng dẫn kiểm tra số Container hợp lệ hay không
Đăng bởi: Thảo Meo - Lượt xem: 1922 09:49:21, 13/06/2023C#   In bài viết

Xin chào các bạn, bài viết hôm nay mình hướng dẫn các bạn cách kiểm tra số Container (con't) có hợp lệ hay không trên lập trình C#, Winform.

[C#] Container Number Validator for ISO containers Tool winform

Dưới đây, là hình ký hiệu của một Container.

Container-Number-1

Giao diện demo ứng dụng C#:

check_container-csharp

Để kiểm tra số Container hợp lệ, mình tính theo cách sau:

Giải thích cách tính

 

Về lý thuyết, mọi người đều có thể kiểm tra tính chính xác của số container bằng hệ số kiểm tra.

Dưới đây, tôi sẽ minh họa cách tính cho số container trong ví dụ nêu trên: SUDU137007. 

Có 3 bước chính như sau:

Bước 1. Quy đổi chữ cái thành số:

Do tiếp đầu ngữ SUDU là chữ cái, nên cần quy đổi các chữ này ra số để có thể tính toán. Mỗi chữ cái Latin được gán một số nhất định như trong bảng dưới đây, bắt đầu từ 10 tăng dần lên đến 38.

Lưu ý: các số tăng dần nhưng bỏ quá các số 11, 22, 33 (bội số của 11), vì bước tiếp theo sẽ có phần chia cho 11, nên phải bỏ qua giá trị này để tránh bị sai số.

A B C D E F G H I J K L M
10 12 13 14 15 16 17 18 19 20 21 23 24
 
N O P Q R S T U V W X Y Z
25 26 27 28 29 30 31 32 34 35 36 37 38

Bước 2. Thay tiếp đầu ngữ thành số

Thay 4 chữ trong tiếp đầu ngữ SUDU bằng 4 số tương ứng trong bảng trên (phần màu vàng trong bảng dưới). Phần số 307007 sẽ được giữ nguyên, ta có cột (b) bảng dưới.

Trong cột (c), lấy 2 lũy thừa lần lượt từ 0 đến 9.

Sau đó, lấy số trong cột (b) nhân tương ứng với số trong cột (c) sẽ được kết quả trong cột (e).

Kí tự Số tương ứng Lũy thừa 2n Chi tiết Tách số
(a) (b) (c) (b)x(c) (e)
S 30 20 30 x 20 30
U 32 21 32 x 21 64
D 14 22 14 x 22 56
U 32 23 32 x 23 256
3 3 24 3 x 24 48
0 0 25 0 x 25 0
7 7 26 7 x 26 448
0 0 27 0 x 27 0
0 0 28 0 x 28 0
7 7 29 7 x 29 3584
Tổng 4486

Bước 3. Tính số kiểm tra

Tính tổng các số trong cột (e) trong bảng trên được 4486, rồi đem chia cho 11. Số dư của phép tính chia này chính là số kiểm tra đang cần tìm: 4486 : 11 = 408 dư 9.

Vậy số kiểm tra của container SUDU 307007 là 9.

P/S: Công thức tính trên tham khảo tại website: https://www.container-transportation.com/so-kiem-tra-container.html

Source code C#:

using DevExpress.Utils.VisualEffects;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Windows.Forms;


namespace CheckValidContainerNo
{
    public partial class Form1 : DevExpress.XtraEditors.XtraForm
    {
        public Form1()
        {
            InitializeComponent();
            this.CausesValidation = false;
            this.AutoValidate = AutoValidate.EnableAllowFocusChange;           
            txtContainerNumber.Validating += TxtContainerNumber_Validating;
            txtContainerNumber.Tag = validTxtContainer;

        }

     

        ValidationHintState CalcTextEditValidationState(DevExpress.XtraEditors.TextEdit edit, CancelEventArgs e)
        {
            if (edit.EditValue == null)
                return ValidationHintState.Indeterminate;

            if (CheckValidContainerNo(edit.EditValue.ToString()).Item2)
            {
                e.Cancel = false;
                ValidationHint hint = edit.Tag as ValidationHint;
                hint.Properties.ValidState.Text = "Tuyệt vời, bạn ơi.";
                return ValidationHintState.Valid;
            }

            else {
                e.Cancel = true;
           
                return ValidationHintState.Invalid;
            }
                
           
        }
        private void TxtContainerNumber_Validating(object sender, CancelEventArgs e)
        {
            validTxtContainer.Properties.State = CalcTextEditValidationState(txtContainerNumber, e);
        }

        void OnInvalidValue(object sender, DevExpress.XtraEditors.Controls.InvalidValueExceptionEventArgs e)
        {
            Control editor = sender as Control;
            if (editor == null) return;
            if (editor == txtContainerNumber) {
                if (e.ErrorText == "Invalid Value")
                    e.ErrorText = CheckValidContainerNo(txtContainerNumber.Text).Item3;
            }


            ValidationHint hint = editor.Tag as ValidationHint;
           
            if (hint != null)
            {
                hint.Properties.InvalidState.Text = e.ErrorText;               
                e.ErrorText = null;
            }
        }
       

        public static (string, bool, string) CheckValidContainerNo(string containerNumber)
        {
            Dictionary<char, int> dataLookup = new Dictionary<char, int>()
            {
                {'A', 10},
                {'B', 12},
                {'C', 13},
                {'D', 14},
                {'E', 15},
                {'F', 16},
                {'G', 17},
                {'H', 18},
                {'I', 19},
                {'J', 20},
                {'K', 21},
                {'L', 23},
                {'M', 24},
                {'N', 25},
                {'O', 26},
                {'P', 27},
                {'Q', 28},
                {'R', 29},
                {'S', 30},
                {'T', 31},
                {'U', 32},
                {'V', 34},
                {'W', 35},
                {'X', 36},
                {'Y', 37},
                {'Z', 38}
            };
            var inputData = containerNumber.Replace(" ", "").Trim().ToUpper();
            // kiểm tra xem đủ 11 ký tự không
            if (inputData.Length != 11)
            {
                return (inputData, false, $"Mã số Con't: {inputData} phải 11 ký tự.");
            }
            //kiểm tra xem 4 ký tự đầu phải chữ cái không
            bool isCharacter = inputData.Take(4).All(c => !Char.IsDigit(c));
            if (!isCharacter)
            {
                return (inputData, true, $"4 ký tự đầu: {string.Join("", inputData.Take(4))} Con't phải là ký tự.");
            }
            // kiểm tra xem các ký tự tiếp theo có phải là số không
            bool isDigit = inputData.Skip(4).All(c => Char.IsDigit(c));
            if (!isDigit)
            {
                return (inputData, false, $"7 ký tự cuối: {string.Join("", inputData.Skip(4))} phải là số, không phải ký tự.");
            }

            // tính số dư
            int SoCanKiemTra = 0;
            for (int i = 0; i <= 3; i++)
            {
                var item = inputData[i].ToString();
                var itemLookup = dataLookup.Where(x => x.Key.ToString() == item).FirstOrDefault().Value * Math.Pow(2, i);
                SoCanKiemTra += Convert.ToInt32(itemLookup);
            }
            // tính tiếp 6 số tiếp theo
            for (int i = 4; i <= 9; i++)
            {
                var temp = inputData[i].ToString();
                var item = Convert.ToInt32(inputData[i].ToString()) * Math.Pow(2, i);
                SoCanKiemTra += Convert.ToInt32(item);
            }

            // chia lấy dư cho số 11 để lấy kết quả kiểm tra
            SoCanKiemTra = SoCanKiemTra % 11;
            // lấy ký tự cuối cùng của số con't để so sánh
            var lastCharContainer = Convert.ToInt32(inputData[10].ToString());
            if (SoCanKiemTra == lastCharContainer)
            {
                return (inputData, true, $"Số Con't: {inputData} hợp lệ.");
            }


            return ($"{inputData}({SoCanKiemTra})", false, $"Số Con't: {inputData}({SoCanKiemTra}) không hợp lệ.");

        }


        private void btnCheckValid_Click(object sender, EventArgs e)
        {   
          
        }

       
    }
}

Thanks for watching!

DOWNLOAD SOURCE

THÔNG TIN TÁC GIẢ

BÀI VIẾT LIÊN QUAN

[C#] Hướng dẫn kiểm tra số Container hợp lệ hay không
Đăng bởi: Thảo Meo - Lượt xem: 1922 09:49:21, 13/06/2023C#   In bài viết

CÁC BÀI CÙNG CHỦ ĐỀ

Đọc tiếp
.