2013-03-01 11 views
5

Ho un metodo come questo:Un modo di scrivere grandi letterali numerici in C#

Prefix GetPrefix(decimal value) 
{ 
    if(value > 11000000000000000000) 
     return Prefix.CosmicBig; 
    if(value > 1000000000000000) 
     return Prefix.ReallyBig; 
    if(value > 3000000000000) 
     return Prefix.Big; 
    if(value > 50000000) 
     return Prefix.Okay; 
    if(value > 750000) 
     return Prefix.MostlyNormal; 
    if(value > 750000) 
     return Prefix.SoSo; 
    if(value > 750) 
     return Prefix.Small; 
    return Prefix.MiserablySmall; 
} 

I valori esatti non sono importanti. Ciò che importa è che a volte vengono cambiati (i prefissi vengono utilizzati per il disegno e alcune aree di testo modificano le dimensioni durante lo sviluppo). Sto cercando un modo per scrivere questi letterali in un modo facilmente comprensibile da un umano che lo modifica, senza dover contare tutti gli zeri. Un separatore sarebbe carino. Ho pensato di scrivere 11 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000, ma questo è solo a malapena più gestibile. Usare Math.Pow() lo fa un po 'meglio, ma non mi piace usare questi calcoli per definire le costanti.

+0

La velocità della luce in metri al secondo va bene, ma pi è miseramente piccola ... :-) –

risposta

15

È possibile introdurre metodi di estensione per int:

750.Thousand(); 
5.Million(); 
100.Billion(); 

L'attuazione di questi metodi è semplice:

public static int Thousand(this int value) 
{ 
    return value * 1000; 
} 

public static int Million(this int value) 
{ 
    return value.Thousand() * 1000; 
} 

// etc. 

Assicurarsi di restituire il tipo di dati appropriato dei metodi per grandi numeri:

public static long Billion(this int value) 
{ 
    return value.Million() * 1000; 
} 

sfortunatamente, si avrà scrivere quei metodi per ogni tipo di integrale o floating point che si desidera supportare.

Avere una serie completa di tali metodi di estensione permetterebbe di esprimere le vostre grandi numeri in modo naturale relativly, anche quando non sono solo tutti zeri alla fine:

100.Billion() + 30.Thousand() + 300 // == 100,000,030,300 

Se si desidera ottenere fantasia, si potrebbe anche pensare a loro nidificazione:

100.Billion(30.Thousand(300)) 

Ma penso che sarebbe perdere un po 'espressività, perché la gente avrebbe chiedersi cosa significa il parametro.

Eppure, implementazione sarebbe simile a questa:

public static long Billion(this int value, long add) 
{ 
    return value.Million() * 1000 + add; 
} 

L'utilizzo di questi metodi di estensione ha un piccolo svantaggio: I numeri non sono più in fase di compilazione costanti. Sono calcolati in fase di esecuzione. Nella stragrande maggioranza dei casi, questo non dovrebbe essere un problema.

+0

Questa sintassi non funzionerebbe in Javascript. Lo fa in C#? –

+0

@ JanDvorak: certo. Ecco i metodi di estensione. –

+1

Un modo fantastico per farlo. – evanmcdonnal

19

Invece di 11000000000000000000 è possibile utilizzare 11e18. Utilizzare m per indicare che è un decimale, quindi 11e18m.

Problemi correlati