11
votes

Déterminer la précision décimale d'un numéro d'entrée

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:

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

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.


3 commentaires

Ê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 / ...


7 Réponses :


8
votes

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


0 commentaires

3
votes

Non, il n'y a pas de solution plus facile, vous devez examiner la chaîne. Si vous convertissez "4500" et "4500.00" à des numéros, ils deviennent tous deux la valeur 4500 afin que vous ne puissiez pas dire combien de non- chiffres de valeur Il y avait derrière le séparateur décimal.


0 commentaires

1
votes

Travailler avec la chaîne est assez facile.

S'il n'y a pas de "". dans la chaîne, retour 1.

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.


1 commentaires

AVERTISSEMENT: D'abord, assurez-vous que la chaîne est un numéro valide / le dernier caractère n'est pas un "."



11
votes

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;

1 commentaires

Le caractère à scinder doit être le séparateur décimal correct - NumberFormatinfo.numberdecimalseparator



19
votes

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


4 commentaires

+1 pour décimal.Precision, je ne savais pas que cela puisse faire cela :) Voir Stackoverflow.com/Questtions/1132765/...


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?



2
votes

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


1 commentaires

Voir la réponse de Daniel Bruckner pour savoir comment accéder directement à ces informations.



1
votes

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


1 commentaires

Vous devez utiliser NumberFormatInfo.numberdecimalseparator à Obtenez le séparateur décimal correct pour la locale.