9
votes

Numéro décimal format avec regroupement de chiffres et limiter le nombre de chiffres

Fondamentalement, j'essaie d'effectuer le formatage du numéro de la même manière que la calculatrice Windows. Par conséquent, mes exigences sont les suivantes:

  • Limitez le nombre de chiffres affichés à un maximum (par exemple 16). J'ai pu accomplir cela en utilisant numéro.tostring ("g16") .
  • Ajouter un groupe de chiffres au nombre. J'ai pu accomplir que vous utilisez: numéro.tostring (string.format ("#, 0. {0}; - #, 0. {0}", nouvelle chaîne ("#" C, 15))))

    Des idées sur la manière de les combiner ensemble pour obtenir le même comportement que la calculatrice Windows?


    Quelques exemples avec la sortie souhaitée:

     Exemples


    J'ai ajouté une réponse ci-dessous que j'utiliserais si la sortie souhaitée ne peut pas être obtenue à l'aide d'une mise en forme d'une chaîne. N'hésitez pas à suggérer des optimisations / changements à cette réponse si vous ne croyez aucune façon directe d'y parvenir (qui est mon exigence d'origine)

    Désolé si j'ai causé une certaine confusion à quiconque. Je pensais juste qu'il pourrait y avoir une simple formatage de chaîne pour y parvenir et j'étais aussi curieux de savoir si c'est vrai.


4 commentaires

Vous devriez probablement donner des exemples. Par exemple, pouvez-vous donner un numéro pour lequel votre approche dans la deuxième balle ne produit pas la chaîne souhaitée? Quelle est la chaîne actuelle et que vouliez-vous?


@Jeppestignielsen, a mis à jour la question.


Je vous ai déjà dit comment faire cela . Utilisez math.log10 (math.abs (valeur)) pour savoir quand vous devez passer au format "E".


@Hanspassant, je connais votre commentaire là-bas et j'ai utilisé quelque chose de similaire (mon deuxième point de balle) qui ne produit pas de zéros supplémentaires. Y a-t-il un avantage d'utiliser tostring ("n") ? Deuxièmement, je ne suis pas sûr de comprendre comment math.log10 aiderait. Aussi " Je cherche un moyen d'obtenir la sortie souhaitée en utilisant uniquement la mise en forme de chaîne (ou une méthode simple similaire) " s'il y en a un.


5 Réponses :


0
votes

Vous pouvez utiliser chaîne .format pour appliquer plusieurs formats. Lisez à propos de formatage composite ici : < Pré> xxx

Testé dans vb.net

Vous pouvez Déposez les zéros ou utilisez votre mise en forme, mais la question initiale concernait l'application de plusieurs formats.

vous peut Pour convertir le nombre à la mise en forme à long terme , Testez-le à votre fin.

pour la partie 2, vous pouvez simplement utiliser N0 pour ajouter les virgules pour des milliers d'endroits - chaînes de format numérique standard


11 commentaires

Cela ne peut pas fonctionner. Vous ne pouvez pas formater deux fois. Après le premier formatage, dans votre cas, le .tostring ("g16") , ce que vous avez est une chaîne. Cette chaîne ne se souciera pas de la chose N0 . Une chaîne n'est pas formable (et chaîne n'entrent pas iformattable ).


Avez-vous lu mon commentaire? Vous devrez peut-être convertir le nombre au formatage longtemps pendant le formatage, testez-le à votre fin. Évidemment, je ne l'ai pas testé et je l'ai mentionné à ce sujet. Mais de toute façon, puisque vous l'avez testé, je vais l'ajouter


@Jeppestignielsen, exactement. Théknukning, merci pour la suggestion mais ça ne marche pas.


Donc, vous dites que j'applique le g16 en premier, pour obtenir quelque chose comme "3.14" , dites, comment puis-je passer par long de là pour appliquer N0 après?


@Jeppestignielsen Je ne suis pas bon avec C # J'ai utilisé convertisseur, mais voici un exemple dans vb.net


@GeniusBrain Découvrez la réponse mise à jour avec Fiddle, son exemple VB.NET


Mais cela ne donne pas la sortie souhaitée, pour que l'asker veut "1.11111111111111E18" dans ce cas. Et cela ne peut pas fonctionner pour des chiffres qui ne sont pas entiers, tels que 2.5 .


@Jeppestignielsen d'accord obtenu maintenant, vous êtes correct. Il ne peut pas fonctionner pour des chiffres qui ne sont pas entiers . Question à OP: Pourquoi ne pas simplement appliquer le format de groupe, puis éliminer la chaîne à 16 caractères?


Vous vouliez probablement dire CDEC ou CDBL . Mais de toute façon, cela ne donnera pas la sortie souhaitée (nombre de chiffres limitant).


@GeniusBrain ne peut pas utiliser Substring Méthode pour obtenir seulement 16 premiers caractères? Ou si vous avez l'utilisateur entrant un numéro quelque part quelque part, limitez-vous la saisie de 14 caractères maximum de 14 caractères?


@Theu connu, bien ce ne sera pas juste que, je vais devoir vérifier le nombre de chiffres avant le point décimal, le comparer au maximum, puis décider de regrouper des chiffres ou d'utiliser ex. Mais oui, cela peut être fait manuellement comme ça. Je me demande simplement s'il y a une façon directe d'exécuter cela (par exemple en utilisant la mise en forme de chaîne).



5
votes

Après beaucoup de recherche sur cette question. Vous ne pouvez pas exécuter cela avec un seul format car vous vous posez des questions sur un si. Ele code> logique non pour un moyen de formatage ( exécutant deux formatage sur un numéro em>) Xxx pré>

Vous devez donc utiliser un si code> pour atteindre ce p> xxx pré>

update1 strong>

en fonction de votre mise à jour, utilisez le suivant P>

Public Function FormatDouble(ByVal dbl As Double, ByVal len As Integer) As String

    Return Double.Parse(dbl.ToString("G" & len)).ToString("#,#.#".PadRight(len, "#"), System.Globalization.CultureInfo.InvariantCulture)

End Function
  • dbl.tostring ("g" & len) code> est la mise en forme dbl code> à une longueur fixe = len code> p> p> p>

  • double.parse code> convertit à nouveau le résultat en double avec la nouvelle longueur. Remarque: Si le résultat contient E code> il sera supprimé après analyse em> p> li>

  • tostring ("#, #. #". Padright (len, "#"), System.globalization.CultureInfo.invariantculture) Code> est l'ajout de chiffres de groupe au double p> li> ul>

    note forte> p>

    Lorsque vous fournissez une longueur ("G15") code> Il y aura rond le numéro. Il peut réduire la longueur de la partie décimale, mais cela ne vient pas des entiers, il arrondira le nombre à la longueur spécifiée. C'est à dire. 1734.tostring ("g1") code> retourne 2000 code> mais pas 2 code> / 1734.Tostring ("g2") code > retournera 1700 code> mais pas 17 code> p>

    Si vous souhaitez réduire les numéros, vous devez utiliser String Functions em> comme Sous-chaîne code> et gauche code> après le Tostring ("g1") code> p>

    espère qu'il aide p> p>


6 commentaires

Cela ne va même même pas combiner les avantages des deux méthodes. Vous finirez toujours par utiliser qu'un seul d'entre eux pendant que j'ai besoin à la fois ensemble (limiter le nombre de chiffres + chiffres de groupe). De plus, le E n'est pas le seul problème que la condition doit être basée sur. Merci pour vos efforts cependant :)


Votre exemple ne montre pas ce que vous dites. Je ne vois aucune combinaison ?!!!! Lorsque la notation scientifique n'est pas trouvée, aucun groupement n'est autorisé


" Des idées sur la manière de les combiner ensemble pour obtenir le même comportement que la calculatrice Windows ". La question ne concerne pas la combinaison de la notation scientifique et du groupe de chiffres. Il s'agit de combiner regroupement de chiffres et limitant le nombre de chiffres ( g16 le fait aussi longtemps que la notation scientifique si nécessaire).


J'ai mis à jour la question qui tente d'effacer tout malentendu. BTW, bien sûr, je sais que lorsque la notation scientifique n'est pas trouvée, aucun regroupement n'est autorisé . C'est pourquoi je ne demandais pas de combiner ces deux ensemble en premier lieu. Je n'ai jamais mentionné la notation scientifique dans ma question. L'exemple ne l'a affiché que parce que g16 qui arrondit / limite le nombre de chiffres également la notation scientifique . J'espère que c'est clair maintenant :)


Si la sortie de tostring ("g") contient un E , le second tostring lancera un formatxception . Essayez FormatDouble (100, 2) .


Laissez-nous Continuez cette discussion en chat .



3
votes

C'est une réponse que j'utiliserais si cela ne peut pas être fait en utilisant une formatage d'une chaîne: xxx

Ceci va -iger- produire ma sortie souhaitée (la même sortie de la calculatrice Windows).

Je pensais simplement qu'il pourrait y avoir une simple formatage de chaîne pour y parvenir et que j'étais - et toujours curieux de savoir si c'est vrai.


2 commentaires

Vous pouvez utiliser integer.parse (entiers) .tostring (string.format ("n0")) & ... dans groupé


@Kscandrett, +1 bon point. Oui, puisque j'applique ce formatage à la partie entière seulement, il n'y aura pas de zéros de fin. De plus, je devrais utiliser long au lieu de entier .



4
votes

Je ne connais pas un moyen facile de faire cela dans la façon dont vous recherchez.

Mais être un type curieux de garçon, je me suis demandé comment il pourrait être réalisé en utilisant uniquement des méthodes de chaîne.

Pour être clair, je ne préconise pas cette approche comme une bonne solution - c'est plutôt difficile à comprendre en une seule ligne, mais bon, un exercice intéressant pour moi.

Si vous senti comme le faire dans une ligne horrible (C #): xxx

sinon cassé un peu; C'est un peu plus claire quelle approche que je prends: xxx

J'ajoute un point décimal à la fin de la chaîne afin qu'il y ait au moins un point décimal dans le numéro (chaîne). Puis saisissez le texte à gauche du premier point décimal et de le concaténer avec n'importe quel texte de la première et à gauche du dernier point décimal.

S'il n'y avait pas de point décimal dans la chaîne d'origine, alors ces Deux points sont les mêmes - la sous-chaîne 0 caractères long - éliminant le point décimal ajouté.


2 commentaires

Peut-être pas seulement des méthodes de chaîne ... je suis allongé un long.parse () là-bas


+1 Bonne réponse aussi. Cependant, j'aurais pu écrire ma réponse dans une ligne de code une seule ligne, mais ce n'est pas le point. Je pensais juste qu'il pourrait y avoir un formatage d'une chaîne pour y parvenir (quelque chose comme num.tostring ("quelque_sort_of_of_formatting") . Mais on dirait que cela n'est pas possible. C'est pourquoi j'ai accepté la réponse de Hadi.



0
votes
static formatDecimal(decimal decimalVar, int size)
{
    return decimalVar.ToString("#.##").PadLeft(size, '0'); 
}

1 commentaires

Bienvenue dans le débordement de la pile! Bien que votre réponse soit appréciée, ce serait encore mieux si vous a modifié votre message pour ajouter une explication de votre code. Cela rendrait votre réponse plus utile et plus susceptible d'être avancé :)