• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

[C#] Định dạng số tiền (ngăn cách bằng dấu ",")

Các mẹo vặt linh tinh không thuộc các nhóm trên

Điều hành viên: tungcan5diop, QUANITGROBEST

ShinichiKudo
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 70
Ngày tham gia: T.Tư 26/03/2008 6:42 pm
Đến từ: Đăk Nông
Has thanked: 4 time
Liên hệ:

[C#] Định dạng số tiền (ngăn cách bằng dấu ",")

Gửi bàigửi bởi ShinichiKudo » T.Bảy 05/05/2012 1:42 pm

Thủ thuật: Định dạng số tiền (ngăn cách bằng dấu ",")
Tác giả: Shinichikudo
Mô tả: Định dạng số tiền (ngăn cách bằng dấu ",") theo các cách khác nhau (dùng vòng lặp, stack, kết hợp vòng lặp và stack)


Thời gian vừa rồi e có project về CTDT và Thuật Toán, trong project có chỗ cần phải xử lí về định dạng số tiền nên nghĩ ra được một số cách để định dạng số tiền nên muốn chia sẻ với mọi người, cũng như mong nhận được ý kiến của mọi người

Cách 1: Dùng 2 vòng lặp
  1. public static String CurrencyFormat(String Number)
  2. {
  3.     if (Number.Length <= 3)
  4.         return Number;
  5.  
  6.     int commasPos = 0;
  7.     String tmpFormated = String.Empty, Formated = String.Empty;  
  8.  
  9.     for (int i = Number.Length - 1; i >= 0; i--)
  10.     {
  11.         commasPos++;
  12.         tmpFormated += Number[i];
  13.         if ((commasPos == 3) && (i != 0))
  14.         {
  15.             tmpFormated += ",";
  16.             commasPos = 0;
  17.         }                
  18.     }
  19.    
  20.     for (int i = tmpFormated.Length - 1; i >= 0; i--)
  21.     {
  22.         Formated += tmpFormated[i];
  23.     }
  24.  
  25.     return Formated;
  26. }
  27.  


Cách làm việc:
- Method nhận vào đối số là một con số được biểu diễn dưới dạng chuỗi (string)
- Đầu tiên chúng ta sẽ kiểm tra chiều dài chuỗi truyền vào <= 3 kí tự thì bỏ qua
- Công việc tiếp theo, tạo 1 vòng lặp chạy từ vị trí index cuối của chuỗi Number (Number.Length - 1) đến vị trí đầu tiên (Number[0]), mỗi lần chạy sẽ append kí tự ở vị trí thứ i của Number vào tmpFormated. Mỗi lần như vậy commasPos tăng thêm 1.
- Kiểm tra nếu commasPos = 3 và i != 0 thì append dấu "," vào chuỗi tmpFormated và reset commasPos về 0
- Tiếp tục tạo 1 vòng lặp khác, thực hiện duyệt từ cuối chuỗi tmpFormated (tmpFormated.Length - 1) đến vị trí đầu tiên (tmpFormated[0]), và thực hiện append kí tự thứ i của tmpFormated vào chuỗi Fomarted và trả ra kết quả chuỗi sau khi định dạng

VD: Chuỗi đầu vào là 300000
Sau khi thực hiện xong vòng lặp 1, thu được kết quả của tmpFormated là 000,003
Tiếp theo, khi thực hiện vòng 2, thu được kết quả của Formated là 300,000

Cách 2, 3: Sẽ cập nhật sau :D



Uzumaki Naruto
Thành viên danh dự
Thành viên danh dự
Bài viết: 839
Ngày tham gia: T.Hai 30/04/2007 9:55 pm
Đến từ: Sài Gòn
Has thanked: 7 time
Been thanked: 83 time

Re: [C#] Định dạng số tiền (ngăn cách bằng dấu ",")

Gửi bàigửi bởi Uzumaki Naruto » T.Bảy 05/05/2012 4:44 pm

Mình thấy cách này nó cũng hơi dài dòng, mình nghĩ là cứ Insert trực tiếp vào ví dụ:
  1. public string formatDecimal(string s)
  2. {
  3.     string stmp = s;
  4.     int amount;
  5.     amount = (int)(textBox1.Text.Length / 3);
  6.     if (textBox1.Text.Length % 3 == 0)
  7.         amount--;
  8.     for (int i = 1; i <= amount; i++)
  9.     {
  10.         stmp = stmp.Insert(stmp.Length - (i * 3) - (i - 1), ",");
  11.     }
  12.     return stmp;
  13. }

Hoặc nếu đơn giản hơn:
  1. this.Text = String.Format("{0:0,0}",Convert.ToInt64(textBox1.Text));

Giải quyết luôn việc hệ thống dùng "." hay "," .
Cause you're my special thing
I'm flying without wings

ShinichiKudo
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 70
Ngày tham gia: T.Tư 26/03/2008 6:42 pm
Đến từ: Đăk Nông
Has thanked: 4 time
Liên hệ:

Re: [C#] Định dạng số tiền (ngăn cách bằng dấu ",")

Gửi bàigửi bởi ShinichiKudo » T.Bảy 05/05/2012 9:46 pm

Tks Naruto nhé. 2 cách trên rất hay :) Có thể giải thích thêm cho mình chỗ "{0:0,0}" và nguyên tắc hoạt động (chủ yếu là ở đoạn vòng lặp) của cách thứ 1 ko??? Mình chưa thực sự hiểu lắm :D
Mình cũng chưa có nhiều kinh nghiệm lắm, mong được giúp đỡ. Cách của mình tuy hơi dài dòng, nhưng nếu nói một cách khách quan thì cách này có thể áp dụng đối với nhiều ngôn ngữ lập trình khác nhau.

Uzumaki Naruto
Thành viên danh dự
Thành viên danh dự
Bài viết: 839
Ngày tham gia: T.Hai 30/04/2007 9:55 pm
Đến từ: Sài Gòn
Has thanked: 7 time
Been thanked: 83 time

Re: [C#] Định dạng số tiền (ngăn cách bằng dấu ",")

Gửi bàigửi bởi Uzumaki Naruto » T.Bảy 05/05/2012 11:24 pm

-{0:0,0} là format string (chuỗi định dạng)
[index]:[format string]
[index] là chỉ số của đối tượng mà bạn muốn format. Nhưng do ở đây mình chỉ format có một chuỗi thôi nên chỉ số của nó luôn là 0 và bắt buộc phải có
[format string]: 0,0 dấu "," được quy định là dấu ngăn cách phần ngàn.
-Cách này không dùng gì phức tạp cả do C# hỗ trợ method Insert thì mình có thể sử dụng luôn, còn trong VB thì ta có thể dùng hàm Mid để thay thế, hay trong Pascal cũng có hàm Insert, tóm lại Insert vào một chuỗi thì có khá nhiều cách ở mỗi ngôn ngữ và nó không phức tạp. Nên nhìn nhận về cách này thì nó hoàn toàn bình thường và phạm vi nó áp dụng được cũng tương đương code của bạn.
*Giải thích:
-Đầu tiên mình tính ra số dấu phẩy sẽ dùng: amount = (int)(textBox1.Text.Length / 3); và nếu như số có số chữ số chia hết cho 3 thì lượng dấu phẩy cần dùng sẽ bớt đi. Ví dụ: 500000 -> Chỉ có thể 500,000 chứ không thể ,500,000. Còn các trường hợp còn lại thì cứ lấy phần nguyên của kết quả chia 3 là ổn.
-Vòng lặp là vòng để điền đủ số dấu phẩy (tức là chạy từ 1 đến số dấu phẩy cần dùng)
Code trong vòng lặp là Insert lần lượt dấu phẩy vào chuỗi.
Biểu thức: stmp.Length - (i * 3) - (i - 1)
Nếu tính index được đánh dấu từ trái sang phải (ngược) thì i*3: Dấu phẩy thứ i sẽ nằm ở vị trí thứ i*3
stmp.Length - : để lấy chỉ số ngược
- (i-1): mỗi khi Insert stmp.Length sẽ tăng lên 1 -> vị trí mà ta cần điền dấu phẩy sẽ tăng lên i-1. Do đó ta cần trừ đi phần vị trí dư ra. Cái này bạn lấy giấy viết ra sẽ rõ ngay.
Mình vừa nghĩ vừa code nên hơi ẩu. Biểu thức đó rút gọn lại là: stmp.Length - 4*i + 1
Vậy code đúng là:
[csharp]public string formatDecimal(string s)
{
string stmp = s;
int amount;
amount = (int)(s.Length / 3);
if (s.Length % 3 == 0)
amount--;
for (int i = 1; i <= amount; i++)
{
stmp = stmp.Insert(stmp.Length - 4*i + 1, ",");
}
return stmp;
}[/csharp]
Cause you're my special thing
I'm flying without wings

ShinichiKudo
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 70
Ngày tham gia: T.Tư 26/03/2008 6:42 pm
Đến từ: Đăk Nông
Has thanked: 4 time
Liên hệ:

Re: [C#] Định dạng số tiền (ngăn cách bằng dấu ",")

Gửi bàigửi bởi ShinichiKudo » CN 06/05/2012 12:18 pm

Tks. Lúc đầu mình hơi khó hiểu chỗ (i -1) nhưng giờ cũng hiểu rồi :D


Quay về “[.NET] Mẹo vặt khác”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách