Chaîne de format numérique personnalisée pour toujours afficher le signe

193

Existe-t-il un moyen de spécifier une chaîne de format numérique standard ou personnalisée pour toujours afficher le signe, que ce soit + ve ou -ve (bien que ce qu'il devrait faire pour zéro, je ne suis pas sûr!)

Craig Shearer
la source

Réponses:

304

Oui, vous pouvez. Il existe une mise en forme conditionnelle. Voir Mise en forme conditionnelle dans MSDN

par exemple:

string MyString = number.ToString("+0;-#");

Où chaque section séparée par un point-virgule représente des nombres positifs et négatifs

ou:

string MyString = number.ToString("+#;-#;0");

si vous ne voulez pas que le zéro ait un signe plus.

gcores
la source
1
Correction d'un bug où les négatifs n'obtenaient pas de moins.
Roman Starkov
Merci beaucoup! Je me suis cassé la tête pendant environ une heure pour comprendre ce qui est l'équivalent du drapeau «+» de printf en C # et vous m'avez donné LA réponse.
rbaleksandar
4
avec +#;-#, pour la valeur 0 je reçois juste « + », sans 0. réel pour moi , je veux 0 à apparaître comme « +0 », ceci marche: +#;-#;+0.
orion elenzil
3
Merci! Mélanger cela ''fera de grandes choses! Regardez ceci Changes.ToString("'('#' ▲)';'('#' ▼)';''"):! Cela m'a fait gagner beaucoup de temps et des centaines de ifdéclarations! :)
Shahab
1
@orionelenzil J'ai eu le même problème. Vous pourriez aussi faire à la +0;-#place de +#;-#;+0Cette réponse était vraiment trompeuse pour moi.
Kamil Szot
56

Attention, lors de l'utilisation de la mise en forme conditionnelle, la valeur négative n'obtient pas automatiquement un signe. Tu as besoin de faire

string MyString = number.ToString("+#;-#;0");
Luk
la source
Comme d'autres l'ont souligné, +0;-#vous donne le même résultat avec un code plus propre.
Andrew
34

Vous pouvez également utiliser des chaînes de format dans string.Format (); la chaîne de format est séparée de l'index par un deux-points (':')

var f = string.Format("{0}, Force sign {0:+#;-#;+0}, No sign for zero {0:+#;-#;0}", number);

Pour le nombre {+1, -1, 0}, cela donne:

1, signe de force +1, aucun signe pour zéro +1
-1, signe de force -1, aucun signe pour zéro -1
0, signe de force +0, aucun signe pour zéro 0

Vous pouvez également utiliser une chaîne interpolée au lieu de string.Formatpour obtenir le même résultat:

var f = $"{number}, Force sign {number:+#;-#;+0}, No sign for zero {number:+#;-#;0}";
Edward
la source
La dernière ligne de votre réponse doit indiquer "Format par défaut 0, signe de force +, aucun signe pour zéro 0". parce que c'est le résultat réel du +#;-#format pour la valeur 0
Kamil Szot
Merci, Kamil - ça m'a manqué. J'ai maintenant corrigé le format du signe de force: + #; - #; + 0 (au lieu de + #; - #)
Edward
1
Vous pouvez obtenir le comportement de signe de force avec un format plus simple: +0;-#. :)
Andrew
@Andrew, en effet, mais je préfère +#;-#;+0plutôt +#;-#que car cela indique plus clairement que 0 sera formaté comme +0
Edward
10

Contrairement aux autres réponses, il semble que si vous voulez obtenir +1, -1, +0 (pour les arguments 1, -1, 0), vous devez utiliser le format:

String.Format("{0:+#;-#;+0}", 0));  // output: +0

ou

String.Format("{0:+0;-#}", 0));  // output: +0

Si vous utilisez juste, +#;-#il affichera juste +(pas +0) pour 0.

Le spécificateur personnalisé «#» (à l' adresse https://msdn.microsoft.com/en-us/library/0c899ak8.aspx )

Notez que ce spécificateur n'affiche jamais un zéro qui n'est pas un chiffre significatif, même si zéro est le seul chiffre de la chaîne. Il affichera zéro uniquement s'il s'agit d'un chiffre significatif dans le nombre affiché.

Veuillez également garder à l'esprit que si vous avez besoin d'une précision décimale, vous devez la spécifier comme ça:

String.Format("{0:+0.##;-#.##}", 0));  // output: +0

ou, si vous ne voulez pas que les zéros apparaissent toujours, comme ça:

String.Format("{0:+0.00;-#.00}", 0));  // output: +0.00
Kamil Szot
la source
1

Pour une expression numérique de tout type:

+###,###,###,###,###,###,###,###,###,##0.###,###,###,###,###,###,###,###,###,###;-###,###,###,###,###,###,###,###,###,##0.###,###,###,###,###,###,###,###,###,###;0

Utilisez trois parties pour trois cas: positif; négatif; zéro

Autres aspects de l'exemple:

  • Zéro n'est pas signé. Vous pouvez l'afficher sous forme de n'importe quoi, par exemple "zéro".

  • Les valeurs absolues inférieures à un ont un 0 avant le point décimal. Ajustez au goût.

  • Le nombre de chiffres correspond aux valeurs décimales absolues les plus grandes et les plus petites. Ajustez au goût.

  • Le caractère de point décimal est spécifique à la culture. Substituts .NET.

  • Les séparateurs de regroupement sont facultatifs. Le personnage est spécifique à la culture. Substituts .NET. (Les positions sont également spécifiques à la culture, mais elles ne sont contrôlées que par votre chaîne de format.) Vous utilisez également tout autre caractère à l'exception des caractères spéciaux pour Format (qui incluent,. # 0).

Tom Blodget
la source
0

Je ne peux pas commenter donc je fais une réponse ici (système de réputation de noix ...)

Vous pouvez très bien utiliser number.ToString ("+ 0; - #") pour produire le TimeFormat de chaîne UTC

Ici montré dans le code PowerShell

"$([System.DateTime]::Now.ToString('HH:mm:ss.fff'))$($([System.TimeZoneInfo]::Local.GetUtcOffset([System.DateTime]::Now).TotalMinutes.ToString('+0;-#')))"

Merci @gcores https://stackoverflow.com/users/40256/gcores

Peter Kriegel
la source