11
votes

Comment convertir intelligemment et en toute sécurité un double en chaîne?

Essayer de ne pas me répéter (à être sec) ici, aidez-moi à sortir. =)

J'ai un double fort> qui représente une notation / 5. p>

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);
    }


2 commentaires

J'ai essayé de créer un numberformatinfo , mais je reçois séparateur décimal ne peut pas être la chaîne vide . Honte.


+1 pour demander une question bien structurée


8 Réponses :


2
votes

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.

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é.


0 commentaires

0
votes

Vous pouvez appeler tostring () , puis utiliser une expression régulière comme remplaçant "([0-9]) \\. ([0-9])" avec "\\ 1 \\ 2" , qui, bien que toujours un peu de hack, serait moins fragile que remplacer ("." "," ")


3 commentaires

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", "") est probablement plus robuste, votre regex rend des hypothèses spécifiques sur le format de la chaîne.



1
votes

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


4 commentaires

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.



9
votes

Délimiteur décimal dépend des préférences de culture actuelles: xxx

remplacera '' ' ou ', ' avec " "


2 commentaires

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 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



4
votes

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(".","");


1 commentaires

Remplacer (".", "") semble être le meilleur moyen.



-1
votes

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: xxx

Si c'est quelque chose que vous allez faire beaucoup, enveloppez-la dans une fonction: xxx


1 commentaires

J'ai pensé à Trimend , mais gardez à l'esprit qu'il tourne 0 sur "" . Couper Tournez également 05 sur 5 , ce qui ne va pas.



2
votes

Vous pouvez simplement utiliser remplacer (".", string.empty); code> sans avoir besoin de remplacer (". 0", string.empty) code>

Vérifiez le code ci-dessous P>

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 commentaires

+1 pour prendre le temps d'essayer votre réponse et de montrer la preuve de son fonctionnement.



1
votes

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" };


0 commentaires