Разбор числовых строк
Обновлен: Ноябрь 2007
Для всех числовых типов имеется статический метод Parse, который можно использовать для преобразования строкового представления числового типа в реальный числовой тип. Эти методы позволяют разбирать строки, которые были созданы с помощью одного из спецификаторов формата в Строки числовых форматов.
Знаки, используемые для представления символов денежной единицы, разделителей групп разрядов и разделителей целой и дробной частей числа, описываются в поставщиках формата. Метод Parse допускает применение поставщика формата, что позволяет задавать и выполнять явный разбор строк, связанных с региональными параметрами. Если поставщик формата не указан, то используется поставщик, связанный с текущим потоком. Дополнительные сведения см. в разделе Общие сведения о форматировании.
В следующем примере кода выполняется преобразование строки в целочисленное значение, увеличение этого значения и вывод результата на экран.
Dim MyString As String = "12345"
Dim MyInt As Integer = Integer.Parse(MyString)
MyInt += 1
Console.WriteLine(MyInt)
' The result is "12346".
string MyString = "12345";
int MyInt = int.Parse(MyString);
MyInt++;
Console.WriteLine(MyInt);
// The result is "12346".
Перечисление NumberStyles указывает разрешенный формат разбираемой строки. Это перечисление можно использовать для разбора строки, содержащей знак денежной единицы, разделитель целой и дробной частей числа, степень, скобки и т. д. Например, в региональных параметрах en-US строка, содержащая запятую, не может быть преобразована в целое число с использованием метода Parse, если не будет передано перечисление NumberStyles.AllowThousands.
NumberStyles.AllowCurrencySymbol указывает, что число должно разбираться как денежная единица, а не как десятичное число. NumberStyles.AllowDecimalPoint показывает, что разрешен десятичный разделитель. Допустимые знаки десятичного разделителя определены свойствами NumberDecimalSeparator или CurrencyDecimalSeparator текущего объекта NumberFormatInfo. NumberStyles.AllowThousands показывает, что разрешен разделитель групп разрядов. Допустимые знаки разделителей групп разрядов определены свойствами NumberGroupSeparator или CurrencyGroupSeparator текущего объекта NumberFormatInfo. Полную таблицу допустимых типов нечисловых знаков см. в документации на перечисление NumberStyles.
В перечислении NumberStyles используются знаки, описанные в текущих региональных параметрах. Это перечисление используется при разборе. Если региональные параметры не описаны путем передачи объекта CultureInfo, устанавливающего параметры, соответствующие разбираемой строке, то используются региональные параметры, связанные с текущим потоком.
Следующий пример кода является недопустимым и поэтому будет создавать исключение. Этот пример описывает неправильный способ разбора строки, содержащей нечисловые знаки. Сначала создается объект CultureInfo, передаваемый в метод Parse, чтобы указать, что для разбора будут использованы региональные параметры en-US.
Imports System.Globalization
Dim MyCultureInfo As CultureInfo = new CultureInfo("en-US")
Dim MyString As String = "123,456"
Dim MyInt As Integer = Integer.Parse(MyString, MyCultureInfo)
Console.WriteLine(MyInt)
' Raises System.Format exception.
using System.Globalization;
CultureInfo MyCultureInfo = new CultureInfo("en-US");
string MyString = "123,456";
int MyInt = int.Parse(MyString, MyCultureInfo);
Console.WriteLine(MyInt);
// Raises System.Format exception.
При использовании перечисления NumberStyles с флагом AllowThousands метод Parse не обрабатывает запятую, которая приводила к созданию исключения в предыдущем примере. В следующем примере кода используется та же самая строка, что и в предыдущем, но исключение не создается. Как и в предыдущем примере, сначала создается новый объект CultureInfo, передаваемый в метод Parse для того, чтобы указать, что для разбора будет использован разделитель групп разрядов, применяющийся в региональных параметрах en-US.
Imports System.Globalization
Dim MyCultureInfo As CultureInfo = new CultureInfo("en-US")
Dim MyString As String = "123,456"
Dim MyInt As Integer = Integer.Parse(MyString, NumberStyles.AllowThousands, MyCultureInfo)
Console.WriteLine(MyInt)
' The result is "123456".
using System.Globalization;
CultureInfo MyCultureInfo = new CultureInfo("en-US");
string MyString = "123,456";
int MyInt = int.Parse(MyString, NumberStyles.AllowThousands, MyCultureInfo);
Console.WriteLine(MyInt);
// The result is "123456".