Nous avons un problème intéressant si nous devons déterminer la précision décimale d'une entrée d'utilisateurs (zone de texte). Nous devons essentiellement connaître le nombre de décimales entrées, puis renvoyer un nombre de précision, il est préférable d'illustrer des exemples: p>
4500 entré donnera un résultat 1
4500.1 entré donnera un résultat 0,1
4500h00 entré donnera un résultat 0,01
4500.450 entré donnera un résultat 0,001 P>
Nous pensons à travailler avec la chaîne, à trouver le séparateur décimal, puis à calculer le résultat. Je me demandais simplement s'il y a une solution plus facile à cela. P>
7 Réponses :
Étant donné que vos derniers exemples indiquent que les zéros traînants sont significatifs, je règle une solution numérique et je vais pour les opérations de chaîne. P>
Non, il n'y a pas de solution plus facile, vous devez examiner la chaîne. Si vous convertissez "4500" code> et
"4500.00" code> à des numéros, ils deviennent tous deux la valeur
4500 code> afin que vous ne puissiez pas dire combien de non- chiffres de valeur Il y avait derrière le séparateur décimal. P>
Travailler avec la chaîne est assez facile. P>
S'il n'y a pas de "". dans la chaîne, retour 1. p>
d'autre retourner "0.", suivi de N-1 "0", suivi d'un "1", où n est la longueur de la chaîne après le point décimal. P>
AVERTISSEMENT: D'abord, assurez-vous que la chaîne est un numéro valide / le dernier caractère n'est pas un "."
se demandant simplement s'il y a une plus facile solution à cela. p>
Non. P>
Utiliser String: P>
string[] res = inputstring.Split('.'); int precision = res[1].Length;
Le caractère à scinder doit être le séparateur décimal correct - NumberFormatinfo.numberdecimalseparator
Je pense que vous devriez simplement faire ce que vous avez suggéré - utilisez la position du point décimal. L'inconvénient évident pourrait être que vous devez penser à l'internationalisation vous-même.
static int GetScale(decimal d) { return new DecimalScale(d).Scale; } [StructLayout(LayoutKind.Explicit)] struct DecimalScale { public DecimalScale(decimal value) { this = default; this.d = value; } [FieldOffset(0)] decimal d; [FieldOffset(0)] int flags; public int Scale => (flags >> 16) & 0xff; }
+1 pour décimal.Precision, je ne savais pas que cela puisse faire cela :) Voir
Depuis que l'OP a demandé "une solution plus facile", et peut-être déduit "mieux performer", comment cela compare-t-il la performance-sage pour simplement analyser la chaîne?
Vous avez dans le commentaire, "sera de 4", mais la précision de "123,4560" devrait être 7. L'échelle devrait être de 4.
Y a-t-il de toute façon pour 123.4560 pour obtenir précision = 3? depuis 0 à la fin ne devrait pas compter?
Aussi intéressant de côté, le décimal code> essaie de maintenir la précision entrée par l'utilisateur. Par exemple,
5.0
5.00
5.0
5.00
Voir la réponse de Daniel Bruckner pour savoir comment accéder directement à ces informations.
Voici une solution possible à l'aide de chaînes;
static double GetPrecision(string s) { string[] splitNumber = s.Split('.'); if (splitNumber.Length > 1) { return 1 / Math.Pow(10, splitNumber[1].Length); } else { return 1; } }
Vous devez utiliser NumberFormatInfo.numberdecimalseparator à Obtenez le séparateur décimal correct pour la locale.
Êtes-vous sûr que 4500 serait un 1, et pas un 100?
Ce qui est attendu aboutit au cas de 0,0 et 0,1?
Pour moi, c'est une question déroutante. Vous ne demandez pas de précision décimale. Vous demandez: Comment obtenir le nombre de chiffres dans une partie de fraction. Définition pour 'décimal précision' est là pour moi: Docs .oracle.com / CD / B28359_01 / Server.111 / B28318 / ...