Essayer de ne pas me répéter (à être sec) ici, aidez-moi à sortir. =)
J'ai un Les valeurs possibles sont les suivantes: P> 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);
}
8 Réponses :
J'utiliserais simplement la méthode "chèque" que vous décrivez à la fin. Dans la sémantique pure de la chose, vous manipulez une chaîne, pas le nombre réel, je pense donc qu'un remplacement de chaîne serait exactement la bonne ordonnance ici. P>
Si vous voulez vraiment surcharger, envisagez de créer une nouvelle iFormatProvider pour cette situation. Ce serait un meilleur moyen d'attraper des erreurs potentielles, mais elle ajoute une couche de complexité. P>
Vous pouvez appeler tostring () code>, puis utiliser une expression régulière comme remplaçant
"([0-9]) \\. ([0-9])" avec "\\ 1 \\ 2" code>,
qui, bien que toujours un peu de hack, serait moins fragile que
remplacer ("." "," ") code> p> p>
Cela ressemble à beaucoup de frais généraux s'il contrôle les deux extrémités de la conversion, qu'elle ressemble à elle.
Comme je l'ai dit dans la question, je peux être sûr du format du double, car il existe une méthode d'extension existante qui tourne à la moitié la plus proche. J'espérais une méthode d'extension secondaire qui retourne la chaîne. c'est-à-dire double.RoundToneAreesthalf (). toimagelink ().
Autant que j'aime les expressions régulières (et je le fais), .Net peut le gérer mieux. Néanmoins, quelque chose comme regex.replace ("1,5", @ "\ d", "") code> est probablement plus robuste, votre regex rend des hypothèses spécifiques sur le format de la chaîne.
Utilisez une hache / dictionnaire et conservez des mappages de Double to String là-bas. Qui sera beaucoup plus robuste et plus simple que d'analyser votre double p>
Quelle est la différence entre cela et un commutateur codé dur / si d'autre déclaration? Seule la différence est de pouvoir effectuer une recherche, mais le code réel qui doit toujours être codé dur (c.-à-d. Éléments.Ajouter (0,5, "05"))
Une HASHTABLE pourrait potentiellement augmenter les performances si vous traitez des tables de recherche plus importantes, mais pour une liste aussi petite que votre exemple vous seriez mieux avec une déclaration de commutation géante.
True, et s'il y a un moyen simple direct de le faire, alors nous ne devrions pas utiliser un dictionnaire. Cependant, si je devais analyser et mettre une certaine logique de manipulation de chaîne, j'évite cela simplement parce que c'est sujet d'erreur.
Un dictionnaire est surkill. Vous pouvez le faire avec un tableau.
Délimiteur décimal dépend des préférences de culture actuelles: remplacera '' ' code> ou
', ' code> avec
" " code> p> p>
Il est probablement plus facile d'utiliser un cultureInfo lors de la conversion du nombre en chaîne, comme suggéré par d'autres réponses. Ensuite, vous SAVOIR i> le format de chaîne, et peut simplement remplacer le point.
@Kobi: Oui, quand vous savez et assurez-vous que le délimiteur n'est pas de la virgule. Délimiteur dynamique est très facile à utiliser, minimise les cordes de codage résistant et très intelligente que OP demanda
Si vous pouviez vivre avec des cordes comme 00, 05, 10, 15, 20, 20 ... code>, etc., vous pouvez simplement utiliser
rating.ToString(CultureInfo.InvariantCulture).Replace(".","");
Remplacer (".", "") code> semble être le meilleur moyen.
N'essayez pas de trouver une réponse plus simple à quelque chose qui est déjà simple. Le moyen le plus simple de le faire est d'utiliser ce code: Si c'est quelque chose que vous allez faire beaucoup, enveloppez-la dans une fonction: p>
J'ai pensé à Trimend code>, mais gardez à l'esprit qu'il tourne
0 code> sur
"" code>.
Couper CODE> Tournez également
05 code> sur
5 code>, ce qui ne va pas.
Vous pouvez simplement utiliser Vérifiez le code ci-dessous P> remplacer (".", string.empty); code> sans avoir besoin de
remplacer (". 0", string.empty) code>
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));
}
+1 pour prendre le temps d'essayer votre réponse et de montrer la preuve de son fonctionnement.
Pour éviter de jouer avec des formats décimaux, je formaterais la pièce entière en tant qu'icéter et utilisez une combinaison de tableau pour la partie fractionnée:
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" };
J'ai essayé de créer un
numberformatinfo code>, mais je reçois
séparateur décimal ne peut pas être la chaîne vide code>. Honte.
+1 pour demander une question bien structurée