MENÜ

Honlap címe

Előző - #32 Karakterláncok konvertálása egész számokká | Tartalomjegyzék | Következő - #34 nagybetűk

33. GYAKORLAT: VESSZŐVEL FORMÁLT SZÁMOK

commaFormat(12345)  →  '12,345'

Az Egyesült Államokban és az Egyesült Királyságban a számok számjegyei vesszővel vannak csoportosítva minden három számjegyben. Például a 79033516 szám 79 033 516-ként van írva az olvashatóság érdekében. Ebben a gyakorlatban olyan függvényt ír, amely egy számot vesz fel, és egy számsort ad vissza vesszővel.

Gyakorlat leírása

Írjon commaFormat()függvényt számparaméterrel . A paraméter argumentuma egész vagy lebegőpontos szám lehet. A függvény egy ebből a számból álló karakterláncot ad vissza megfelelő US/UK vesszőformátumban. Az egész számrészben minden harmadik számjegy után vessző van. A tört részben egyáltalán nincsenek vesszők: Az 1234.5678 helyes vesszőformátuma 1,234.5678, nem pedig 1,234.567,8.           

Ezek a Python- assertutasítások leállítják a programot, ha feltételük False. Másolja őket a megoldási program aljára. Az Ön megoldása akkor helyes, ha a következő assertállítások feltételei mind igazak :

assert commaFormat(1) == '1'

assert commaFormat(10) == '10'

assert commaFormat(100) == '100'

assert commaFormat(1000) == '1000'

assert commaFormat(10000) == '10 000'

assert commaFormat(100000) == '100 000'

assert commaFormat(1000000) == '1 000 000'

assert commaFormat(1234567890) == '1,234,567,890'

assert commaFormat(1000.123456) == '1,000.123456'

Próbáljon megoldást írni a leírásban szereplő információk alapján. Ha továbbra is problémái vannak ennek a gyakorlatnak a megoldásával, további tippekért olvassa el a Megoldástervezés és a Különleges esetek és Gotchák című részt.

Előfeltétel fogalmak: karakterláncok, str(), inoperátor, index(), szeletek, karakterlánc-összefűzés

Megoldás tervezése

Annak ellenére, hogy számokat tartalmaz, ez a gyakorlat valójában a szövegmanipulációról szól. A karakterlánc karakterei csak numerikus számjegyek.

numberElőször az argumentumot karakterláncsá alakítjuk a str()függvénnyel. Ez akkor működik, ha a szám egész vagy lebegőpontos szám. Miután megkaptuk a számot karakterláncként, ellenőrizhetjük, hogy van-e olyan pont, amely azt jelzi, hogy lebegőpontos számról van szó, amelynek tört része. A kifejezés '.' in numberkiértékelése igaz , ha a számban szereplő karakterláncnak van pontja. Ezután megkereshetjük number.index('.')ennek a periódusos karakternek az indexét. (A index()metódus ValueError kivételt vet fel, ha '.' nem jelenik meg a karakterláncban, de az előző '.' számban kifejezett kifejezés garantálja, Truehogy megjelenik.)

Ezt a tört részt el kell távolítanunk a listából, number miközben egy másik változóba mentjük, hogy később visszaadjuk. Így csak vesszőt adunk az argumentum egész számához number , függetlenül attól, hogy egész szám vagy lebegőpontos szám volt-e.

Ezután kezdjük el a triplet és nevű változókat commaNumberüres karakterláncként. Miközben a számjegyein áthurkoljuk numbera triplet változót, addig tárolja a számjegyeket, amíg nem lesz belőlük három, ekkor commaNumbervesszővel hozzáadjuk őket (amely a szám vesszővel formált változatát tartalmazza). Amikor először hármast adunk a számhoz commaNumber, egy plusz vessző lesz a szám végén. Például a '248'commaNumber triplet a következővel egészül ki '248,'. Közvetlenül a szám visszaadása előtt eltávolíthatjuk a felesleges vesszőt.

A számban az egyes helyétől kezdődően, balra haladva kell ciklust végeznünk, így fora ciklusunk fordítva kell, hogy működjön: for i in range(len(number) - 1, -1, -1). Például, ha numberis 4096, akkor a ciklus első iterációja elérheti number[3], a második iteráció elérheti number[2]és így tovább. Így az első hármas a . '096' helyett '409'.

Ha a ciklus véget ér, és vannak maradék számjegyek a tripletbencommaNumber , vesszővel adja hozzá őket a következőhöz. Végül térjen vissza, commaNumberkivéve, ha a vessző a végén csonkolva van: commaNumber[:-1] mindenre kiértékeli, commaNumberkivéve az utolsó karaktert.

Végül vissza kell adnunk a tört részt a számhoz, ha eredetileg volt ilyen.

Különleges esetek és Gotchák

Számos hiba fordulhat elő a kódunkban. A kód megírása előtt meg kell fontolnunk őket, hogy biztosíthassuk, ne osonjanak el mellettünk. Ezek a hibák a következők lehetnek:

  • Vessző a szám végén, 386 pl'386,'
  • Vessző a szám elején, 499000 pl',499,000'
  • A tört részben megjelenő vesszők, pl. 12.3333 képző'12.3,333'
  • Hármasok csoportosítása fordított sorrendben, pl. 4096 előállítás'409,6'

Bárhogyan is kezeli ezt a gyakorlatot, győződjön meg arról, hogy a kódja nem követi el ezeket a hibákat.

Most próbáljon meg egy megoldást írni az előző szakaszok információi alapján. Ha továbbra is problémái vannak a gyakorlat megoldásával, olvassa el a Megoldássablon részt további tippekért.

Megoldás sablon

Próbáljon először megoldást írni a semmiből. De ha nehézségei vannak, akkor a következő részprogramot használhatja kiindulási helynek. Másolja ki a következő kódot a https://invpy.com/commaformat-template.py webhelyről , és illessze be a kódszerkesztőbe. Cserélje ki az aláhúzást kódra, hogy működő programot készítsen:

def vesszőformátum(szám):

    # A szám átalakítása karakterláncra:

    szám = str(____)

 

    # Ne felejtse el a tört részt, és távolítsa el a számból, ha van:

    ha '.' ban ben ____:

        fractionalPart = number[number.index(____):]

        number = number[:number.index('.')]

    else:

        fractionalPart = ''

 

    # Create a variable to hold triplets of digits and the

    # comma-formatted string as it is built:

    triplet = ____

    commaNumber = ____

 

    # Loop over the digits starting on the right side and going left:

    for i in range(len(number) - 1, ____, ____):

        # Add the digits to the triplet variable:

        triplet = ____[i] + ____

        # When the triplet variable has three digits, add it with a

        # comma to the comma-formatted string:

        if ____(triplet) == ____:

            commaNumber = triplet + ',' + ____

            # Reset the triplet variable back to a blank string:

            triplet = ____

 

    # If the triplet has any digits left over, add it with a comma

    # to the comma-formatted string:

    if triplet != '':

        commaNumber = ____ + ',' + ____

 

    # Return the comma-formatted string:

    return ____[:____] + fractionalPart

The complete solution for this exercise is given in Appendix A and https://invpy.com/commaformat.py. You can view each step of this program as it runs under a debugger at https://invpy.com/commaformat-debug/.

Prev - #32 Convert Strings To Integers | Table of Contents | Next - #34 Uppercase Letters

 

 

Asztali nézet