C # - Изменение количества десятичных знаков - PullRequest
1 голос
/ 27 июля 2011

У меня есть строка, которая выглядит следующим образом:

TEXT  MORETEXT  227.905  174.994  180  1111

Мне любопытно, как я могу изменить десятичное число, чтобы иметь только 2 места.

Так что вместо строки выше,Я хотел бы, чтобы это было:

TEXT  MORETEXT  227.90  174.99  180  1111 #rounding down

ИЛИ

TEXT  MORETEXT  227.91  174.99  180  1111 #rounding up

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


РЕДАКТИРОВАТЬ:

Итак, если у меня был файл, который читает: (Примечание: файл состоит из нескольких строк)

TEXT  MORETEXT  227.905  174.994  180  1111
TEXT  MORETEXT  227.905  174.994  180  1111
TEXT  MORETEXT  227.905  174.994  180  1111

и я хочу, чтобы он перешел в RichTextBox следующим образом:

TEXT  MORETEXT  227.90  174.99  180  1111
TEXT  MORETEXT  227.90  174.99  180  1111
TEXT  MORETEXT  227.90  174.99  180  1111

Как я могу это сделать?


EDIT2:

        string[] listOneLines = null;
        string[] listTwoLines = null;
        string[] listUserLines = null;

        // Splits the lines in the rich text boxes
        listOneLines = removePKG1EndingsRichTextBox.Text.Split('\n');
        listTwoLines = removePKG2EndingsRichTextBox.Text.Split('\n');
        listUserLines = removeUserEndingsRichTextBox.Text.Split('\n');

        string[] myLines = removePKG1EndingsRichTextBox.Text.Split('\n');
        StringBuilder sb = new StringBuilder();
        foreach(string myLine in myLines)
        {
            string[] piecesStringArray = removePKG1EndingsRichTextBox.Text.Split(' ');  //Assuming those are tabs
            double d1 = Convert.ToDouble(piecesStringArray[2]);
            double d2 = Convert.ToDouble(piecesStringArray[3]);
            double round1 = Math.Round(d1, 2);
            double round2 = Math.Round(d2, 2);

            sb.AppendLine(piecesStringArray[0] + piecesStringArray[1] + round1 + round2 + piecesStringArray[4] + piecesStringArray[5]);
        }
        listOneLines = sb.ToString(); #does not work..

        // Set the selection mode to multiple and extended.
        placementOneListBox.SelectionMode = SelectionMode.MultiExtended;
        placementTwoListBox.SelectionMode = SelectionMode.MultiExtended;
        userDefinedListBox.SelectionMode = SelectionMode.MultiExtended;

        // Shutdown the painting of the ListBox as items are added.
        placementOneListBox.BeginUpdate();
        placementTwoListBox.BeginUpdate();
        userDefinedListBox.BeginUpdate();

        // Display the items in the listbox.
        foreach (var item in listOneLines)
            placementOneListBox.Items.Add(item);
        foreach (var item2 in listTwoLines)
            placementTwoListBox.Items.Add(item2);
        foreach (var item3 in listUserLines)
            userDefinedListBox.Items.Add(item3);

        // Allow the ListBox to repaint and display the new items.
        placementOneListBox.EndUpdate();
        placementTwoListBox.EndUpdate();
        userDefinedListBox.EndUpdate();

Я пытался уменьшить десятичные значения для каждой строки в RTBпрежде чем загрузить его на ListBox.Однако я изо всех сил ...

Ответы [ 3 ]

2 голосов
/ 27 июля 2011
        string s = @"
TEXT  MORETEXT  227.905  174.994  180  1111
TEXT  MORETEXT  227.905  174.994  180  1111";

        string newS = Regex.Replace(s,
               "[0-9]+(.[0-9]+)?",
               m => string.Format("{0:0.##}", double.Parse(m.Value)), 
               RegexOptions.Singleline);
2 голосов
/ 27 июля 2011

Вы можете использовать:

string[] piecesStringArray = myLine.Split('\t');  //Assuming those are tabs
double d1 = Convert.ToDouble(piecesStringArray[2];
double d2 = Convert.ToDouble(piecesStringArray[3];
double round1 = Math.Round(d1, 2);
double round2 = Math.Round(d2, 2);
//Now recreate your string

Конечно, вы должны добавить проверку ошибок и тому подобное. Если вы хотите пойти против обычного округления, проверьте Math.Floor () и Math.Ceil (). Вам нужно масштабировать число до десяти, чтобы оно работало правильно.

Для получения myLine вы можете использовать:

string[] myLines = entireFileText.Split(Environment.NewLine);
for(string myLine in myLines)
{
     //Previous code
}
0 голосов
/ 27 июля 2011

Необходимо выполнить следующие шаги:

  1. Разобрать строку, чтобы получить строковое значение цифр;
  2. Привести строки цифр к числовым типам;
  3. Проведение манипуляций с числами;
  4. Создание новой строки.

Каждый шаг - это отдельная задача.

Для решения первой проблемы вам необходимо знатьформат строки.Всегда есть цифры в этом порядке?Для разбора строки вы можете использовать регулярные выражения или методы класса Array (Split).

После извлечения цифр из строки вы можете использовать методы класса Math для округления чисел.Вы можете написать свою собственную версию.

...