Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Сохранение float в txt файле


Автор: okaton 6.10.2007, 13:41
Доброго времени суток. Вопрос тупее некуда smile 

У меня есть переменная типа float и она сохраняется в файле, значение в ней получаются иногда целыми. 
И в файле сохраняются без дробной части. Вот мне нужно чтобы например 95 в файле сохранялось как 95.0, как это сделать?
Вот чего я не понимаю так это почему переменная хранится в памяти с дробной частью, а сохраняется без?

Автор: mr.DUDA 6.10.2007, 13:46
Код покажите.

Автор: okaton 6.10.2007, 14:45
Ну например вот такой

Код

StreamWriter zapisTXT = new StreamWriter("1.txt"); 
for (
{
...
zapisTXT.Write(string.Format("{0, 3}", (Math.Round(mass[m, e], 1) + " ")));
...
}


или такой
Код

zapisTXT.WriteLine("фа=" + Math.Round(Out_Data.fa));


все объявляется как float

Автор: 1stain 6.10.2007, 15:12
Код

zapisTXT.Write(String.Format("{0:.0}", mass[m, e] ) );


только учти, что сохранит с разделителем целой и дробной частей, который принят в текущей локали. при парсинге текстового файла придецца указать IformatProvider, с которым ты сохранял в текстовый файл. Например, так:

Код

List<float> parsed = new List<float>();
            using (StreamReader reader = new StreamReader("1.txt"))
            {
                float anotherFloat;
                while (!reader.EndOfStream)
                {
                    if( float.TryParse(reader.ReadLine(), System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.CultureInfo.GetCultureInfo("ru-ru"), out anotherFloat) )
                        parsed.Add(anotherFloat);
                }
            }

Автор: okaton 6.10.2007, 15:33
1stain, 

А как мне эту запись внедрить вот сюда
Код

zapisTXT.Write(string.Format("{0, 3}", (Math.Round(mass[m, e], 1) + " ")));


zapisTXT.WriteLine("фа=" + Math.Round(Out_Data.fa));// здесь тоже потом будет форматирование


у меня здесь задаются параметры формата строки



Автор: okaton 6.10.2007, 19:05
А все-таки как сделать так чтобы при сохранении в файл .0 не исчезал, ведь он же хранится в памяти глупо было бы его дописывать?

Автор: mr.DUDA 6.10.2007, 23:01
Можно глупый вопрос: обязательно в текстовый файл сохранять ?

Автор: okaton 6.10.2007, 23:06
да

Автор: tol05 6.10.2007, 23:28
Код

zapisTXT.Write(string.Format("{0:F2} ", Math.Round(mass[m, e], 1));//пробел внутри строки, после фигурных скобок
zapisTXT.WriteLine(string.Format("фа={0:F2}", Math.Round(Out_Data.fa));


Автор: iad 7.10.2007, 20:53
Цитата(tol05 @  7.10.2007,  00:28 Найти цитируемый пост)
zapisTXT.Write(string.Format("{0:F2} ", Math.Round(mass[m, e], 1));
Match.Round это круто. smile  Почитай MSDN про string.Format прежде чем масло масляное советовать. smile 

Автор: tol05 7.10.2007, 21:40
Цитата(iad @  7.10.2007,  20:53 Найти цитируемый пост)
Match.Round это круто. smile  Почитай MSDN про string.Format прежде чем масло масляное советовать. smile 
это мне?

Почитал. Ну и что?
Цитата

public static double Round (double value, int digits)

iad, я предложил указать конкретный вариант форматирования числа. Что-то не так?

Автор: iad 8.10.2007, 09:34
Цитата(tol05 @  7.10.2007,  22:40 Найти цитируемый пост)
Что-то не так?
Format прекрасно справляется с округлением до нужного знака и использование Math.Round здесь как корове седло

Автор: okaton 8.10.2007, 10:15
iad,  Сначало я округлял Math.Round, потому что мне нужно было округлить.
Потом мне посоветовали string.Format для форматирования данных в сохраняемом файле, про то что он прекрасно справляется с округлением до нужного знака я не знал (кстати узнал только что от вас). MSDN я читал, но видимо от меня что-то ускользнуло.


Всем спасибо за советы, вчера инета не было, а проект нужно было сдавать.
Понять в чем дело я не смог, пришлось обработчик писать на нулевую дробную часть и дописывать (,0 ).
Хоть и результат тот же, но для себя я считаю что это неправильный путь решения:(

Автор: 1stain 8.10.2007, 11:06
Цитата(okaton @  8.10.2007,  10:15 Найти цитируемый пост)
Понять в чем дело я не смог, пришлось обработчик писать на нулевую дробную часть и дописывать (,0 ).

 smile 
жаль нету смайла "suicide"

вот запись элементов массива в текстовый файл с пробелами и прочей чепухой
Код

            Random rnd = new Random();
            float[,] farray = new float[10,10];
            for (int i = 0; i < farray.GetLength(0); ++i)
            {
                for (int j = 0; j < farray.GetLength(1); ++j)
                {
                    farray[i, j] = (float)(rnd.NextDouble() * 100);
                }
            }

            using (StreamWriter writer = new StreamWriter("1.txt"))
            {
                for (int i = 0; i < farray.GetLength(0); ++i )
                {
                    for (int j = 0; j < farray.GetLength(1); ++j)
                    {
                        writer.Write(String.Format("{0,-10:.0} ", farray[i, j]));
                    }
                    writer.WriteLine();
                }
            }


так, как используется Math.Round() у тебя, нет никакой разницы с отбрасыванием "лишних" знаков после запятой, которое делает String.Format. Зато выполняется лишняя работа - сначала округляем через Math.Round(), а потом все равно вызываем String.Format()

Автор: mr.DUDA 8.10.2007, 11:25

M
mr.DUDA
1stain, спокойнее плз.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)