Использование NumberStyles — анализ чисел в C#

Наверняка всем неоднократно приходилось выделять числа из строк. Это довольно простая задача, если в строке записано только число, без разделителей, без указания валюты (в случае вывода стоимости), не используя экспоненциальное представление. Но порой это не так…

В C#, для того, чтобы получить число из строки, нужно воспользоваться функцией Parse (либо TryParse). Например так:

var strI = "123";
var strF = "123,8";
var iDigit = Int32.Parse(strI);
var fDigit = Double.Parse(strF);

Теперь немного усложним задачу, пусть нам нужно получить число из такой строки «$199», означающей стоимость чего-либо. Метод, использованный виде, без изменений работать не будет, так как строка содержит символ, отличный от числового. Первой мыслью, наверное, будет очистить строку от лишних символом, а затем преобразовать её в число. Да, это сработает, в данном конкретном случае, но это плохой вариант. Почему? А как на счет такого числа «31.57E04»?

Проблему с различными числами поможет решить перечисление NumberStyles. Подробнее об значениях, которые может принимать данное перечисление можно прочитать в MSDN. Я перечислю только некоторые

AllowCurrencySymbol — указывает, что строка может содержать символ денежной единицы.
AllowDecimalPoint — строка может содержать десятичный разделитель.
llowExponent — число в строке может быть представлено в экспоненциальном виде.
AllowHexSpecifier — число в строке представлено в шестнадцатеричном виде.
AllowParentheses — число может быть заключено в пару скобок, при этом такое число считается отрицательным. AllowThousands — в строке может находиться разделители групп, отделяющие сотни от тысяч.

Сразу следует обратить внимание, что данное перечисление помечено атрибутом [FlagsAttribute]. О том, что это такое можно узнать здесь

Вернёмся к нашему числу «31.57E04», чтобы его правильно распознать, необходимо указать, что число может содержать десятичный разделитель и представлено в экспоненциальном виде.

const string strCost = "31.57E04";
var cost = Double.Parse(strCost, NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent);

Для значения суммы «$199»

const string strCost = "$199";
var cost = Double.Parse(strCost, NumberStyles.Currency);

Если же символ денежной единицы отличен от имеющихся, например используется «BYR», то нужный символ можно указать самому:

const string strCost = "199000 BYR";
var numberFormat = new NumberFormatInfo
        {
            CurrencySymbol = "BYR",
        };
var cost = Double.Parse(strCost, NumberStyles.Currency, numberFormat);

Проверим работу с шестнадцатеричными числами:

            const string hexStr = "AAFF";
            var hexNumber = long.Parse(hexStr, NumberStyles.HexNumber);
 

Использование NumberStyles избавляет от необходимости создания множества «велосипедов».

Приятного программирования.

Добавить комментарий