Számjegyek formázása ToString....

Címkék
Számjegyek formázása ToString....
2022-09-27T12:18:52+02:00
2022-09-29T13:31:39+02:00
2022-12-07T03:40:48+01:00
thomasz007
Van pár szám értékem.
Pl.
1234567,123456
12345
123,12

Ezek most double változóban vannak tárolva.
A ToString()-el szeretném formázva megjeleníteni.

1. tízedes jegyből annyi jelenjen meg amennyi van benne. Ha nincs akkor ne legyen semmi.
2. a sima számokat pedig ezres csoportokra szeretném ha bontaná megjelenítéskor.

Ezt hogy lehet megoldani?
A számok és azok tizedesjegyei nem fix-ek, bármilyen előfordulhat.

CulturInfot is próbáltam, de ott meg kell adni pl. "C" string formát ahol az ezres csoportok jók, de tizedesjegyek már nem automatikusak, fix hossz van mindig.
Mutasd a teljes hozzászólást!
A lényeg, válaszd a szam.ToString(NTizedesjegyeszáma) alakot. pl. szam.ToString(N6). Meg kell határozni a tizedes jegyek számát. Ezt több féle képpen is meg lehet tenni, itt egy másik módszer:

double szam = Convert.ToDouble(textBox1.Text); Tizedes = GetDecimalPlaces(textBox1.Text).ToString(); formatum = "N" + Tizedes; textBox2.Text = szam.ToString(formatum); public static int GetDecimalPlaces(string strSzam) { int nTeljesHossz = Convert.ToInt32(strSzam.Length); double egeszszam = Math.Truncate(Convert.ToDouble(strSzam)); int nEgeszSzamjegyek= egeszszam.ToString().Length; int decimalPlaces = (nTeljesHossz - nEgeszSzamjegyek); if (decimalPlaces > 0) { decimalPlaces = decimalPlaces - 1; } return decimalPlaces; }
Remélem tudtam segíteni!
Mutasd a teljes hozzászólást!

  • Valami ilyesmit találtam, ez jó?

    ToString("0,0.##########")

    0,0 jelzi hogy ezres csoportra ossza a számot.
    .###### pedig annyi tizedes számot jelenit meg amennyi van. itt ha kevesebb van akkor levágja a végét, ezért adtam meg ennyit. Ebbe max ennyi tizedesszám fér bele, de ha kevesebb van akkor többi hely nem látszódik.

    Ez jó lenne?
    Mutasd a teljes hozzászólást!
  • Ha neked jó, akkor igen, de azért tartsd észben azt, hogy ha 0.1-et teszel egy ilyen változóba, az kettes számrendszerben az alábbi kettő valamelyike lesz:

    0.09999999999999999167332731531132594682276248931884765625 0.1000000000000000055511151231257827021181583404541015625
    Mutasd a teljes hozzászólást!
  • decimal szam = Convert.ToDecimal(textBox1.Text); Tizedes = GetDecimalPlaces(szam).ToString(); formatum = "N" + Tizedes; textBox2.Text = szam.ToString(formatum); } public static int GetDecimalPlaces(decimal n) { n = Math.Abs(n); //make sure it is positive. n -= (int)n; //remove the integer part of the number. var decimalPlaces = 0; while (n > 0) { decimalPlaces++; n *= 10; n -= (int)n; } return decimalPlaces; }
    Kicsit bonyolultabb, de jól működik ...
    Mutasd a teljes hozzászólást!
  • A lényeg, válaszd a szam.ToString(NTizedesjegyeszáma) alakot. pl. szam.ToString(N6). Meg kell határozni a tizedes jegyek számát. Ezt több féle képpen is meg lehet tenni, itt egy másik módszer:

    double szam = Convert.ToDouble(textBox1.Text); Tizedes = GetDecimalPlaces(textBox1.Text).ToString(); formatum = "N" + Tizedes; textBox2.Text = szam.ToString(formatum); public static int GetDecimalPlaces(string strSzam) { int nTeljesHossz = Convert.ToInt32(strSzam.Length); double egeszszam = Math.Truncate(Convert.ToDouble(strSzam)); int nEgeszSzamjegyek= egeszszam.ToString().Length; int decimalPlaces = (nTeljesHossz - nEgeszSzamjegyek); if (decimalPlaces > 0) { decimalPlaces = decimalPlaces - 1; } return decimalPlaces; }
    Remélem tudtam segíteni!
    Mutasd a teljes hozzászólást!
  • Ja ezt értem :)
    Függvényel kiszeded hogy mennyi tizedejegyből áll.
    És ezt az értéket füződ a ToString formázási részéhez N?, C?
    Így mindig azt a számjegyet adja a hozzá amennyi karakterből áll a tizedes jegy.
    Erre nem gondoltam :)
    Mutasd a teljes hozzászólást!
  • Ezt pontosan nem értettem.
    Mert én kettesszámrendszerben nem jelenítek meg semmit.
    0 és 1 nem használom, pl 0011011
    Csak Integer, Double, ilyeneket.

    Tehát ha 0,1-et a tizedesjegy miatt mindig double változóban tárolom és az nem kettesszámrendszerbeli érték.
    Ha jól raktam össze a képet. :)
    Mutasd a teljes hozzászólást!
  • Igen! Megszámolom hány karakterből áll a szám. Aztán veszem az egész részét, azt is megszámolom. A kettőt kivonom egymásból, és megvan a tizedesek száma. Ha van tizedes, akkor van tizedes jel is, ezért ilyen esetben még egyet levonok. Próbálgattam mindenféle számra, nekem jól működött.
    Mutasd a teljes hozzászólást!
  • Köszi, ez jobban tetszett :) :) 

    Még formába öntöm és lesz egy fix függvényem.

    Mondjuk pont erre nem gondoltam, de logikus.
    Persze azt hittem van valami ToString paraméter erre, ahol ez rendelkezésre áll.
    De lehet saját függvényt is készíteni :) :)
    Mutasd a teljes hozzászólást!
  • A megoldásoddal két probléma van:

    A számok és azok tizedesjegyei nem fix-ek, bármilyen előfordulhat.

    Ezt Te írtad, és a formula ezt a feltételt nem teljesíti.

    Írjál be egy egész jegyű tizedest, vagy azt a bizonyos 0,1-et. (Elé tesz egy nullát.)
    Mutasd a teljes hozzászólást!
  • Akkor azt kérdezném meg, hogy egy ilyen double "belsőleg" hogyan tárolja a számot, ha nem kettes számrendszerben?
    Mutasd a teljes hozzászólást!
  • Még egy hibát találtam benne, a

    Math.Truncate

    résznél ha az érték pl. 0,123
    akkor a egészszámnak a 0 értéket nem adja vissza.
    tehát úgy veszi mintha nem lenne szám és ezzel a 3 tizedesjegy helyett csak 2-t kapunk vissza.

    Lehet átalakítom, úgy hogy megkeresem a tizedesjegy pozicióját, azt levonom a teljes hosszból és a maradékot kapom vissza ami a tizedesjegy.
    Mutasd a teljes hozzászólást!
  • Hát én ennyire nem megyek bele.
    Van egy integer, doubel típus és csak használom.
    Egészszámra vagy tizedesjegyű számokra.
    Azt hogy ezeket a típusokat hogy készítették, hogy működik belsőleg, azt nem nézem.
    Én csak arra használom amire alkalmas.

    De azért értem mire gondolsz.
    pl double értékben tárolok egy 12345.12345 értéket, és ezt megnézem akkor 12345.1234999999999999 értéket látok.
    És ha ezt jelenítem meg a #.0.#################### formában, akkor a sok 9-est is megjelenítem.

    De azt nem is értem, hogy ha van egy típusom double.
    Eltárok benne egy értéket, 12345.12345 akkor ebből miért csinál 12345.123499999999999 értéket, mert nem azt adtam meg.
    Ez nekem olyan ha integerben eltárom 123 és helyette 124 értéket jelenít meg.
    Mutasd a teljes hozzászólást!
  • Lehet átalakítom, úgy hogy megkeresem a tizedesjegy pozicióját, azt levonom a teljes hosszból és a maradékot kapom vissza ami a tizedesjegy.

    Persze, megcsinálhatod úgy is!
    Nem értem amúgy, én írtam egy példa programot és a Math.Truncate visszaadja a 0 értéket. leellenőriztem. Nálam teljesen jól működik!
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Segítek: belsőleg kettes számrendszert használ, és abban a véges tizedes törtek nagyrésze nem ábrázolható pontosan. (Pláne hogy a bitek száma is véges.)

    Floating Point Math
    Mutasd a teljes hozzászólást!
  • Off: Tesztelted sokjegyű számokra? Negatív számokra? Sokjegyű  negatív számokra?
    Mutasd a teljes hozzászólást!
  • Igen!
    Mutasd a teljes hozzászólást!
  • Hát igen, negatív számoknál még bejön a mínusz jel is, amit szintén le kell vonni!
    Mutasd a teljes hozzászólást!
  • Ha ennyire belemegyünk, akkor bocsi, ehhez már kevés vagyok!
    Mérnök vagyok és nem matematikus, vagy programozó. Az általam normálisnak gondolt határokban, pontosságban gondolkodtam. 
    Amúgy ez valós feladat, vagy valami iskolai feladvány?
    Mutasd a teljes hozzászólást!
  • Adtam pár teszt számot a tesztelésre.

    double teszt1 = 1.123; double teszt2 = 1.0; double teszt3 = 0.123456789; double teszt4 = 12345.12345; double teszt5 = -12345.12345; double teszt6 = -0.123;
    És az utolsónál 2 tizedesjegy értéket adott vissza, mintha a 0-t nem érzékelné.
    De most átalakítottam hogy szövegként kezelem és tizedesjegy pozicióját és a teljes karakterhosszt nézem és abból számolom ki a tizedesjegyek számát.
    De igen, van több megoldás is, csak nem akartam leragadni a Truncate fv-nél, így inkább más irányból indultam.
    És köszi, jó irányba vittél, mert ezen irányba nem gondolkoztam volna jó ideig. :)
    Mutasd a teljes hozzászólást!
  • Igen azt tudom, de sosem mentem ennyire bele, hogy miként működik.
    De ezt a részét nem tudtam, hogy nem tudja ábrázolni.
    Igazán sosem figyeltem, néztem és nem tünt fel. 
    Csak most láttam. :) :) 

    De csináltam egy klón verziót decimal típusra és ott már minden jól jelenik meg.
    Így áttérek arra hogy decimal számokkal dolgozom a double helyet.
    Ok nem bank részen kell fejleszteni így ritkán volt szükség tört részekre, főleg ami 5-10 tizedesig ment volna.

    Ahogy olvastam a decimal már tudja tárolni az értéket és kettesszámrendszerben sem lesz próbléma.
    Remélem nincs kisbetűs rész amit nem olvastam, hogy annyira még sem jó a decimal. :) :) :)
    Mutasd a teljes hozzászólást!
  • Hát igen, most teljesen kiteszteltem ezt a hibát amit írtál, a double és a kettesszámrendszer. :(

    pl 52811,68 - 52812 kivonok akkor elvileg ez -1,68 kellene lenni
    De ezt kapom: -0.31999999999970896 és ezzel is dolgozom tovább.
    Persze ha csak pár tizedesjegyig van jelentősége akkor nem tünik fel.

    És ha string-be alakítom a számot akkor meg ilyet tárol el 2,712E-06

    1. a pontatlan számolás :(
    2. tizedesszámot pedig E- formában jeleníti meg :(

    Azt vettem észre hogy Double számoknál élni kell ezzel a pontatlansággal és ha nem fontos a 10. 15. tizedes jegy értéke akkor számolni lehet vele.
    Továbbá itt jó tudni hogy mennyi tizedesjegyet jelentiek meg "N2" mikor string-ként jelenítem meg.

    Ezekre kell oda figyelni. :(

    Decimal típusnál ezeket nem vettem észre, az teljesen pontosan számol.
    És számot is jól jeleníti meg mikor stringet csinálok belöle.
    Csak oda kell figyelni NAGYON ha double típusú számot kapok valahonnan mert nem barátok a Decimal-al.
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd