Как преобразовать строку с плавающей запятой в int в C # - PullRequest
0 голосов
/ 01 сентября 2010

У меня есть строка:

string test = "19,95";

и я не хочу преобразовывать его в int.

Я использую:

int num = Convert.Int32 (тест);

Однако он генерирует исключение FormatException. И говорит мне, что строка не является правильной строкой для преобразования.

Я предполагаю, что это связано с десятичным разделителем.

Как мне обойти это?

Ответы [ 5 ]

4 голосов
/ 01 сентября 2010
using System.Globalization;
...
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ",";
double num = Convert.ToDouble(test, (IFormatProvider)nfi);

Проверено и работает.

Для полноты:

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

[Обновить]

Как Rushyo правильно указано в моемПриведенные ниже комментарии, этот пример придуман, и наилучший практический подход заключается в том, чтобы определить, с какой культурой вы работаете, чтобы заставить корректно работать объект CultureInfo.

Затем можно использовать локализованный NumberFormatInfo из этого конкретногоCultureInfo при выполнении всех ваших числовых форматов.

3 голосов
/ 01 сентября 2010
string dblText = "19,95";
CultureInfo ci = new CultureInfo ("en-US", true);
ci.NumberFormat.NumberDecimalSeparator = ",";
double dblValue = double.Parse (dblText, NumberStyles.AllowDecimalPoint, ci);

Если вам нужно 19 (отбрасывание десятичной части):

int intValue = (int)dblValue;

Если вам нужно 20 (математическое округление):

int intValue = (int)(dblValue + 0.5);
1 голос
/ 01 сентября 2010

Как уже упоминали другие, основная проблема вашего вопроса в том, что вы не дали никакой информации о том, какого результата вы ожидаете, а некоторые также подняли проблему с культурой (десятичный разделитель, разделитель тысяч). Итак, я сделаю небольшую сумму:

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.
}
1 голос
/ 01 сентября 2010

Какое целое число вы ожидаете получить от "19,95"? 1995? 19? 20

Возможно, вам следует сначала преобразовать число в двойное, а затем округлить или усечь в любом направлении, которое имеет смысл для вашего приложения.

0 голосов
/ 01 сентября 2010

Вы уверены, что хотите, чтобы это был int?

это число двойное.

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

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