Формат строки двойной с произвольной точностью, фиксированная десятичная позиция

1

Я хочу написать функцию, которая принимает 4 аргумента и выводит строку, удовлетворяющую следующим условиям:

  1. Десятичное число должно быть в позиции строки X (где X является константой). Таким образом, когда я печатаю серию таких строк, десятичная позиция всегда выстраивается в линию.
  2. На практике двойник обычно имеет до 5 цифр слева от десятичной точки, включая отрицательный знак. и до 7 цифр справа от десятичной точки.
  3. Остальные поля выравниваются по левому краю и имеют фиксированные ширины столбцов.

До сих пор я имел дело с 3 из 4 столбцов; однако у меня возникают проблемы с десятичным аргументом. Я не могу понять, как совместить произвольную точность с фиксированным десятичным знаком. Вот что я получил до сих пор:

public String PrintRow(string fieldName, string fieldUnit, double value, string description){ 
    return string.Format(
        " {0,4}.{1,-4}        {2,8:####0.0000####} : {3,-25}\n", 
        fieldName, fieldUnit, value, description);
}

Вот несколько примеров, которые я хотел бы сделать:

 STRT.M            57.4000                 : Start
 STOP.M           485.8000                 : Stop
 STEP.M             0.1524                 : Step
 SMTN.FT         -111.2593615              : Something Cool

Что мне делать?

  • 0
    Я отредактировал ваш заголовок. Пожалуйста, смотрите: « Должны ли вопросы включать« теги »в их заголовки? », Где консенсус «нет, они не должны».
  • 0
    Что именно вы хотите сделать? Должен ли этот код регулировать форматирование на основе всего набора данных? Или вы хотите указать положение десятичной точки и количество цифр в качестве параметров?
Показать ещё 2 комментария
Теги:
string
c#-4.0
formatting
string-formatting

1 ответ

2
Лучший ответ

Это должно дать вам то, что вы хотите:

public static string PrintRow(string token, string unit, double value, string desc)
{
    // convert the number to a string and separate digits
    // before and after the decimal separator
    string[] tokens = value
        .ToString()
        .Split(new string[] { CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator }, StringSplitOptions.RemoveEmptyEntries);

    // calculate padding based on number of digits
    int lpad = 11 - tokens[0].Length;
    int rpad = 19 - tokens[1].Length;

    // format the number only
    string number = String.Format("{0}{1}.{2}{3}",
        new String(' ', lpad),
        tokens[0],
        tokens[1],
        new string(' ', rpad));

    // construct the whole string
    return string.Format(" {0,-4}.{1,-4}{2}  : {3,-23}\n",
        token, unit, number, desc);
}
  • 1
    +1, хотя вы могли бы написать весь метод OP, чтобы прояснить, что вы делаете (не только часть числа). И это зависит от культуры: правильным способом было бы использовать CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator в качестве разделителя десятичных дробей при разбиении числа.
  • 0
    @ Гроо Я взял на себя смелость сделать это сам - и я тоже включил CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator . Смотрите ответ ниже.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню