Возник вопрос о печати целых чисел с разделителем тысяч / миллионов.
Я получил текстовый файл, где я получил страну, город, общее население.
Я должен читать в файле и сортировать по стране. Если страна реальна, я должен сортировать по убыванию населения.
Текстовый файл похож на:
Австралия …….. Сидней ……… 10.123.456
Бразилия ……….. Сан-Паулу ……. 7.123.345
Я прочитал все 3 в отдельной строке. Затем я стираю все «.» в строке населения. Затем я использую atoi () для приведения строки населения к целому числу.
Теперь я могу отсортировать по населению, если страна равна. Этот вид работает правильно.
Все идет нормально. Но мне нужно, чтобы разделить тысячи / миллионы на печать населения.
Если я использую строку, с «.» для населения сортировка не работает правильно.
Его отсортировано как:
х …….. х …… 1.123456
х …….. х …… 10.123.456
х …….. х …… 2.123.232
Это должно выглядеть так:
Австралия …….. Сидней ……… 10.123.456
Австралия …….. Brisbane ……. 8.123.456
Есть ли способ манипулировать печатью, добавив разделитель в int снова?
Спасибо заранее
imbue()
выходной поток с место действия который имеет желаемый разделитель. Например:
#include <iostream>
#include <locale>
int main()
{
// imbue the output stream with a locale.
int i = 45749785;
std::cout << i << "\n";
std::cout.imbue(std::locale(""));
std::cout << i << "\n";
}
Вывод на мою машину (а онлайн демо):
45749785 45749785
Как прокомментировал, так и ответил, Джеймс Канзе наполнить входной поток также, чтобы прочитать разделенный int
значения без изменения вручную ввода.
Смотри Страустропа Приложение D: Локали для подробного обзора локалей.
Используйте локаль, которая поддерживает желаемые разделители, чтобы прочитать
файл (таким образом, вы можете прочитать значения как целые числа), и
та же локаль для записи данных.
Обратите внимание, что у вас может не быть такой локали, или если вы
делать, вы можете не знать его имя (и использование именованного языка может
изменить другие вещи, которые вы не хотите изменить); на моем
машина, imbue
с ""
ведет себя по-разному в соответствии с
компилятор (или, возможно, оболочка, из которой я его вызываю) — вы
никогда не следует использовать локаль ""
если у вас строгое форматирование
требования. (Использование локали ""
для случая, когда вы
хочу формат зависит от среды пользователя
технические характеристики.)
В этом случае, вероятно, лучше предоставить локально:
class MyNumPunct : public std::numpunct<char>
{
protected:
virtual char do_thousands_sep() const { return ','; }
virtual std::string do_grouping() const { return "\03"; }
};
int
main()
{
std::cout.imbue( std::locale( std::locale::classic(), new MyNumPunct ) );
std::cout << 123456789 << std::endl;
return 0;
}
Конечно, вы также захотите использовать эту локаль для ввода.
(Этот код даст вам "C"
локаль, только с
группировка изменилась.)