Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C#] String formatting

Pagina: 1
Acties:

  • Gwannoes
  • Registratie: Juni 2002
  • Laatst online: 25-08 21:23

Gwannoes

Solderen moet je leren

Topicstarter
Een string formatteren in c# is niet zo moeilijk, maar het lijkt er op dat wat ik nu wil niet (zomaar) mogelijk is.

Ik wil een (double) getal zo formatteren dat het altijd binnen bijv. 7 karakters wordt afgebeeld (m.u.v. negatieve nummers; die mogen 1 karakter meer voor het min-teken).
Momenteel gebruik ik:
C#:
1
2
3
Double Value;
String text;
text = Value.ToString("G6");

1.23456789 geeft 1.23457
123456789 geeft 1.23457E8 (of zoiets)

Allemaal prima, maar waar ik niet zo blij mee ben:
1.23 geeft 1.23 terwijl ik graag 1.23000 zou willen.
Is op te lossen door:
C#:
1
text = String.Format("{0:0.00000}",value);

Maar het grote nadeel hieraan is dat dit zorgt voor een vast aantal karakters achter de komma, terwijl ik dat bij bijv. 1234.56789 niet wil (dan wil ik 1234.57 weergeven). Is dus ook geen optie.

Iemand die hier wat voor weet?

Samenvatting:
Ik wil een x aantal significante cijfers weergeven. Indien nodig automatisch naar E-notatie overgaan. Evt. aanvullen met trailing zeros.
Hoe los ik dit op?

Hmmz, hier komt dus m'n sig


  • BramFokke
  • Registratie: Augustus 2007
  • Laatst online: 04-10-2024
Je geeft aan dat je het resultaat binnen 9 karakters wilt houden, maar alle voorbeelden hebben 7 cijfers. Zit hier een reden achter?

  • Gwannoes
  • Registratie: Juni 2002
  • Laatst online: 25-08 21:23

Gwannoes

Solderen moet je leren

Topicstarter
BramFokke schreef op dinsdag 09 september 2008 @ 14:36:
Je geeft aan dat je het resultaat binnen 9 karakters wilt houden, maar alle voorbeelden hebben 7 cijfers. Zit hier een reden achter?
oh nee, sorry. Gewoon binnen "een aantal" karakters. Het ging meer om het idee.
Ik zal m'n post even aanpassen.
Voorbeelden zijn overigens 8 karakters toch?

[ Voor 11% gewijzigd door Gwannoes op 09-09-2008 14:43 ]

Hmmz, hier komt dus m'n sig


  • BM
  • Registratie: September 2001
  • Laatst online: 20:40

BM

Moderator Spielerij
Ben niet zo'n held met formatting codes, maar zou je op de uiteindelijk string niet gewoon een PadRight("0",8) kunnen doen, zodat je string aangevuld word met 0'en tot de lengte 8 bereikt is?

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


  • BramFokke
  • Registratie: Augustus 2007
  • Laatst online: 04-10-2024
Gwannoes schreef op dinsdag 09 september 2008 @ 14:42:
[...]

oh nee, sorry. Gewoon binnen "een aantal" karakters. Het ging meer om het idee.
Ik zal m'n post even aanpassen.
Voorbeelden zijn overigens 8 karakters toch?
1.23000 en 1234.57 zijn beiden 7 karakters. Maar String.Format() kan volgens mij niet wat jij wilt. Als ik goed begrijp wat je wilt, zou de volgende code moeten werken.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static string FormatString(double n, int length) {
    string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    string exponential = n.ToString("E");
    string normal = n.ToString();
    if(!normal.Contains(decimalSeparator)) {
        return normal;
    } else {
        if(normal.Length > length) {
            return exponential;
        } else {
            return normal.PadRight(length, '0');
        }
    }
}

  • Gwannoes
  • Registratie: Juni 2002
  • Laatst online: 25-08 21:23

Gwannoes

Solderen moet je leren

Topicstarter
BramFokke schreef op dinsdag 09 september 2008 @ 14:59:
[...]
1.23000 en 1234.57 zijn beiden 7 karakters. Maar String.Format() kan volgens mij niet wat jij wilt. Als ik goed begrijp wat je wilt, zou de volgende code moeten werken.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static string FormatString(double n, int length) {
    string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    string exponential = n.ToString("E");
    string normal = n.ToString();
    if(!normal.Contains(decimalSeparator)) {
        return normal;
    } else {
        if(normal.Length > length) {
            return exponential;
        } else {
            return normal.PadRight(length, '0');
        }
    }
}
De "." is ook een karakter toch?
Anyway... als ik het zelf in elkaar moet knutselen lukt het mel wel, alleen hoopte ik dat er een standaard format string voor bestaat.
BM schreef op dinsdag 09 september 2008 @ 14:57:
Ben niet zo'n held met formatting codes, maar zou je op de uiteindelijk string niet gewoon een PadRight("0",8) kunnen doen, zodat je string aangevuld word met 0'en tot de lengte 8 bereikt is?
Niet helemaal... 0.9999999999 wordt afgerond naar 1. Als je daar .PadRight op uitvoert, krijg je geen komma in het getal.

Hmmz, hier komt dus m'n sig


  • BramFokke
  • Registratie: Augustus 2007
  • Laatst online: 04-10-2024
Gwannoes schreef op dinsdag 09 september 2008 @ 15:08:
[...]

De "." is ook een karakter toch?
Zeker.

1234.57 wordt dan ook
1 <= 1 karakter
12 <= 2 karakters
123 <= 3 karakters
1234 <= 4 karakters
1234. <= 5 karatkers
1234.5 <= 6 karakters
1234.57 <= 7 karakters.
Anyway... als ik het zelf in elkaar moet knutselen lukt het mel wel, alleen hoopte ik dat er een standaard format string voor bestaat.
OK, snap ik. Helaas schiet het format mechanisme van .NET altijd net tekort en is het niet uitbreidbaar zonder overal een IFormatProvider mee te sturen.

[ Voor 3% gewijzigd door BramFokke op 09-09-2008 15:26 ]


  • Gwannoes
  • Registratie: Juni 2002
  • Laatst online: 25-08 21:23

Gwannoes

Solderen moet je leren

Topicstarter
BramFokke schreef op dinsdag 09 september 2008 @ 15:22:
[...]

Zeker.

1234.57 wordt dan ook
1 <= 1 karakter
12 <= 2 karakters
123 <= 3 karakters
1234 <= 4 karakters
1234. <= 5 karatkers
1234.5 <= 6 karakters
1234.57 <= 7 karakters.
:X
|:(

Hmmz, hier komt dus m'n sig


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
BramFokke schreef op dinsdag 09 september 2008 @ 15:22:
1234.57 wordt dan ook
1 <= 1 karakter
12 <= 2 karakters
123 <= 3 karakters
1234 <= 4 karakters
1234. <= 5 karatkers
1234.5 <= 6 karakters
1234.57 <= 7 karakters.
Weet je dat wel zeker? Een formatting functie mag toch nooit getallen voor de komma weggooien zoals bij de eerste 3 regels het geval is?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

[b][message=30716108,noline]farlane schreef op woensdag 10 september 2008 @
Weet je dat wel zeker? Een formatting functie mag toch nooit getallen voor de komma weggooien zoals bij de eerste 3 regels het geval is?
Ik heb meer het idee dat hier zeer expliciet het aantal karakters van een getal werden getelt.

Maar als je kijkt naar FormatString functie van BramFokke, dan zie dat als als het getal zelf al groter is dan de gewenste lengte, direct het originele getal volledig wordt terug gegeven.

Verander de signature naar:
C#:
1
public static string ToString(this double n, int length)

En je hebt via extensions een standaard 'override' op de double formatering.

If it isn't broken, fix it until it is..

Pagina: 1