Как пользователься wstringstream?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

x=3.14

Код: Выделить всё

std::wstringstream buffer;
std::wstring Result;
buffer<<x;
buffer>>Result;
. Как получить незначащие ноли в конце до заданного количества разрядов, например, 3.1400000?
А если x=3.14e+20, то как получить не 3.14e+020, 3.1400000e+20? Может ли буква e в результате преобразования быть в верхнем регистре, или только в нижнем? Как принудительно заставить wstringstream выдавать результат с плавающей запятой, то есть чтоб при x=3.14e-2 получить не 0.00314, а 3.1400000e-2? Как принудительно заставить wstringstream выдавать результат с фиксированной запятой? Например, как при x=3.14e+20 получить 314000000000000000000?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Это всё решается при помощи манипуляторов. Вот ссылочка.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

С неё то я и начал. Но

Код: Выделить всё

std::wstring Result;
std::wstringstream Buffer;
Buffer.precision(8);
Buffer<<Value;
Buffer>>Result;
и

Код: Выделить всё

std::wstring Result;
std::wstringstream Buffer;
Buffer<<std::setprecision(8);
Buffer<<Value;
Buffer>>Result;
не значащие ноли не выводит.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Код: Выделить всё

std::wstring Result;
std::wstringstream Buffer;
Buffer<<std::setprecision(8);
Buffer<<std::fixed;
Buffer<<Value;
Buffer>>Result;
Position=Result.find(L'.');
- тоже не то:
1. Не значащие ноли надо выводить и в мантиссе при плавающей запятой.
2. Надо задать количество знаков не после точки, а всего до и после точки.
3. С плавающей запятой должно выводиться всё, что удовлетворяет одному из двух условий:
3.1. Меньше +1, но больше -1 и при заданной точности не округляется ни до 1. с нолями, ни до -1. с нолями. Например, при заданной точности восемь знаков меньше +1, но больше -1 и при такой точности не округляется 8-ми знаков округляется ни 1.0000000, ни до -1.0000000.
3.2. При округлении количество знаков всё равно остаётся больше заданного. Например, при заданной точности восемь знаков число после округления до целых оказывается больше +99999999, или меньше -99999999.
Сразу за знаком порядка должен следовать не ноль, а другая цифра.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Можно не ограничиваться одними лишь стандартными библиотеками. Ничто не мешает использовать сторонние библиотеки, у которых возможности по форматированию текста могут быть шире, чем в стандартных.
Вот к примеру функция форматирования строки в U++ Framework http://ultimatepp.org/src$Core$Format$en-us.html
Поумнеть несложно, куда труднее от дури избавиться.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

И весь проект перекомпилить в промежуточный код этого фреймвока?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Сионист писал(а):И весь проект перекомпилить в промежуточный код этого фреймвока?
У меня снова взрыв мозга от того, что читаю. Что именно ты подразумеваешь в данном случае под промежуточным кодом? Явно не то, что имеют в виду все, так как изначальный смысл этого термина неразрывно связан с интерпретаторами, которые здесь не наблюдаются.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Конкретно по проблеме. Нас, оказывается, опять спасает гугл! Достаточно включить "научный" формат отображения чисел. Внимательно читаем пример, приведённый в статье для манипулятора setw и много думаем (С).

Вот урезанный пример, решающий проблему:

Код: Выделить всё

#include <iostream>
#include <iomanip>

int main()
{
   std::cout << std::setiosflags(std::ios_base::scientific);
   std::cout << std::setw(10) << 3.14f << std::endl;   
   return 0;
}
Вывод программы:
3.140000e+000
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить