Подтвердить что ты не робот

Форматирование числа с метрическим префиксом?

Возможный дубликат:
Инженерная нотация в С#?

Если метрический префикс предпочтительнее научная нотация может быть обсужден, но я думаю, что он имеет свои прецеденты для физических единиц.

Я посмотрел вокруг, но, похоже, у .NET нет ничего подобного, или я ошибаюсь в этом? Любой способ достижения этого будет хорошим.

В качестве пояснения: Цель состоит в том, чтобы отобразить любое заданное число как строку с плавающей точкой или целым числом со значением от 1 до 999 и соответствующим метрическим префиксом.

например.

1000 → 1k
0,05 → 50 м

С некоторым округлением:

1,436,963 → 1,44 М

4b9b3361

Ответ 1

Попробуйте это. Я не тестировал его, но он должен быть более или менее правильным.

public string ToSI(double d, string format = null)
{
    char[] incPrefixes = new[] { 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y' };
    char[] decPrefixes = new[] { 'm', '\u03bc', 'n', 'p', 'f', 'a', 'z', 'y' };

    int degree = (int)Math.Floor(Math.Log10(Math.Abs(d)) / 3);
    double scaled = d * Math.Pow(1000, -degree);

    char? prefix = null;
    switch (Math.Sign(degree))
    {
        case 1:  prefix = incPrefixes[degree - 1]; break;
        case -1: prefix = decPrefixes[-degree - 1]; break;
    }

    return scaled.ToString(format) + prefix;
}

Ответ 2

Согласно этим fooobar.com/questions/440067/... Статьи и моим собственным исследованиям, нет никакого способа форматирования чисел в метрических единицах. Вам нужно будет написать свои собственные методы для синтаксического анализа единиц и добавления соответствующих метрических измерений, таких как, например, расширенный пример этого интерфейса tutorial в MSDN. Вы также можете попытаться найти библиотеку кодирования метрических единиц для использования для разработки.

Ответ 3

Создайте метод расширения для каждого числового типа. Вы должны вызвать ToStringMetric() для пользовательского форматирования.

public static class Int32Extensions
{
        public static string ToStringMetric(this Int32 x) { return (x / 1000).ToString() + " K"; }
}