Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Все числовые типы имеют два метода статического синтаксического анализа, Parse
и TryParse
можно использовать для преобразования строкового представления числа в числовый тип. Эти методы позволяют анализировать строки, созданные с помощью строк форматирования, описанных в строках стандартного числового формата и настраиваемых строк числовых форматов. По умолчанию методы Parse
и TryParse
могут успешно преобразовывать строки, содержащие только десятичные цифры, в целые числовые значения. Они могут успешно преобразовать строки, содержащие целочисленные и дробные десятичные цифры, разделители групп и десятичный разделитель в значения с плавающей запятой. Метод Parse
создает исключение, если операция завершается ошибкой, а TryParse
метод возвращается false
.
Примечание.
Начиная с .NET 7 числовые типы в .NET также реализуют System.IParsable<TSelf> интерфейс, определяющий IParsable<TSelf>.Parse и IParsable<TSelf>.TryParse методы.
Анализ и форматирование поставщиков
Как правило, строковые представления числовых значений отличаются в зависимости от культуры. Элементы числовых строк, такие как символы валют, разделители групп (или тысячи) и десятичные разделители, отличаются в зависимости от культурных особенностей. Методы синтаксического анализа неявно или явно используют поставщик формата, который распознает эти культуроспецифические вариации. Если поставщик формата не указан при вызове метода Parse
или TryParse
, используется поставщик формата, связанный с текущими языковыми и региональными параметрами (объект NumberFormatInfo, возвращаемый свойством NumberFormatInfo.CurrentInfo).
Поставщик формата представлен реализацией IFormatProvider . Этот интерфейс имеет одного члена, метод GetFormat, параметром которого является объект Type, представляющий тип для форматирования. Этот метод возвращает объект, предоставляющий сведения о форматировании. .NET поддерживает следующие две IFormatProvider реализации для синтаксического анализа числовых строк:
CultureInfo Объект, метод которого CultureInfo.GetFormat возвращает NumberFormatInfo объект, предоставляющий информацию о форматировании в зависимости от культурной специфики.
NumberFormatInfo объект, метод которого NumberFormatInfo.GetFormat возвращает сам себя.
В следующем примере пытаются преобразовать каждую строку в массиве в значение Double. Сначала он пытается проанализировать строку, используя поставщика формата, который учитывает особенности культуры английского языка (Соединенные Штаты). Если эта операция вызывает исключение FormatException, она пытается проанализировать строку с помощью поставщика формата, который отражает культурные нормы французского языка (Франция).
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
string[] values = { "1,304.16", "$1,456.78", "1,094", "152",
"123,45 €", "1 304,16", "Ae9f" };
double number;
CultureInfo culture = null;
foreach (string value in values) {
try {
culture = CultureInfo.CreateSpecificCulture("en-US");
number = Double.Parse(value, culture);
Console.WriteLine($"{culture.Name}: {value} --> {number}");
}
catch (FormatException) {
Console.WriteLine($"{culture.Name}: Unable to parse '{value}'.");
culture = CultureInfo.CreateSpecificCulture("fr-FR");
try {
number = Double.Parse(value, culture);
Console.WriteLine($"{culture.Name}: {value} --> {number}");
}
catch (FormatException) {
Console.WriteLine($"{culture.Name}: Unable to parse '{value}'.");
}
}
Console.WriteLine();
}
}
}
// The example displays the following output:
// en-US: 1,304.16 --> 1304.16
//
// en-US: Unable to parse '$1,456.78'.
// fr-FR: Unable to parse '$1,456.78'.
//
// en-US: 1,094 --> 1094
//
// en-US: 152 --> 152
//
// en-US: Unable to parse '123,45 €'.
// fr-FR: Unable to parse '123,45 €'.
//
// en-US: Unable to parse '1 304,16'.
// fr-FR: 1 304,16 --> 1304.16
//
// en-US: Unable to parse 'Ae9f'.
// fr-FR: Unable to parse 'Ae9f'.
Imports System.Globalization
Module Example
Public Sub Main()
Dim values() As String = {"1,304.16", "$1,456.78", "1,094", "152",
"123,45 €", "1 304,16", "Ae9f"}
Dim number As Double
Dim culture As CultureInfo = Nothing
For Each value As String In values
Try
culture = CultureInfo.CreateSpecificCulture("en-US")
number = Double.Parse(value, culture)
Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number)
Catch e As FormatException
Console.WriteLine("{0}: Unable to parse '{1}'.",
culture.Name, value)
culture = CultureInfo.CreateSpecificCulture("fr-FR")
Try
number = Double.Parse(value, culture)
Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number)
Catch ex As FormatException
Console.WriteLine("{0}: Unable to parse '{1}'.",
culture.Name, value)
End Try
End Try
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' en-US: 1,304.16 --> 1304.16
'
' en-US: Unable to parse '$1,456.78'.
' fr-FR: Unable to parse '$1,456.78'.
'
' en-US: 1,094 --> 1094
'
' en-US: 152 --> 152
'
' en-US: Unable to parse '123,45 €'.
' fr-FR: Unable to parse '123,45 €'.
'
' en-US: Unable to parse '1 304,16'.
' fr-FR: 1 304,16 --> 1304.16
'
' en-US: Unable to parse 'Ae9f'.
' fr-FR: Unable to parse 'Ae9f'.
Синтаксический анализ и значения NumberStyles
Элементы стиля (например, пробелы, разделители групп и десятичный разделитель), которые может обрабатывать операция синтаксического анализа, определяются значением NumberStyles перечисления. По умолчанию строки, представляющие целые значения, анализируются с помощью NumberStyles.Integer значения, которое разрешает только числовые цифры, начальные и конечные пробелы, а также начальный знак. Строки, представляющие значения с плавающей запятой, анализируются с помощью сочетания NumberStyles.Float значений и NumberStyles.AllowThousands значений. Этот составной стиль разрешает десятичные цифры вместе с начальным и конечным пробелом, ведущим знаком, десятичным разделителем, разделителем групп и экспонентом. Вызвав перегрузку метода Parse
или TryParse
, включающую параметр типа NumberStyles и установив один или несколько флагов NumberStyles, можно управлять стилевыми элементами, которые могут быть в строке, чтобы операция анализа успешно завершилась.
Например, строка, содержащая разделитель групп, не может быть преобразована в Int32 значение с помощью Int32.Parse(String) метода. Однако преобразование завершается успешно, если вы используете NumberStyles.AllowThousands флаг, как показано в следующем примере.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
string value = "1,304";
int number;
IFormatProvider provider = CultureInfo.CreateSpecificCulture("en-US");
if (Int32.TryParse(value, out number))
Console.WriteLine($"{value} --> {number}");
else
Console.WriteLine($"Unable to convert '{value}'");
if (Int32.TryParse(value, NumberStyles.Integer | NumberStyles.AllowThousands,
provider, out number))
Console.WriteLine($"{value} --> {number}");
else
Console.WriteLine($"Unable to convert '{value}'");
}
}
// The example displays the following output:
// Unable to convert '1,304'
// 1,304 --> 1304
Imports System.Globalization
Module Example
Public Sub Main()
Dim value As String = "1,304"
Dim number As Integer
Dim provider As IFormatProvider = CultureInfo.CreateSpecificCulture("en-US")
If Int32.TryParse(value, number) Then
Console.WriteLine("{0} --> {1}", value, number)
Else
Console.WriteLine("Unable to convert '{0}'", value)
End If
If Int32.TryParse(value, NumberStyles.Integer Or NumberStyles.AllowThousands,
provider, number) Then
Console.WriteLine("{0} --> {1}", value, number)
Else
Console.WriteLine("Unable to convert '{0}'", value)
End If
End Sub
End Module
' The example displays the following output:
' Unable to convert '1,304'
' 1,304 --> 1304
Предупреждение
Операция разбора данных всегда использует соглашения о форматировании определенной культуры. Если не указать культурную среду при передаче объекта CultureInfo или NumberFormatInfo, используется культура, которая связана с текущим потоком.
В следующей таблице перечислены элементы NumberStyles перечисления и описывается влияние, которое они имеют в операции синтаксического анализа.
Значение NumberStyles | Влияние на синтаксический анализ строки |
---|---|
NumberStyles.None | Разрешены только числовые цифры. |
NumberStyles.AllowDecimalPoint | Разрешены десятичные разделители и дробные цифры. Для целочисленных значений допускается только ноль в виде дробной цифры. Допустимые десятичные разделители определяются свойством NumberFormatInfo.NumberDecimalSeparator или NumberFormatInfo.CurrencyDecimalSeparator. |
NumberStyles.AllowExponent | Символ e или E можно использовать для указания экспоненциальной нотации. Дополнительные сведения см. в разделе NumberStyles. |
NumberStyles.AllowLeadingWhite | Допускается наличие начальных пробелов. |
NumberStyles.AllowTrailingWhite | Допускаются конечные пробелы. |
NumberStyles.AllowLeadingSign | Положительный или отрицательный знак может предшествовать числовым цифрам. |
NumberStyles.AllowTrailingSign | Положительный или отрицательный знак может следовать числовым цифрам. |
NumberStyles.AllowParentheses | Скобки можно использовать для указания отрицательных значений. |
NumberStyles.AllowThousands | Разрешен разделитель групп. Символ разделителя группы определяется свойством NumberFormatInfo.NumberGroupSeparator или NumberFormatInfo.CurrencyGroupSeparator. |
NumberStyles.AllowCurrencySymbol | Разрешен символ валюты. Символ валюты определяется свойством NumberFormatInfo.CurrencySymbol . |
NumberStyles.AllowHexSpecifier | Строка для синтаксического анализа интерпретируется как шестнадцатеричное число. Он может включать шестнадцатеричные цифры 0-9, A-F и a-f. Этот флаг можно использовать только для синтаксического анализа целых значений. |
NumberStyles.AllowBinarySpecifier | Строка для разбора интерпретируется как двоичное число. Он может включать двоичные цифры 0 и 1. Этот флаг можно использовать только для синтаксического анализа целых значений. |
Кроме того, перечисление NumberStyles предоставляет следующие составные стили, которые включают несколько NumberStyles флагов.
Разбор двоичных и шестнадцатеричных BigInteger объектов
При синтаксическом анализе BigInteger с флагами AllowHexSpecifier или AllowBinarySpecifier входная строка интерпретируется как шестнадцатеричное или двоичное число, совпадающее по длине со строкой. Например, синтаксический анализ "11"
в виде двоичного числа BigInteger дает -1
, так как это интерпретация 11
в качестве значения дополнения со знаком с ровно 2 цифрами. Если вы хотите положительный результат, добавьте ведущий 0
, например "011"
, который анализируется как 3
.
Синтаксический анализ и цифры Юникода
Стандарт Юникода определяет кодовые точки для цифр в различных системах записи. Например, кодовые точки от U+0030 до U+0039 представляют основные латинские цифры от 0 до 9, кодовые точки от U+09E6 до U+09EF представляют цифры Bangla от 0 до 9, а кодовые точки от U+FF10 до U+FF19 представляют цифры Fullwidth от 0 до 9. Однако единственными числовыми цифрами, распознаваемыми методами синтаксического анализа, являются базовые латинские цифры 0-9 с точками кода от U+0030 до U+0039. Если методу синтаксического анализа передана строка, содержащая любые нецифровые символы, метод вызывает FormatExceptionисключение.
В следующем примере метод используется Int32.Parse для анализа строк, состоящих из цифр в разных системах записи. Как показано в выходных данных примера, попытка синтаксического анализа основных латинских цифр завершается успешно, но попытка проанализировать цифры двойной ширины, арабско-индийские и бенгальские завершается ошибкой.
using System;
public class Example
{
public static void Main()
{
string value;
// Define a string of basic Latin digits 1-5.
value = "\u0031\u0032\u0033\u0034\u0035";
ParseDigits(value);
// Define a string of Fullwidth digits 1-5.
value = "\uFF11\uFF12\uFF13\uFF14\uFF15";
ParseDigits(value);
// Define a string of Arabic-Indic digits 1-5.
value = "\u0661\u0662\u0663\u0664\u0665";
ParseDigits(value);
// Define a string of Bangla digits 1-5.
value = "\u09e7\u09e8\u09e9\u09ea\u09eb";
ParseDigits(value);
}
static void ParseDigits(string value)
{
try {
int number = Int32.Parse(value);
Console.WriteLine($"'{value}' --> {number}");
}
catch (FormatException) {
Console.WriteLine($"Unable to parse '{value}'.");
}
}
}
// The example displays the following output:
// '12345' --> 12345
// Unable to parse '12345'.
// Unable to parse '١٢٣٤٥'.
// Unable to parse '১২৩৪৫'.
Module Example
Public Sub Main()
Dim value As String
' Define a string of basic Latin digits 1-5.
value = ChrW(&h31) + ChrW(&h32) + ChrW(&h33) + ChrW(&h34) + ChrW(&h35)
ParseDigits(value)
' Define a string of Fullwidth digits 1-5.
value = ChrW(&hff11) + ChrW(&hff12) + ChrW(&hff13) + ChrW(&hff14) + ChrW(&hff15)
ParseDigits(value)
' Define a string of Arabic-Indic digits 1-5.
value = ChrW(&h661) + ChrW(&h662) + ChrW(&h663) + ChrW(&h664) + ChrW(&h665)
ParseDigits(value)
' Define a string of Bangla digits 1-5.
value = ChrW(&h09e7) + ChrW(&h09e8) + ChrW(&h09e9) + ChrW(&h09ea) + ChrW(&h09eb)
ParseDigits(value)
End Sub
Sub ParseDigits(value As String)
Try
Dim number As Integer = Int32.Parse(value)
Console.WriteLine("'{0}' --> {1}", value, number)
Catch e As FormatException
Console.WriteLine("Unable to parse '{0}'.", value)
End Try
End Sub
End Module
' The example displays the following output:
' '12345' --> 12345
' Unable to parse '12345'.
' Unable to parse '١٢٣٤٥'.
' Unable to parse '১২৩৪৫'.