2009-10-12 39 views
8

Tôi có yêu cầu định dạng số lớn như 4,316.000 thành "4,3m".Định dạng số lớn với .NET

Làm cách nào để thực hiện điều này trong C#?

+1

Um, ngôn ngữ lập trình? Nền tảng? Giúp chúng tôi ở đây. Câu trả lời ngắn gọn là: viết một số mã để định dạng các dải giá trị khác nhau một cách thích hợp dựa trên các yêu cầu. –

+1

@Jim: C# nằm trong thẻ cho câu hỏi. Câu hỏi có thể giúp bằng cách làm cho điều đó rõ ràng hơn một chút. –

+0

Jim là một con troll! –

Trả lời

17

Bạn có thể sử dụng Log10 để xác định ngắt chính xác. Một cái gì đó như thế này có thể làm việc:

double number = 4316000; 

int mag = (int)(Math.Floor(Math.Log10(number))/3); // Truncates to 6, divides to 2 
double divisor = Math.Pow(10, mag*3); 

double shortNumber = number/divisor; 

string suffix; 
switch(mag) 
{ 
    case 0: 
     suffix = string.Empty; 
     break; 
    case 1: 
     suffix = "k"; 
     break; 
    case 2: 
     suffix = "m"; 
     break; 
    case 3: 
     suffix = "b"; 
     break; 
} 
string result = shortNumber.ToString("N1") + suffix; // 4.3m 
+1

Đã bỏ phiếu cho sự thật. –

+0

Gotta yêu cách tiếp cận Dao cạo của Occam! – code4life

2

chia số cho 1000000.0, sau đó nối "m".

nhớ làm tròn số đến 1 chữ số thập phân.

+0

hoạt động nếu nó luôn cố gắng làm hàng triệu, nhưng không phải nếu anh ta muốn hàng ngàn, hàng triệu, hàng tỷ, v.v. –

+0

câu hỏi được hỏi về các số như 4,316.000 là "4,3m", các định dạng khác không có trong yêu cầu :) –

1
long valueToFormat = 4316000; 
var dict = new Dictionary<long, string>() { 
    {1000000000, "b"}, 
    {1000000, "m"}, 
    {1000, "k"} 
}; 

string formattedValue = valueToFormat.ToString(); 
foreach (long n in dict.Keys.OrderBy(k => k)) { 
    if (valueToFormat < n) { 
     continue; 
    } 
    double value = Math.Round(valueToFormat/(double)n, 1); 
    formattedValue = String.Format("{0}{1}", value, dict[n]); 
} 
Console.WriteLine(formattedValue); 
1

Nếu bạn chỉ chạy trên Windows, bạn có thể sử dụng một tuyên bố p-gọi trong C# hoặc VB.NET để gọi Win32 chức năng StrFormatByteSizeW hoặc StrFormatByteSize64. Nếu ứng dụng/trang web của bạn được đảm bảo chạy trên ít nhất là Vista SP1 hoặc Server 2008, thì cũng có StrFormatByteSizeEx với một vài tùy chọn khác.

mẫu từ các tài liệu MSDN:

Numeric value Text string 
532    532 bytes 
1340   1.30KB 
23506   22.9KB 
2400016   2.29MB 
2400000000  2.23GB 

Những API cũng xử lý nội địa hóa một cách chính xác cho người sử dụng không phải tiếng Anh.

+0

Điều này sẽ không làm 4.316.000 là "4.3m", giống như câu hỏi được hỏi, nhưng thay vì "4.12MB" –

+0

Rất tiếc, hãy đọc câu hỏi liên quan đến ước số nhị phân, thay vì số thập phân. – devstuff

2
public static class Program 
{ 
    private static void Main(string[] args) 
    { 
     double[] numbers = 
     { 
      3000, 3300, 3333, 30000, 300000, 3000000, 3000003, 0.253, 0.0253, 0.00253, -0.253003 
     }; 

     foreach (var num in numbers) 
     { 
      Console.WriteLine($"{num} ==> {num.Humanize()}"); 
     } 

     Console.ReadKey(); 
    } 

    public static string Humanize(this double number) 
    { 
     string[] suffix = {"f", "a", "p", "n", "μ", "m", string.Empty, "k", "M", "G", "T", "P", "E"}; 

     var absnum = Math.Abs(number); 

     int mag; 
     if (absnum < 1) 
     { 
      mag = (int) Math.Floor(Math.Floor(Math.Log10(absnum))/3); 
     } 
     else 
     { 
      mag = (int) (Math.Floor(Math.Log10(absnum))/3); 
     } 

     var shortNumber = number/Math.Pow(10, mag*3); 

     return $"{shortNumber:0.###}{suffix[mag + 6]}"; 
    } 
} 

này nên đầu ra:

3000 ==> 3k 
3300 ==> 3,3k 
3333 ==> 3,333k 
30000 ==> 30k 
300000 ==> 300k 
3000000 ==> 3M 
3000003 ==> 3M 
0,253 ==> 253m 
0,0253 ==> 25,3m 
0,00253 ==> 2,53m 
-0,253003 ==> -253,003m 
Các vấn đề liên quan