2012-08-15 3 views
3

У меня есть метка, показывающая целое число без знака, и оно имеет максимальную длину. Я хотел бы, чтобы форматировать числа, которые будут отображаться как это:Как я могу форматировать числа с одинаковым количеством цифр?

1   = "1" 
1000  = "1,000" 
12400  = "12.4k" 
101,800,000 = "102M" // !!! 
1,849,000 = "1.85M" 

Итак, я закончил со строкой с максимальной длиной 5.

Мой диапазон: от 0 до 199,999,999.

Есть ли способ сделать это без обработки многих случаев, то есть многих интервалов?

+1

Требования к вашей проблеме кажется слишком специфичны для нее, чтобы иметь уже существующее решение, выполняющее именно то, что вы хотите. Вам, вероятно, придется написать свою собственную функцию. Также, как 1.800.000 = "1,85M"? И если ваш диапазон достигает максимума в 1 999 999, как вы можете получить 101.800.000 = «102M»? – Shadowxvii

+0

составляет 101.800.000 действительный случай, принимая во внимание «диапазон от 0 до 1 999 999». ? –

+0

Извините, я испортил диапазон, с 1.85M и с разделителями (на моем языке "." Is "," и "," is ".") ... – Roberto

ответ

2

Я, наверное, слишком поздно, но вот метод расширения, который возвращает число отформатированных, как вы хотите:

public static string ToShortString(this int n) 
{ 
    if (n >= 1e8) 
    { 
     return (Math.Round((double)n/1e6, 0)).ToString() + "M"; 
    } 
    else if (n >= 1e7) 
    { 
     return (Math.Round((double)n/1e6, 1)).ToString() + "M"; 
    } 
    else if (n >= 1e6) 
    { 
     return (Math.Round((double)n/1e6, 2)).ToString() + "M"; 
    } 
    else if (n >= 1e5) 
    { 
     return (Math.Round((double)n/1e3, 0)).ToString() + "K"; 
    } 
    else if (n >= 1e4) 
    { 
     return (Math.Round((double)n/1e3, 1)).ToString() + "K"; 
    } 
    else if (n >= 1e3) 
    { 
     return n.ToString("##,#"); 
    } 
    else 
    { 
     return n.ToString(); 
    } 
} 

Тесты:

Console.WriteLine((5).ToShortString());   // displays 5 
Console.WriteLine((55).ToShortString());  // displays 55 
Console.WriteLine((555).ToShortString());  // displays 555 
Console.WriteLine((5555).ToShortString());  // displays 5,555 
Console.WriteLine((55555).ToShortString());  // displays 55.6K 
Console.WriteLine((555555).ToShortString()); // displays 556K 
Console.WriteLine((5555555).ToShortString()); // displays 5.56M 
Console.WriteLine((55555555).ToShortString()); // displays 55.6M 
Console.WriteLine((555555555).ToShortString()); // displays 556M 
1

Этот ответ показывает здесь, как сделать это в различных формах: Round numbers with K suffix

К сожалению, я не знаю ни одного способа сделать это по крайней мере без изрядных случаев. Но некоторые ответы в вышеупомянутом вопросе делают это довольно элегантно и с минимальным количеством кода.

Смежные вопросы