2010-07-26 9 views
11

Cercando di non ripetermi (per essere ASCIUTTO) qui, aiutami. =)Come convertire in modo intelligente e sicuro un doppio in stringa?

Ho un doppia che rappresenta un rating/5.

I valori possibili sono:

0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5. 

voglio convertire questo in una stringasenza il decimale.

Così i valori sarebbero diventati:

"0", "05", "1", "15", "2", "25", "3", "35", "4", "45", "5". 

perché sto facendo questo? Perché sto cercando di creare un collegamento dinamico in base al valore:

string link = "http://somewhere.com/images/rating_{0}.gif"; 
return string.Format(link, "15"); 

I valori possibili sono gestite/convalidato altrove, in altre parole, posso essere sicuro al 100% il valore sarà sempre uno di quelli che ho citato .

Qualche idea? Qualche formato speciale che posso usare nel metodo .ToString()? O sono bloccato con una dichiarazione di interruttore non-DRY? O posso fare sfacciatamente un decimal.ToString().Replace(".","")?

EDIT:

Whoah, grazie per tutte le risposte ragazzi! =)

La maggior parte delle risposte è corretta, quindi lascerò questa opzione aperta per un giorno o più e selezionerò la risposta con il maggior numero di voti.

In ogni caso, ho finito per la creazione di un semplice metodo di estensione:

public static string ToRatingImageLink(this decimal value) 
    { 
     string imageLinkFormat = "http://somewhere.com/images/rating_{0}.gif"; 
     return string.Format(imageLinkFormat, value.ToString().Replace(".0", string.Empty).Replace(".", string.Empty); 
    } 

Immagino che fosse un caso di "Kiss" e "DRY". In questo caso lo zucchero sintattico dei metodi di estensione lo ha tenuto ASCIUTTO, e l'attuale implementazione a una riga soddisfa KISS.

+0

Ho cercato di creare un 'NumberFormatInfo', ma ottenere 'Separatore decimale non può essere la stringa vuota'. Vergogna. – Kobi

+1

+1 per chiedere una domanda ben strutturata – hydrogen

risposta

9

separatore decimale dipende dalle preferenze cultura correnti:

d.Replace(
    System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator, 
    String.Empty) 

sostituirà '.' o ',' con ""

+1

Probabilmente è più semplice usare CultureInfo quando si converte il numero in stringa, come suggerito da altre risposte. Quindi * conosci * il formato della stringa e puoi semplicemente sostituire il punto. – Kobi

+0

@Kobi: Sì, quando si sa e assolutamente che il delimitatore è punto non virgola.Il delimitatore dinamico è molto facile da usare, riduce al minimo le stringhe di hardcoding e molto intelligente come OP ha chiesto – abatishchev

2

Vorrei semplicemente utilizzare il metodo "sfacciatamente" che descrivi alla fine. Nella pura semantica della cosa, stai manipolando una stringa, non il numero effettivo, quindi penso che una sostituzione di stringa sarebbe esattamente la prescrizione corretta qui.

Se si vuole davvero complicarlo, prendere in considerazione la creazione di un nuovo IFormatProvider per questa situazione. Questo sarebbe un modo migliore per individuare potenziali errori, ma aggiunge uno strato di complessità.

0

Si può chiamare ToString(), e quindi utilizzare un'espressione regolare come la sostituzione "([0-9])\\.([0-9])" with "\\1\\2", che, anche se ancora un po 'di hack, sarebbe meno fragile di quanto Replace(".","")

+3

Questo sembra un sovraccarico se controlla entrambi gli estremi della conversione, che sembra come lui. – codekaizen

+0

Come ho detto nella domanda, posso essere sicuro del formato del doppio, in quanto esiste un metodo di estensione esistente che arrotonda alla metà più vicina. Speravo in un metodo di estensione secondario che restituisce la stringa. cioè double.RoundToNearestHalf(). ToImageLink(). – RPM1984

+0

Per quanto mi piacciano le espressioni regolari (e lo faccio), .net può gestirlo meglio. Comunque, qualcosa come "Regex.Replace" ("1.5", @ "\ D", "") 'è probabilmente più robusto, la tua regex fa ipotesi specifiche sul formato della stringa. – Kobi

1

Utilizzare una tabella hash/dizionario e mantenere le mappature da doppio da mettere dentro.Che sarà molto più robusto e più semplice di effettuare il parsing vostro doppio

+0

Qual è la differenza tra questo e uno switch hard coded/if else statement? L'unica differenza è la possibilità di eseguire una ricerca, ma il codice effettivo che deve ancora essere hard coded (cioè items.Add (0.5, "05")) – RPM1984

+0

Un hashtable potrebbe potenzialmente aumentare le prestazioni se hai a che fare con tabelle di ricerca più grandi , ma per una lista tanto piccola come il tuo esempio starai meglio con una dichiarazione gigante dell'interruttore. – drharris

+0

Vero, e se esiste un modo semplice diretto per farlo, allora non dovremmo usare un dizionario. Tuttavia, se dovessi analizzare e mettere un po 'di logica di manipolazione delle stringhe, eviterei semplicemente questo perché è soggetto a errori. –

4

Se potessi vivere con le stringhe come 00, 05, 10, 15, 20 ... ecc., puoi semplicemente utilizzare

(rating * 10).ToString("00") 

Se Non, utilizzare InvariantCulture come argomento di ToString al fine di forzare l'uso di un punto decimale (" ') in tutti i paesi (in Germania il default sarebbe'," per esempio):

rating.ToString(CultureInfo.InvariantCulture).Replace(".",""); 
+0

'Sostituisci (". "," ")' Sembra il modo migliore. – Kobi

-1

non fare prova a trovare una risposta più semplice a qualcosa che è già semplice. Il modo più semplice per farlo è quello di utilizzare questo codice:

double dblNumber = 1.5; 
string strDouble = dblNumber.ToString("N1").Replace(".","").Trim('0'); 

Se si tratta di qualcosa che si sta per fare un sacco, avvolgerlo in una funzione:

string ConvertToString(double dblNumber) 
{ 
    return dblNumber.ToString("N1").Replace(".","").Trim('0'); 
} 
+0

Ho pensato a 'TrimEnd', ma tenete a mente che gira' 0' a '" "'. 'Trim' trasforma anche' 05' in '5', che è sbagliato. – Kobi

+0

La parte 'Trim ('0')' non è corretta. Non ci potrebbe mai essere uno "0" output ... – MartinStettner

2

si può semplicemente utilizzare Replace(".", string.Empty); senza la necessità di Replace(".0", string.Empty)

controllo il codice qui sotto

double[] x = { 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5 }; 
      foreach (var item in x) 
      { 
       listBox1.Items.Add(item.ToString().Replace(".", string.Empty)); 
      } 

il risultato sarà alt text http://img689.imageshack.us/img689/6591/doubletostring.jpg

+0

+1 per aver trovato il tempo di provare la tua risposta e mostrando la prova del suo funzionamento. – RPM1984

1

Per evitare confusione con formati decimali, Vorrei formattare l'intera parte come un intero e utilizzare una ricerca di matrice per la parte frazionaria:

public static string ToRatingImageLink(this decimal value) 
{ 
    string imageLinkFormat = "http://somewhere.com/images/rating_{0}{1}.gif"; 
    int index = decimal.ToInt32(decimal.Round(value * 2)); 
    return string.Format(imageLinkFormat, index/2, Suffix[index % 2]); 
} 

static readonly string[] Suffix = { "", "5" }; 
Problemi correlati