Chuyển số thành chuỗi bằng C#
Giới thiệu bài toán
Bài toán chuyển số thành chuỗi bạn sẽ hay gặp trong những phần mềm chuyên dụng như phần mềm bán hàng, phần mềm kế toán, quản lý kho … để in số tiền hoặc các con số ra dạng tường mình dạng chuỗi.
Ví dụ: 123 sẽ in ra thành “một trăm hai ba”
Trước khi bạn bắt tay vào lập trình, chúng ta phân tích một chút để tìm ra quy luật của bài toán:
Ví dụ:
123 => một trăm hai ba
567,123 => năm trăm sáu bảy nghìn một trăm hai ba
890,567,123 => tám trăm chín mươi triệu năm trăm sáu bảy nghìn một trăm hai ba
….
Bạn sẽ thấy quy luật đều bắt nguồn từ phần cơ sở là hàng trăm, hàng chục và hàng đơn vị. Các con số hàng nghìn, hàng triệu, hàng tỷ … đều được sinh theo quy luật như trên.
Code thuật toán chuyển số thành xâu
//123 => một trăm hai ba đồng
//1,123,000=>một triệu một trăm hai ba nghìn đồng
//1,123,345,000 => một tỉ một trăm hai ba triệu ba trăm bốn lăm ngàn đồng
string [] mNumText = "không;một;hai;ba;bốn;năm;sáu;bảy;tám;chín".Split(';');
//Viết hàm chuyển số hàng chục, giá trị truyền vào là số cần chuyển và một biến đọc phần lẻ hay không ví dụ 101 => một trăm lẻ một
private string DocHangChuc(double so,bool daydu)
{
string chuoi = "";
//Hàm để lấy số hàng chục ví dụ 21/10 = 2
Int64 chuc = Convert.ToInt64(Math.Floor((double)(so / 10)));
//Lấy số hàng đơn vị bằng phép chia 21 % 10 = 1
Int64 donvi = (Int64)so%10;
//Nếu số hàng chục tồn tại tức >=20
if (chuc>1) {
chuoi = " " + mNumText[chuc] + " mươi";
if (donvi==1) {
chuoi += " mốt";
}
} else if (chuc==1) {//Số hàng chục từ 10-19
chuoi = " mười";
if (donvi==1) {
chuoi += " một";
}
} else if (daydu && donvi>0) {//Nếu hàng đơn vị khác 0 và có các số hàng trăm ví dụ 101 => thì biến daydu = true => và sẽ đọc một trăm lẻ một
chuoi = " lẻ";
}
if (donvi==5 && chuc>=1) {//Nếu đơn vị là số 5 và có hàng chục thì chuỗi sẽ là " lăm" chứ không phải là " năm"
chuoi += " lăm";
} else if (donvi>1||(donvi==1&&chuc==0)) {
chuoi += " " + mNumText[ donvi ];
}
return chuoi;
}
private string DocHangTram(double so,bool daydu)
{
string chuoi = "";
//Lấy số hàng trăm ví du 434 / 100 = 4 (hàm Floor sẽ làm tròn số nguyên bé nhất)
Int64 tram = Convert.ToInt64(Math.Floor((double)so/100));
//Lấy phần còn lại của hàng trăm 434 % 100 = 34 (dư 34)
so = so%100;
if (daydu || tram>0) {
chuoi = " " + mNumText[tram] + " trăm";
chuoi += DocHangChuc(so,true);
} else {
chuoi = DocHangChuc(so,false);
}
return chuoi;
}
private string DocHangTrieu(double so,bool daydu)
{
string chuoi = "";
//Lấy số hàng triệu
Int64 trieu = Convert.ToInt64(Math.Floor((double)so/1000000));
//Lấy phần dư sau số hàng triệu ví dụ 2,123,000 => so = 123,000
so = so%1000000;
if (trieu>0) {
chuoi = DocHanTram(trieu,daydu) + " triệu";
daydu = true;
}
//Lấy số hàng nghìn
Int64 nghin = Convert.ToInt64(Math.Floor((double)so / 1000));
//Lấy phần dư sau số hàng nghin
so = so%1000;
if (nghin>0) {
chuoi += DocHangTram(nghin,daydu) + " nghìn";
daydu = true;
}
if (so>0) {
chuoi += DocHangTram(so,daydu);
}
return chuoi;
}
public string ChuyenSoSangChuoi(double so)
{
if (so == 0)
return mNumText[0];
string chuoi = "", hauto = "";
Int64 ty;
do
{
//Lấy số hàng tỷ
ty = Convert.ToInt64(Math.Floor((double)so / 1000000000));
//Lấy phần dư sau số hàng tỷ
so = so % 1000000000;
if (ty > 0)
{
chuoi = DocHangTrieu(so, true) + hauto + chuoi;
}
else
{
chuoi = DocHangTrieu(so, false) + hauto + chuoi;
}
hauto = " tỷ";
} while (ty > 0);
return chuoi + " đồng";
}
}
Hàm này add vào đâu thầy ơi. em add vào funtion không được.
Nếu em làm riêng trên form, thì em add trực tiếp đoạn code này vào form em đang làm.
Còn trường hợp em viết một lớp Functions riêng thì em cần xem trong video đoạn này:
https://youtu.be/NcgTNOdBaeE?t=2461
Em t hêm vào và chạy nó báo lỗi: System.NotImplementedException: ‘The method or operation is not implemented.’
if (ty > 0)
{
chuoi = DocHangTrieu(so, true) + hauto + chuoi;
}
else
{
chuoi = DocHangTrieu(so, false) + hauto + chuoi;
}
-> chỗ này chưa đúng với trường hợp tiền tỷ
3,118,024,647.38
Một trăm mười tám triệu không trăm hai mươi bốn nghìn sáu trăm bốn mươi
bảy tỷ một trăm mười tám triệu không trăm hai mươi bốn nghìn sáu trăm bốn mươi bảy đồng
Bạn thử thay thế đoạn code sau:
thầy ơi cho em hỏi với ạ e, làm đến form hóa đơn em xem video của thầy em chỉnh lỗi lưu hóa đơn nhưng khi làm theo thầy thì em lại bị lỗi này ạ hình
https://drive.google.com/file/d/1WPVIxvQN82bx4uY9sIZGtei5laNhyEOh/view?usp=sharing
và sau đó khi em ấn ok thì bị lỗi này ạ https://drive.google.com/file/d/19McdQPyrZ6-2GE-xLovWwm7BknZ4TtXu/view?usp=sharing
và trong phần in ra ex thì em lại bị lỗi này ạ https://drive.google.com/file/d/1n4RtT9xZj2UBTuDrZiyZVbimPh177eds/view?usp=sharing
thầy có thể giúp em dc luôn vid mai em phải nộp rồi ạ em cảm ơn thầy nhiều ạ
Lỗi hình thứ 1 là chuỗi ký tự nhập vào dài hơn số ký tự đã khai báo cột trong SQL.
Lỗi hình thứ 2 là Chuỗi SQL sai định dạng format, kiểm tra lại chuỗi sau khi truyền biến vào.
Lỗi hình thứ 3 là Câu truy vấn của bạn không có kết quả trả về, vấn đề này bạn phải ràng buộc lại nhé, (nếu tblThongTinHD.Rows.Count > 0 thì mới có thể gọi dòng tblThongTinHD.Rows[0][0] được)
Em làm bài này trên giao diện WPF ạ. Mặc dù chương trình không hiện lỗi nhưng khi chạy chương trình thì button của em bị lỗi ạ. Mong thầy giúp đỡ ạ.
Đây là link ảnh ạ: https://drive.google.com/file/d/1fWxTP5CSZ5ShkBHaYWU0QTwMd7R3JILD/view
em coppy paste bi loi nhu v a loi 1
Severity Code Description Project File Line Suppression State
Error CS5001 Program does not contain a static ‘Main’ method suitable for an entry point baibon C:\Users\SV\source\repos\bai1\baibon\CSC 1 Active
Em xem video hướng dẫn ý. Như trường hợp của em, hình như em bị xoá mất function Main rồi
Em có đoạn javaScript này. Mọi người có thể chuyển sang C# được ko ạ? Mọi người giúp đỡ. Đây cũng là code đọc sô rút tiền rút gọn
Ví du: 5.000.000.000 thì sẽ ra kết quả là 5 tỷ
Code
isNumber: function (number) {
for (var i = 0; i = “0” && temp 0 && parseInt(price, 0) > 900000000) {
if (priceTrieu > 0) { getTrieu = “,” + priceTrieu / 100; } else { getTrieu = ”; }
strTextPrice = strTextPrice + priceTy + getTrieu + ” Tỷ “;
}
if (priceTy == 0 && priceTrieu > 0) {
if (priceNgan > 0) { getNgan = “,” + priceNgan / 100; } else { getNgan = ”; }
strTextPrice = strTextPrice + priceTrieu + getNgan + ” Triệu “;
}
if (priceTrieu == 0 && priceNgan > 0) {
if (priceDong > 0) { getDong = “,” + priceDong / 100; } else { getDong = ”; }
strTextPrice = strTextPrice + priceNgan + getDong + ” Ngàn “;
}
if (priceNgan == 0 && priceDong > 0) {
strTextPrice = strTextPrice + priceDong + ” Đồng”;
}
strTextPrice = strTextPrice.replace(/\./g, “”);
return strTextPrice;
},