Comment puis-je formater un Double
à une Ssortingng
en C # afin de n’avoir que deux décimales?
Si j’utilise Ssortingng.Format("{0:0.00}%", myDoubleValue)
le nombre est arrondi et je souhaite une Ssortingng.Format("{0:0.00}%", myDoubleValue)
simple sans arrondi. Je souhaite également que la conversion à Ssortingng
soit sensible à la culture.
J’utilise les éléments suivants:
double x = Math.Truncate(myDoubleValue * 100) / 100;
Par exemple:
Si le numéro est 50.947563 et que vous utilisez ce qui suit, les événements suivants se produiront:
- Math.Truncate(50.947563 * 100) / 100; - Math.Truncate(5094.7563) / 100; - 5094 / 100 - 50.94
Et votre réponse est tronquée. Maintenant, pour formater la chaîne, procédez comme suit:
ssortingng s = ssortingng.Format("{0:N2}%", x); // No fear of rounding and takes the default number format
La suite arrondit les nombres, mais ne montre que 2 décimales maximum (en supprimant les zéros), grâce à .##
.
decimal d0 = 24.154m; decimal d1 = 24.155m; decimal d2 = 24.1m; decimal d3 = 24.0m; d0.ToSsortingng("0.##"); //24.15 d1.ToSsortingng("0.##"); //24.16 (rounded up) d2.ToSsortingng("0.##"); //24.1 d3.ToSsortingng("0.##"); //24
http://dobrzanski.net/2009/05/14/c-decimaltossortingng-and-how-to-get-rid-of-trailing-zeros/
Je vous suggère de tronquer en premier, puis de formater:
double a = 123.4567; double aTruncated = Math.Truncate(a * 100) / 100; CultureInfo ci = new CultureInfo("de-DE"); ssortingng s = ssortingng.Format(ci, "{0:0.00}%", aTruncated);
Utilisez la constante 100 pour 2 chiffres tronqués; utilisez un 1 suivi de autant de zéros que de chiffres après la virgule souhaitée. Utilisez le nom de la culture dont vous avez besoin pour ajuster le résultat de la mise en forme.
Méthode la plus simple, utilisez des chaînes de format numérique:
double total = "43.257" MessageBox.Show(total.ToSsortingng("F"));
price.ToSsortingng("0.00")
pour obtenir les principaux 0
Cela fonctionne pour moi
ssortingng prouctPrice = Convert.ToDecimal(Ssortingng.Format("{0:0.00}", Convert.ToDecimal(yourSsortingng))).ToSsortingng();
La fonction c #, exprimée par Kyle Rozendo:
ssortingng DecimalPlaceNoRounding(double d, int decimalPlaces = 2) { d = d * Math.Pow(10, decimalPlaces); d = Math.Truncate(d); d = d / Math.Pow(10, decimalPlaces); return ssortingng.Format("{0:N" + Math.Abs(decimalPlaces) + "}", d); }
Que diriez-vous d’append une décimale supplémentaire à arrondir puis à supprimer:
var d = 0.241534545765; var result1 = d.ToSsortingng("0.###%"); var result2 = result1.Remove(result1.Length - 1);
Je sais que c’est un vieux sujet, mais je dois juste le faire. Alors que les autres approches fonctionnent ici, je voulais un moyen facile d’affecter beaucoup d’appels à ssortingng.format
. Donc, l’ajout de Math.Truncate
à tous les appels n’était pas vraiment une bonne option. De plus, une partie de la mise en forme étant stockée dans une firebase database, cela la rendait encore pire.
Ainsi, j’ai créé un fournisseur de format personnalisé qui me permettrait d’append une troncature à la chaîne de formatage, par exemple:
ssortingng.format(new FormatProvider(), "{0:T}", 1.1299); // 1.12 ssortingng.format(new FormatProvider(), "{0:T(3)", 1.12399); // 1.123 ssortingng.format(new FormatProvider(), "{0:T(1)0,000.0", 1000.9999); // 1,000.9
L’implémentation est assez simple et peut facilement être étendue à d’autres exigences.
public class FormatProvider : IFormatProvider, ICustomFormatter { public object GetFormat(Type formatType) { if (formatType == typeof (ICustomFormatter)) { return this; } return null; } public ssortingng Format(ssortingng format, object arg, IFormatProvider formatProvider) { if (arg == null || arg.GetType() != typeof (double)) { try { return HandleOtherFormats(format, arg); } catch (FormatException e) { throw new FormatException(ssortingng.Format("The format of '{0}' is invalid.", format)); } } if (format.StartsWith("T")) { int dp = 2; int idx = 1; if (format.Length > 1) { if (format[1] == '(') { int closeIdx = format.IndexOf(')'); if (closeIdx > 0) { if (int.TryParse(format.Subssortingng(2, closeIdx - 2), out dp)) { idx = closeIdx + 1; } } else { throw new FormatException(ssortingng.Format("The format of '{0}' is invalid.", format)); } } } double mult = Math.Pow(10, dp); arg = Math.Truncate((double)arg * mult) / mult; format = format.Subssortingng(idx); } try { return HandleOtherFormats(format, arg); } catch (FormatException e) { throw new FormatException(ssortingng.Format("The format of '{0}' is invalid.", format)); } } private ssortingng HandleOtherFormats(ssortingng format, object arg) { if (arg is IFormattable) { return ((IFormattable) arg).ToSsortingng(format, CultureInfo.CurrentCulture); } return arg != null ? arg.ToSsortingng() : Ssortingng.Empty; } }
Ce qui suit peut être utilisé uniquement pour l’affichage qui utilise la propriété de Ssortingng.
double value = 123.456789; Ssortingng.Format("{0:0.00}", value);
Pour ce qui est de la valeur, pour afficher la devise, vous pouvez utiliser "C"
:
double cost = 1.99; m_CostText.text = cost.ToSsortingng("C"); /*C: format as currentcy */
Sortie: $1.99
Vous pourriez aussi écrire votre propre IFormatProvider , même si je suppose que vous devrez éventuellement penser à une façon de faire la troncature.
Le .NET Framework prend également en charge la mise en forme personnalisée. Cela implique généralement la création d’une classe de mise en forme qui implémente à la fois IFormatProvider et ICustomFormatter . (msdn)
Au moins, il serait facilement réutilisable.
Il y a un article sur la façon d’implémenter votre propre IFormatProvider / ICustomFormatter ici à CodeProject . Dans ce cas, “étendre” un format numérique existant pourrait être le meilleur choix. Ça n’a pas l’air trop dur.
J’ai eu ce problème avec xamarin et résolu avec:
porcent.ToSsortingng("0.##"+"%")