2010-09-01 18 views
0

J'ai une chaîne:Comment puis-je convertir une chaîne à virgule flottante en un int en C#

string test = "19,95";

et je ne voulais pas le convertir en int.

J'utilise:

int num = Convert.Int32 (test);

Cependant, il déclenche une exception FormatException. Et me dit que la chaîne n'est pas une chaîne appropriée pour la conversion. Je pense que cela a à voir avec le séparateur décimal.

Comment puis-je contourner ce problème?

+2

quel résultat espérez-vous? – devio

+2

L'entier devrait-il être '20' ou devrait-il être' 19'? –

+0

duplication possible de [Convertir la chaîne en entier] (http://stackoverflow.com/questions/1303934/convert-string-to-integer) –

Répondre

4
using System.Globalization; 
... 
NumberFormatInfo nfi = new NumberFormatInfo(); 
nfi.NumberDecimalSeparator = ","; 
double num = Convert.ToDouble(test, (IFormatProvider)nfi); 

Testé & travail.

Pour être complet:

int applesApplesApples = Math.Ceiling(num); 
int bananaBananaBanana = (int)num; 
int cucumberCucumberCucumber = Math.Floor(num); 

[Mise à jour]

Comme Rushyo souligné à juste titre dans mes commentaires ci-dessous, cet exemple est l'approche artificielle et la meilleure pratique consiste à identifier la culture que vous travaillez avec afin de faire fonctionner l'objet CultureInfo correct.

Vous pouvez ensuite utiliser le NumberFormatInfo localisé de ce CultureInfo spécifique lorsque vous effectuez toute votre mise en forme numérique.

+1

Testé et fonctionnant mais pas un 'int' –

+0

Pourquoi voulez-vous un int .. Quelqu'un va se sentir vraiment arraché si vous arrondissez leur $ 19,95 jusqu'à 20 $ et ne leur a pas donné leur changement 5c. J'ai un léger sentiment que l'OP aurait pu avoir ses types embrouillés. En tout cas, je laisserai la place à l'OP pour comprendre le prochain morceau s'il veut vraiment un int. – hydrogen

+0

Je ne voulais pas l'int. Ma solution de travail en ce moment est d'utiliser split pour supprimer la virgule et tout ce qui suit. Alors le converti fonctionne. Cependant, cela entraîne également le nombre arrondi vers le bas, je veux l'arrondi vers le haut ou le bas. – Bildsoe

3
string dblText = "19,95"; 
CultureInfo ci = new CultureInfo ("en-US", true); 
ci.NumberFormat.NumberDecimalSeparator = ","; 
double dblValue = double.Parse (dblText, NumberStyles.AllowDecimalPoint, ci); 

Si vous avez besoin 19 (coulée au large de la partie décimale):

int intValue = (int)dblValue; 

Si vous avez besoin 20 (arrondi mathématique):

int intValue = (int)(dblValue + 0.5); 
+2

Cela échouerait toujours si la localisation était erronée. La chaîne a un séparateur de virgules - indiquant probablement une origine européenne. Si vous l'avez exécuté avec un paramètre de localisation au Royaume-Uni ou aux États-Unis, il échouera car il s'attend à un arrêt complet en tant que séparateur. La virgule est un séparateur de milliers pour le Royaume-Uni/États-Unis –

+0

Juste une note à tous ceux qui lisent: Cette réponse a depuis été éditée. Question: Pourquoi créer une nouvelle culture qui est une variante de en-US? C'est juste gâcher la sémantique. 'da' ou 'da-DK' semblent beaucoup plus appropriés - et ne vous obligent pas à créer une toute nouvelle culture! – Rushyo

+0

C'était juste une solution rapide pour suggérer l'idée. J'aime plus la solution de l'hydrogène. –

1

Quel entier vous attendez-vous à obtenir de "19,95"? 1995? 19? 20? Il se peut que vous deviez d'abord convertir le nombre en double, puis arrondir ou tronquer dans la direction la plus appropriée pour votre application.

0

Êtes-vous sûr de vouloir que ce soit un int?

ce nombre est un double.

int num = (int)double.Parse(test); //will be 19 

double num = double.Parse(test); //wil be 19.95 
+0

pourquoi faire un int.Parse à une double valeur quand vous pourriez faire double.Parse? – Joakim

+0

Le séparateur décimal doit être '.' – Cipi

+3

Qui a dit? Beaucoup de pays qui utilisent un, seraient en désaccord. – hydrogen

1

Comme les autres déjà mentionné le problème principal de votre question est, que vous n'avez donné aucune information sur le résultat que vous attendez et certains ont également soulevé le problème avec la culture (séparateur décimal, séparateur de milliers). Donc, je vais faire un petit somme:

private int Parse(string text) 
{ 
    Decimal value; 

    //Select the culture you like to use 
    var culture = CultureInfo.CurrentCulture; 
    //var culture = CultureInfo.GetCultureInfo("en-US"); 
    //var culture = CultureInfo.GetCultureInfo("de-DE"); 

    if (Decimal.TryParse(text, NumberStyles.Number, culture, out value)) 
    { 
     //Throw away the fractional part 
     //return (int)value; 

     //or make some rounding?? 
     return (int)Math.Round(value, MidpointRounding.ToEven); 
    } 

    //What should happen if the parsing fails?? 
    //Return some default value 
    return int.MinValue; 
    //return 0; 

    //Or throw an exception? 
    //throw new FormatException(); 
    //In that case, maybe use directly Decimal.Parse and let this 
    //function throw the exception with the correct message. 
}