web-dev-qa-db-fra.com

Convertir une chaîne en décimal avec le format

J'ai besoin de convertir une chaîne en décimale en C #, mais cette chaîne a des formats différents.

Par exemple:

"50085"

"500,85"

"500.85"

Cela devrait être converti pour 500,85 en décimal. Existe-t-il un formulaire simplifié pour effectuer cette conversion en utilisant le format?

7

Bien que decimal.Parse () soit la méthode que vous recherchez, vous devrez lui fournir un peu plus d'informations. Il ne choisira pas automatiquement les 3 formats que vous indiquez, vous devrez lui indiquer le format auquel vous vous attendez (sous la forme d'un IFormatProvider). Notez que même avec un IFormatProvider, je ne pense pas que "50085" sera correctement inséré.

La seule chose qui me semble cohérente est qu’il ressort de vos exemples que vous attendez toujours deux décimales de précision. Si tel est le cas, vous pouvez supprimer tous les points et les virgules, puis les diviser par 100.

Peut-être quelque chose comme:

public decimal? CustomParse(string incomingValue)
{
    decimal val;
    if (!decimal.TryParse(incomingValue.Replace(",", "").Replace(".", ""), NumberStyles.Number, CultureInfo.InvariantCulture, out val))
        return null;
    return val / 100;
}
15
Chris Shaffer

Certaines cultures utilisent une virgule pour indiquer le point flottant. Vous pouvez tester cela avec le code suivant sur une page aspx:

var x = decimal.Parse("500,85");
Response.Write(x + (decimal)0.15);

Cela donne la réponse 501 lorsque la culture du fil a été définie sur une culture qui utilise la virgule comme virgule flottante. Vous pouvez forcer ceci comme ceci:

var x = decimal.Parse("500,85", new NumberFormatInfo() { NumberDecimalSeparator = "," });
15
James McCormack

Cela fonctionnera selon vos paramètres de culture:

string s = "500.85";
decimal d = decimal.Parse(s);

Si votre culture n'autorise pas par défaut , au lieu de . en tant que point décimal, vous devrez probablement:

s = s.Replace(',','.');

Mais il faudra vérifier s'il y a plusieurs . ... cela semble se résumer à un problème d'assainissement des entrées. Si vous êtes capable de valider et d'assainir l'entrée pour qu'elle soit conforme à un ensemble de règles, la conversion en décimal sera beaucoup plus facile.

6
Jaymz

Essayez ce code ci-dessous:

string numValue = "500,85";
System.Globalization.CultureInfo culInfo = new System.Globalization.CultureInfo("fr-FR");
decimal decValue;
bool decValid = decimal.TryParse(numValue, System.Globalization.NumberStyles.Number, culInfo.NumberFormat, out decValue);
if (decValid)
{
    lblDecNum.Text = Convert.ToString(decValue, culInfo.NumberFormat);
}

Étant donné que je donne une valeur de 500,85, je supposerai que la culture est française et que le séparateur décimal est donc ",". Puis décimal.TryParse (numValue, System.Globalization.NumberStyles.Number, culInfo.NumberFormat, out decValue); retournera la valeur sous la forme 500.85 dans decValue. De même si l'utilisateur est anglais américain, changez le constructeur de culInfo.

3
Nisha_Roy

Il y a de nombreuses façons:

  1. System.Convert.ToDecimal("232.23")
  2. Double.Parse("232.23")
  3. double test;Double.TryParse("232.23", out test)

Assurez-vous d'essayer d'attraper ...

1

Ceci est une nouvelle fonctionnalité appelée Symbole de regroupement de chiffres .

Pas:

  1. Ouvrir la région et la langue dans le panneau de configuration
  2. Cliquez sur Paramètre supplémentaire
  3. Onglet Numéros
  4. Définir Symbole de regroupement de chiffres comme paramètre personnalisé. Changer de virgule; remplacer par (tout caractère de A à Z ou {/,}). Symbole de groupe de chiffres = e;

Exemple:

string checkFormate = "123e123";
decimal outPut = 0.0M;
decimal.TryParse(checkFormate, out outPut);
Ans: outPut=123123;
1
Mohd Vasil

Essaye ça

 public decimal AutoParse(string value)
    {
        if (Convert.ToDecimal("3.3") == ((decimal)3.3))
        {
            return Convert.ToDecimal(value.Replace(",", "."));
        }
        else
        {
            return Convert.ToDecimal(value.Replace(".", ","));
        }

    }
0
halo89