Вывести целое число с разделителем тысяч и миллионов

Возник вопрос о печати целых чисел с разделителем тысяч / миллионов.

Я получил текстовый файл, где я получил страну, город, общее население.

Я должен читать в файле и сортировать по стране. Если страна реальна, я должен сортировать по убыванию населения.

Текстовый файл похож на:

Австралия …….. Сидней ……… 10.123.456

Бразилия ……….. Сан-Паулу ……. 7.123.345

Я прочитал все 3 в отдельной строке. Затем я стираю все «.» в строке населения. Затем я использую atoi () для приведения строки населения к целому числу.

Теперь я могу отсортировать по населению, если страна равна. Этот вид работает правильно.

Все идет нормально. Но мне нужно, чтобы разделить тысячи / миллионы на печать населения.

Если я использую строку, с «.» для населения сортировка не работает правильно.
Его отсортировано как:

х …….. х …… 1.123456

х …….. х …… 10.123.456

х …….. х …… 2.123.232

Это должно выглядеть так:

Австралия …….. Сидней ……… 10.123.456

Австралия …….. Brisbane ……. 8.123.456

Есть ли способ манипулировать печатью, добавив разделитель в int снова?

Спасибо заранее

6

Решение

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: Локали для подробного обзора локалей.

12

Другие решения

Используйте локаль, которая поддерживает желаемые разделители, чтобы прочитать
файл (таким образом, вы можете прочитать значения как целые числа), и
та же локаль для записи данных.

Обратите внимание, что у вас может не быть такой локали, или если вы
делать, вы можете не знать его имя (и использование именованного языка может
изменить другие вещи, которые вы не хотите изменить); на моем
машина, 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" локаль, только с
группировка изменилась.)

10

По вопросам рекламы [email protected]