1

Тема: Як правильно парсити float з тексту?

Так щоб покрити максимум варіантів його запису

private float SafeStringToFloat(string val)
    {
        try
        {
            if (val.Contains("E"))
            {
                return (float)Decimal.Parse(val, System.Globalization.NumberStyles.Float);
            }
            /*if (val.Contains(","))
            {
                return float.Parse(val.Replace(",","."));
            }
            return float.Parse(val);*/
            //return float.Parse(val, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.CurrentCulture);
            //return float.Parse(val, System.Globalization.CultureInfo.CurrentCulture);
            return float.Parse(val);
        }
        catch(Exception ex)
        {
            Console.WriteLine(ex.Message+": "+val);
        }
        return -100f;
    }

як не верчу працювати не хоче

Format_InvalidString: 15.390625

2

Re: Як правильно парсити float з тексту?

return float.Parse(val);

використовує поточні мовні налаштування. Тому на комп'ютері з американськими налаштуваннями воно прийматиме 15.390625, а на комп'ютері з українськими — 15,390625.

Приймати числа в тому форматі, який вказано в налаштуваннях поточної системи — це стандартна поведінка. Її можна змінити одним з наступних способів.

1. Щоб завжди приймати 15.390625, можна передати System.Globalization.CultureInfo.InvariantCulture в якості аргументу (InvariantCulture — це такі стандартні налаштування, які можна використовувати для всяких технічних контекстів і не поміняються в майбутньому):

// десь на початку
using System.Globalization;

// а потім ось так
return float.Parse(val, CultureInfo.InvariantCulture);

Такий код завжди прийматиме 15.390625, вважатиме розділювачем розрядів, тому 15,390625[/t] буде еквівалентно [tt]15,390625[/t]).

2. Щоб завжди приймати [tt]15,390625, можна спеціально вказати, що нам потрібні саме українські налаштування:

// десь на початку
using System.Globalization;

// а потім ось так
var ukrainianCultureInfo = new CultureInfo("uk-UA");
return float.Parse(val, ukrainianCultureInfo);

3. Якщо ви хочете приймати і крапки, і коми, і ви знаєте, що в ваших числа ніколи не буде розділювачів розрядів, можна зробити ось так:

// десь на початку
using System.Globalization;

// а потім ось так
return float.Parse(val.Replace(",","."), CultureInfo.InvariantCulture);

4. Якщо ж вам потрібні і розділювачі розрядів, і дроби, то рішення немає. З числа 12,345 неможливо довідатися, це українське число «дванадцять цілих та триста сорок п'ять десятих» або американське число «дванадцять тисяч триста сорок п'ять», вони повністю ідентичні.

Подякували: 0xDADA11C7, leofun012

3

Re: Як правильно парсити float з тексту?

var ukrainianCultureInfo = new CultureInfo("uk-UA");

на що таке якщо є CultureInfo.CurrentCulture

float.Parse(val.Replace(",","."), CultureInfo.InvariantCulture);

на мій скромний погляд looks like bad practice
Я покищо зробив так

private float SafeStringToFloat(string val)
    {
        float ret = -100f;
        if (val.Contains("E"))
        {
            return (float)Decimal.Parse(val, System.Globalization.NumberStyles.Float);
        }
        if(float.TryParse(val,out ret))
        {
            return ret;
        }
        if(float.TryParse(val, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.CurrentCulture,out ret))
        {
            return ret;
        }
        if (float.TryParse(val, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out ret))
        {
            return ret;
        }
        return ret;
    }

4 Востаннє редагувалося koala (23.12.2021 10:03:46)

Re: Як правильно парсити float з тексту?

cheappi386 написав:
-100f;

Може, Single.NaN чи як він там?

Подякували: Dmy, leofun012

5

Re: Як правильно парсити float з тексту?

koala написав:
cheappi386 написав:
-100f;

Може, Single.NaN чи як він там?

Так звісно буде краще. Хоча значення нижче 0 не передбачаються.

Подякували: 0xDADA11C71

6

Re: Як правильно парсити float з тексту?

cheappi386 написав:
var ukrainianCultureInfo = new CultureInfo("uk-UA");

на що таке якщо є CultureInfo.CurrentCulture

А чим це відрізнятиметься від випадку, коли культуру взагалі не передавати?

Ну і CultureInfo.CurrentCulture не обов'язково буде українською *DONT_KNOW*

Подякували: leofun011