6
votes

Analysant une décimale d'un digne digne

J'ai trouvé une solution de contournement pour cette erreur, mais je suis maintenant vraiment curieux de savoir pourquoi cela se produirait, se demandait si quelqu'un d'autre a eu cette erreur.

Ma fonction est la suivante: P>

rating = decimal.Parse("4.0");


1 commentaires

Pourquoi ne pas avoir la colonne être numérique, il n'ya donc pas besoin d'analyser?


5 Réponses :


11
votes

Cela ne semble pas étrange pour moi du tout.

décimal.parse () est supposé lancer une exception pour les mauvais formats. décimal.tryparse () ne jettera pas cette exception, mais revient plutôt faux. Le kicker est que vous ne vérifiez pas la valeur de retour de décimal.trypsarse () . Je vais vous donner de vraies bonnes chances que décimal.trypsarse () retourne false pour chaque entrée qui provoque une exception avec décimal.parse () et true partout ailleurs. Et quand décimal.trypsarse () renvoie false, l'argument de sortie est toujours "0".

La seule mise en garde possible est la localisation. Si décimal.parse () se plaint d'une entrée apparemment normale, vous pouvez vérifier si le format de numéro (culture actuelle) utilisé sur votre serveur utilise une virgule plutôt qu'une décimale pour séparer le coefficient de la Mantissa. . Mais étant donné que votre test "4.0" a fonctionné bien, je doute que c'est le problème.

Enfin, lors de cette conversion du lecteur de données, vous devez prendre en compte la colonne source du lecteur de données. Si cela pourrait déjà être une décimale. Pourquoi le convertir en une chaîne uniquement pour le convertir?


0 commentaires

2
votes

Vous dites ceci:

    // this works absolutly fine?!
    decimal _rating = 0;
    decimal.TryParse(DataReader["Rating"].ToString(), out _rating);


0 commentaires

0
votes

Changez votre trypairse et réessayez:

if (!decimal.TryParse(DataReader["Rating"].ToString(), out _rating))
{
  throw new Exception("Input string was not in a correct format");
}


0 commentaires

1
votes

La colonne décimale SQL n'utilisera pas une chaîne pouvant convertir en une décimale, alors la tryparse reviendra fausse. Essayez quelque chose comme ceci: xxx


1 commentaires

Merci, cela a été utile lorsque je passais du chargement d'un jeu de données (qui obtenait une exception exceptionnelle) à l'aide d'un digne d'information. Je l'ai fait comme suit: décimaldata = (convert.isdbnull (lecteur ["décimalcolumn"]))? 0: Reader.GetDecimal (Reader.GetOgordinal ("Decimalcolumn"));



1
votes

Je suis confronté au même problème aujourd'hui. Essayez ceci: xxx

Il vous donnera la même erreur.


La raison derrière ceci est la culture. Dans la culture française, 4,0 est représenté comme 4,0, et donc il jette une exception.

décimal.trypsarse est la méthode de la culture invariante et donc cela fonctionne bien que cela fonctionne.


1 commentaires

décimal.trypsarse ("4.0", chiffres.number, cultureinfo.invarianTculture, note de sortie);