- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[C#] Hướng dẫn kiểm tra số Container hợp lệ hay không
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.
Giao diện demo ứng dụng C#:
Để 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!