Zapis liczb w formacie wielu znaków

0

Już wyjaśniam o co chodzi. Potrzebuję wyświetlać cyfry z przedziału 1-1mln w siedmiu znakach. tj jeżeli cyfra jest mniejsza od miliona to od lewej od jej wartości powinny zostać zera, tak by wypełniały 7 pól.
Np cyfra 553, powinna być zapisana jako 0000553, cyfra 3030 jako 0003030 itd. Mama pytanko. Czy jest jakaś biblioteka w C/C++ która taki zapis realizuje, lub istnieje jakiś "sprytny" i szybki sposób by takie coś osiągnąć? Bo tak na pierwszy rzut oka pozostają boje z if-ami, ktore będą sprawdzać, wartości pomiędzy 10,100,1000,10000 i w zależności od tego przypisywanie wszystko do stringa plus dodanie różnej ilości "0" do końcowego wyrażenia.

0
Saalin napisał(a):

Hasło do wyszukiwania - pad left.

https://stackoverflow.com/questions/1714515/how-can-i-pad-an-int-with-leading-zeros-when-using-cout-operator

Dzięki, skorzystalem ostatecznie z setfill i setw

0

Udało się Programik działa i wypisuje prawidłowo format:

int main(int argc, char **argv)
{
	 int i,ile_zer,liczba,temp;
	 string wynik;
	 cin>>liczba;
	 
	 if(liczba==1000000)
	 {
	  wynik="1000000";
	  std::cout<<wynik<<endl;
	 }
	  else
	  {
	 if(liczba<10)
	 {
	  ile_zer=6;temp=1;
	 }
	 else if(liczba>=10 && liczba<100)
	 {
	  ile_zer=5; temp=2;
	 }
	 else if(liczba>=100 && liczba<1000)
	 {
	  ile_zer=4; temp=3;
	 }
	 else if(liczba>=1000 && liczba<10000)
	 {
	  ile_zer=3; temp=4;
	 }
	 else if(liczba>=10000 && liczba<100000)
	 {
	  ile_zer=2; temp=5;
	 }
	 else
	 {
	  ile_zer=1; temp=6;
	 }
	 std::cout<<std::setfill('0')<<std::setw(ile_zer+temp)<<liczba;
	 }
	return 0;
}

5

@davout:

Kawał "dobrej", nikomu nie potrzebnej roboty, jeśli rozwiązaniem jest

std::cout<<std::setfill('0')<<std::setw(7)<<liczba;

Jak to wykoncypowałeś z podanego linka? Tam wszystko jest prawidłowo.

0
ZrobieDobrze napisał(a):

@davout:

Kawał "dobrej", nikomu nie potrzebnej roboty, jeśli rozwiązaniem jest

std::cout<<std::setfill('0')<<std::setw(7)<<liczba;

Jak to wykoncypowałeś z podanego linka? Tam wszystko jest prawidłowo.

Potrzebuję wartości powyższych zmiennych (ile_zer i temp ) do dalszych działań. Przy okazji sprawdziłem czy dobrze są wyliczone.

4

Użyj std::log10std::floor, nie będziesz musiał mieć drabinki ifów.

0

floor(log10(n)+1) or int(log10(n)+1)

#include <iostream>
#include <cmath>
#include <iomanip>

using namespace std;

int main()
{
    for(size_t n{0},l{0},s{7};(cout<<"Enter num: ")&&(cin>>n)&&(l=floor(log10(n)+1));
    cout<<setfill('0')<<setw(s)<<n<<" \t\t filled: ",(l<s?(cout<<(s-l)):(cout<<log2(1))),
    cout<<" entered: "<<l<<" digits",cout<<(char)(0x0A)<<(char)(0x0A)){}

    return log10(1);
}
1
std::to_string(liczba).length()

1 użytkowników online, w tym zalogowanych: 0, gości: 1