- [VB.NET] Chia sẻ source code lịch âm dương và hẹn lịch nhắc việc
- [C#] Hướng dẫn đọc thông số thiết bị Thiết bị kiểm tra Pin (HIOKI BATTERY HiTESTER BT3562)
- [VB.NET] Hướng dẫn giải captcha sử dụng dịch vụ AZCaptcha API trên winform
- [C#] Hướng dẫn chứng thực đăng nhập ứng dụng bằng vân tay (Finger Print) trên máy tính
- [C#] Color Thief cách xuất màu sắc thiết kế từ hình ảnh
- [C#] Cách tạo bản quyền và cho phép dùng thử ứng dụng Winform
- [C#] Hướng dẫn sử dụng trình duyệt web Chrome convert HTML sang tập tin file PDF
- [C#] Kết nôi điện thoại Android, IOS với App Winform via Bluetooth
- [DATABASE] Cách query cộng trừ dồn dần trong Sqlserver
- [C#] Thiết kế ứng dụng Console đẹp với thư viện Spectre.Console
- [C#] Thiết kế ứng dụng Single Instance và đưa ứng dụng lên trước nếu kiểm tra ứng dụng đang chạy
- [C#] Giới thiệu JSON Web Token và cách đọc chuỗi token
- [C#] Cách tăng giảm font chữ tất cả các control trên winform
- [DEVEXPRESS] Tích hợp chức năng Tìm kiếm Search vào CheckedComboboxEdit
- [C#] Gởi email Metting Calendar Reminder kèm nhắc thời gian lịch họp
- [C#] Tìm kiếm xem danh sách từ khóa có tồn tại trong đoạn văn bản hay không
- [C#] Thiết kế giao diện ứng dụng trên Console sử dụng thư viện Terminal.Gui
- [C#] Hướng dẫn tạo mã VietQR Payment API Winform
- [C#] Sử dụng thư viện BenchmarkDotNet đo hiệu năng của hảm Method
- [DEVEXPRESS] Tìm kiếm không dấu tô màu highlight có dấu trên C# 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!