Строки стандартных числовых форматов
Строки стандартных числовых форматов служат для форматирования стандартных числовых типов. Строка стандартных числовых форматов использует формат [format specifier][precision specifier]
, где:
Описатель формата — это один алфавитный символ, указывающий тип числа, например валюту или процент. Любая строка числового формата, содержащая более одной буквы, включая пробелы, интерпретируется как строка настраиваемого числового формата. Дополнительные сведения см. в строк пользовательского числового формата.
Описатель точности является необязательным целым числом, влияющим на число цифр в результирующей строке. В .NET 7 и более поздних версиях максимальное значение точности составляет 999 999 999 999. В .NET 6 максимальное значение точности равно Int32.MaxValue. В предыдущих версиях .NET точность может варьироваться от 0 до 99. Описатель точности управляет числом цифр в строковом представлении числа. Он не округляет само число. Для выполнения операции округления используйте метод Math.Ceiling, Math.Floorили Math.Round.
Если описатель точности управляет числом дробных цифр в строке результата, результирующий строка отражает число, округленное до представляющего результата, ближайшего к бесконечно точному результату. Если есть два равных практически представленных результата:
- в .NET Framework и .NET Core до .NET Core 2.0, среда выполнения выбирает результат с меньшей значительной цифрой (то есть с помощью MidpointRounding.AwayFromZero).
- в .NET Core 2.1 и более поздних версияхсреда выполнения выбирает результат с еще меньшей цифрой (то есть с помощью MidpointRounding.ToEven).
Примечание.
Описатель точности определяет число цифр в результирующей строке. Чтобы заполнить строку результатов с начальными или конечными пробелами, используйте функцию составного форматирования и определите компонент выравнивания в элементе форматирования.
Строки стандартного числового формата поддерживаются следующими:
Некоторые перегрузки метода
ToString
всех числовых типов. Например, можно указать строку числового формата для методов Int32.ToString(String) и Int32.ToString(String, IFormatProvider).Метод
TryFormat
всех числовых типов, например Int32.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider) и Single.TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider).Функция составного форматирования .NET, которая используется некоторыми методами
Write
иWriteLine
классов Console и StreamWriter, методом String.Format и методом StringBuilder.AppendFormat. Компонент составного формата позволяет включить строковое представление нескольких элементов данных в одну строку, указать ширину поля и выровнять числа в поле. Дополнительные сведения см. в составныхформатирования.Интерполированные строки в C# и Visual Basic, которые предоставляют упрощенный синтаксис по сравнению с составными строками форматирования.
Подсказка
Вы можете скачать программы форматирования, приложение .NET Core Windows Forms, которое позволяет применять строки форматирования к числовым или значениям даты и времени и отображает строку результата. Исходный код доступен для C# и Visual Basic.
Описатели формата "Стандартный"
В следующей таблице описаны спецификаторы стандартных числовых форматов и отображены примеры выходных данных, производимых каждым спецификатором формата. Дополнительные сведения об использовании строк стандартного числового формата см. в разделе Примечаниях, а также в разделе Пример кода для полного иллюстрации их использования.
Результат форматируемой строки для определенного языка и региональных параметров может отличаться от следующих примеров. Параметры операционной системы, параметры пользователя, переменные среды и используемая версия .NET могут повлиять на формат. Например, начиная с .NET 5, .NET пытается объединить культурные форматы на разных платформах. Дополнительные сведения см. в статье о глобализации .NET и ICU.
Описатель формата | Имя | Описание | Примеры |
---|---|---|---|
"B" или "b" | Двоичный | Результат: двоичная строка. Поддерживается только целыми типами (.NET 8+). Описатель точности: число цифр в результирующей строке. Дополнительные сведения: Описатель формата двоичного формата ("B"). |
42 ("B") -> 101010 255 ("b16") -> 0000000011111111 |
"C" или "c" | Валюта | Результат: значение валюты. Поддерживается: для всех числовых типов данных. Описатель точности: количество цифр дробной части. Описатель точности по умолчанию: определяется NumberFormatInfo.CurrencyDecimalDigits. Дополнительные сведения см. в подразделе Описатель формата валюты (C). |
123.456 ("C", en-US) -> \$123.46 123.456 ("C", fr-FR) -> 123,46 € 123.456 ("C", ja-JP) -> 123 -123.456 ("C3", en-US) -> (\$123.456) -123.456 ("C3", fr-FR) -> -123,456 € -123.456 ("C3", ja-JP) -> --123.456 |
"D" или "d" | Десятичное число | Результат: целочисленные цифры с необязательным отрицательным знаком. Поддерживается: только целочисленными типами данных. Описатель точности: минимальное число цифр. Описатель точности по умолчанию: минимальное необходимое число цифр. Дополнительные сведения см. в подразделе Описатель десятичного формата (D). |
1234 ("D") -> 1234 -1234 ("D6") - -> 001234 |
"E" или "e" | Экспоненциальный (научный) | Результат: экспоненциальная нотация. Поддерживается: для всех числовых типов данных. Описатель точности: количество цифр дробной части. Описатель точности по умолчанию: 6. Дополнительные сведения см. в подразделе Описатель экспоненциального формата (E). |
1052.0329112756 ("E", en-US) -> 1.052033E+003 1052.0329112756 ("e", fr-FR) -> 105203e+003 -1052.0329112756 ("e2", en-US) -> -1.05e+003 -1052.0329112756 ("E2", fr-FR) -> -105E+003 |
"F" или "f" | С фиксированной запятой | Результат: цифры целой и дробной частей с необязательным отрицательным знаком. Поддерживается: для всех числовых типов данных. Описатель точности: количество цифр дробной части. Описатель точности по умолчанию: определяется NumberFormatInfo.NumberDecimalDigits. Дополнительные сведения см. в подразделе Описатель формата с фиксированной запятой (F). |
1234.567 ("F", en-US) -> 1234.57 1234.567 ("F", de-DE) -> 1234 57 1234 ("F1", en-US) -> 1234.0 1234 ("F1", de-DE) -> 1234,0 -1234.56 ("F4", en-US) -> -1234.5600 -1234.56 ("F4", de-DE) -> -1234,5600 |
"G" или "g" | Общие сведения | Результат: наиболее компактная запись из двух вариантов — экспоненциального и с фиксированной запятой. Поддерживается: для всех числовых типов данных. Описатель точности: количество значащих цифр. Описатель точности по умолчанию: определяется численным типом. Дополнительные сведения см. в подразделе Описатель общего формата (G). |
-123.456 ("G", en-US) -> -123.456 -123.456 ("G", sv-SE) -> -123 456 123.4546 ("G4", en-US) -> 123.5 123.4546 ("G4", sv-SE) -> 123,5 -1.234567890e-25 ("G", en-US) -> -1.23456789E-25 -1.234567890e-25 ("G", sv-SE) -> -1,23456789E-25 |
"N" или "n" | Число | Результат: цифры целой и дробной частей, разделители групп и разделитель целой и дробной частей с необязательным отрицательным знаком. Поддерживается: для всех числовых типов данных. Описатель точности: желаемое число знаков дробной части. Описатель точности по умолчанию: определяется NumberFormatInfo.NumberDecimalDigits. Дополнительные сведения см. в подразделе Описатель числового формата (N). |
1234.567 ("N", en-US) -> 1,234.57 1234.567 ("N", ru-RU) -> 1 234 57 1234 ("N1", en-US) -> 1,234.0 1234 ("N1", ru-RU) -> 1 234 0 -1234.56 ("N3", en-US) -> -1,234.560 -1234.56 ("N3", ru-RU) -> -1 234 560 |
"P" или "p" | Процент | Результат: число, умноженное на 100 и отображаемое с символом процента. Поддерживается: для всех числовых типов данных. Описатель точности: желаемое число знаков дробной части. Описатель точности по умолчанию: определяется NumberFormatInfo.PercentDecimalDigits. Дополнительные сведения см. в подразделе Описатель формата процента (P). |
1 ("P", en-US) -> 100,00 % 1 ("P", fr-FR) -> 100 00 % -0.39678 ("P1", en-US) -> -39,7 % -0.39678 ("P1", fr-FR) -> -39,7 % |
"R" или "r" | Круговая поездка | Результат: строка, которая может выполнять циклический переход к одинаковому числу. Поддерживается: Single, Double и BigInteger. Примечание. Рекомендуется только для типа BigInteger. Для типов Double используйте G17; для типов Single используйте "G9". Описатель точности: игнорируется. Дополнительные сведения: описатель формата "R"). |
123456789.12345678 ("R") -> 123456789.12345678 -1234567890.12345678 ("R") -> -1234567890.1234567 |
"X" или "x" | Шестнадцатеричное | Результат: шестнадцатеричная строка. Поддерживается: только целочисленными типами данных. Описатель точности: число цифр в результирующей строке. Дополнительные сведения: Описатель шестнадцатеричного формата ("X") . |
255 ("X") -> FF -1 ("x") -> ff 255 ("x4") -> 00ff -1 ("X4") -> 00FF |
Любой другой символ | Неизвестный описатель | Результат: вызывает FormatException во время выполнения. |
Использование стандартных числовых строк форматирования
Примечание.
Примеры C# в этой статье выполняются во встроенном средстве выполнения кода Try.NET и в песочнице. Нажмите кнопку запуска , чтобы запустить пример в интерактивном окне. После выполнения кода его можно изменить и запустить измененный код, выбрав выполнить еще раз. Измененный код выполняется в интерактивном окне или, если компиляция завершается ошибкой, в интерактивном окне отображаются все сообщения об ошибках компилятора C#.
Стандартная строка числового формата может использоваться для определения форматирования числового значения одним из следующих способов:
Его можно передать в метод
TryFormat
или перегрузку методаToString
с параметромformat
. В следующем примере осуществляется форматирование числового значения в качестве строки со значением валюты для текущего языка и региональных параметров (en-US).Decimal value = static_cast<Decimal>(123.456); Console::WriteLine(value.ToString("C2")); // Displays $123.46
decimal value = 123.456m; Console.WriteLine(value.ToString("C2")); // Displays $123.46
Dim value As Decimal = 123.456d Console.WriteLine(value.ToString("C2")) ' Displays $123.46
Его можно указать в качестве аргумента
formatString
в элементе формата, используемом с такими методами, как String.Format, Console.WriteLineи StringBuilder.AppendFormat. Дополнительные сведения см. в составныхформатирования. В следующем примере элемент формата используется для вставки значения валюты в строку.Decimal value = static_cast<Decimal>(123.456); Console::WriteLine("Your account balance is {0:C2}.", value); // Displays "Your account balance is $123.46."
decimal value = 123.456m; Console.WriteLine($"Your account balance is {value:C2}."); // Displays "Your account balance is $123.46."
Dim value As Decimal = 123.456d Console.WriteLine("Your account balance is {0:C2}.", value) ' Displays "Your account balance is $123.46."
При необходимости можно указать аргумент
alignment
, чтобы указать ширину числового поля и выровнять его значение по правому или левому краю. В следующем примере по левому краю выравнивается значение валюты в поле 28 символов, и оно выравнивает значение валюты в 14-символьном поле.array<Decimal>^ amounts = { static_cast<Decimal>(16305.32), static_cast<Decimal>(18794.16) }; Console::WriteLine(" Beginning Balance Ending Balance"); Console::WriteLine(" {0,-28:C2}{1,14:C2}", amounts[0], amounts[1]); // Displays: // Beginning Balance Ending Balance // $16,305.32 $18,794.16
decimal[] amounts = { 16305.32m, 18794.16m }; Console.WriteLine(" Beginning Balance Ending Balance"); Console.WriteLine(" {0,-28:C2}{1,14:C2}", amounts[0], amounts[1]); // Displays: // Beginning Balance Ending Balance // $16,305.32 $18,794.16
Dim amounts() As Decimal = {16305.32d, 18794.16d} Console.WriteLine(" Beginning Balance Ending Balance") Console.WriteLine(" {0,-28:C2}{1,14:C2}", amounts(0), amounts(1)) ' Displays: ' Beginning Balance Ending Balance ' $16,305.32 $18,794.16
Его можно указать в качестве
formatString
аргумента в элементе интерполированного выражения интерполированной строки. Дополнительные сведения см. в статье интерполяции строк в справочнике по C# или интерполированных строках в справочнике по Visual Basic.
В приведенных ниже разделах содержится подробная информация о всех строках стандартных числовых форматов.
Описатель двоичного формата (B)
Описатель двоичного формата ("B") преобразует число в строку двоичных цифр. Этот формат поддерживается только для целочисленных типов и только в .NET 8+.
Минимальное количество знаков в выходной строке задается спецификатором точности. Недостающие знаки в строке заменяются нулями.
Строка результата не влияет на сведения о форматировании текущего объекта NumberFormatInfo.
Описатель формата валюты (C)
При использовании описателя формата валюты ("C") число преобразуется в строку, представляющую сумму в некоторой валюте. Желаемое количество знаков дробной части в результирующей строке задается описателем точности. Если описатель точности опущен, точность по умолчанию определяется свойством NumberFormatInfo.CurrencyDecimalDigits.
Если форматируемое значение содержит больше десятичных знаков, чем задано или возможно по умолчанию, в результирующей строке дробное значение округляется. Если значение справа от заданного числа десятичных знаков больше или равно 5, последний знак в результирующей строке округляется в сторону от нуля.
Строка результата зависит от сведений о форматировании текущего объекта NumberFormatInfo. В следующей таблице перечислены свойства NumberFormatInfo, которые управляют форматированием возвращаемой строки.
Свойство NumberFormatInfo | Описание |
---|---|
CurrencyPositivePattern | Определяет размещение символа валюты для положительных значений. |
CurrencyNegativePattern | Определяет размещение символа валюты для отрицательных значений и указывает, представлен ли отрицательный знак скобками или свойством NegativeSign. |
NegativeSign | Определяет отрицательный знак, используемый, если CurrencyNegativePattern указывает, что скобки не используются. |
CurrencySymbol | Определяет символ валюты. |
CurrencyDecimalDigits | Определяет число десятичных цифр по умолчанию в значении валюты. Это значение можно переопределить с помощью описателя точности. |
CurrencyDecimalSeparator | Определяет строку, разделяющую целочисленные и десятичные цифры. |
CurrencyGroupSeparator | Определяет строку, разделяющую группы целочисленных чисел. |
CurrencyGroupSizes | Определяет число целых цифр, отображаемых в группе. |
Следующий пример форматирует значение Double с помощью описателя формата валюты:
double value = 12345.6789;
Console::WriteLine(value.ToString("C", CultureInfo::CurrentCulture));
Console::WriteLine(value.ToString("C3", CultureInfo::CurrentCulture));
Console::WriteLine(value.ToString("C3",
CultureInfo::CreateSpecificCulture("da-DK")));
// The example displays the following output on a system whose
// current culture is English (United States):
// $12,345.68
// $12,345.679
// kr 12.345,679
double value = 12345.6789;
Console.WriteLine(value.ToString("C", CultureInfo.CurrentCulture));
Console.WriteLine(value.ToString("C3", CultureInfo.CurrentCulture));
Console.WriteLine(value.ToString("C3",
CultureInfo.CreateSpecificCulture("da-DK")));
// The example displays the following output on a system whose
// current culture is English (United States):
// $12,345.68
// $12,345.679
// 12.345,679 kr
Dim value As Double = 12345.6789
Console.WriteLine(value.ToString("C", CultureInfo.CurrentCulture))
Console.WriteLine(value.ToString("C3", CultureInfo.CurrentCulture))
Console.WriteLine(value.ToString("C3", _
CultureInfo.CreateSpecificCulture("da-DK")))
' The example displays the following output on a system whose
' current culture is English (United States):
' $12,345.68
' $12,345.679
' kr 12.345,679
Описатель десятичного формата (D)
При использовании описателя десятичного формата ("D") число преобразуется в строку, состоящую из десятичных цифр (0–9); если число отрицательное, перед ним ставится отрицательный знак. Этот формат доступен только для целых типов.
Минимальное количество знаков в выходной строке задается спецификатором точности. Недостающие знаки в строке заменяются нулями. Если описатель точности не задан, по умолчанию используется минимальное значение, позволяющее представить целое число без нулей в начале.
Строка результата зависит от сведений о форматировании текущего объекта NumberFormatInfo. Как показано в следующей таблице, одно свойство влияет на форматирование строки результата.
Свойство NumberFormatInfo | Описание |
---|---|
NegativeSign | Определяет строку, указывающую, что число является отрицательным. |
Следующий пример форматирует значение Int32 с помощью описатель десятичного формата.
int value;
value = 12345;
Console::WriteLine(value.ToString("D"));
// Displays 12345
Console::WriteLine(value.ToString("D8"));
// Displays 00012345
value = -12345;
Console::WriteLine(value.ToString("D"));
// Displays -12345
Console::WriteLine(value.ToString("D8"));
// Displays -00012345
int value;
value = 12345;
Console.WriteLine(value.ToString("D"));
// Displays 12345
Console.WriteLine(value.ToString("D8"));
// Displays 00012345
value = -12345;
Console.WriteLine(value.ToString("D"));
// Displays -12345
Console.WriteLine(value.ToString("D8"));
// Displays -00012345
Dim value As Integer
value = 12345
Console.WriteLine(value.ToString("D"))
' Displays 12345
Console.WriteLine(value.ToString("D8"))
' Displays 00012345
value = -12345
Console.WriteLine(value.ToString("D"))
' Displays -12345
Console.WriteLine(value.ToString("D8"))
' Displays -00012345
Описатель экспоненциального формата (E)
При использовании описателя экспоненциального формата ("E") число преобразуется в строку вида "-d.ddd…E+ddd" или "-d.ddd…e+ddd", где каждый символ "d" обозначает цифру (0–9). Если число отрицательное, в начале строки ставится отрицательный знак. Перед разделителем целой и дробной части всегда стоит ровно одна цифра.
Требуемое число знаков дробной части задается спецификатором точности. Если спецификатор точности отсутствует, по умолчанию число знаков дробной части равно шести.
Регистр описателя формата задает регистр буквы, стоящей перед экспонентой ("E" или "e"). Экспонента состоит из знака "плюс" или "минус" и трех цифр. Недостающие до минимума цифры заменяются нулями, если это необходимо.
Строка результата зависит от сведений о форматировании текущего объекта NumberFormatInfo. В следующей таблице перечислены свойства NumberFormatInfo, которые управляют форматированием возвращаемой строки.
Свойство NumberFormatInfo | Описание |
---|---|
NegativeSign | Определяет строку, указывающую, что число отрицательно для коэффициента и экспонента. |
NumberDecimalSeparator | Определяет строку, которая отделяет целочисленную цифру от десятичных цифр в коэффициенте. |
PositiveSign | Определяет строку, указывающую, что экспонент является положительным. |
Следующий пример форматирует значение Double с помощью описателя экспоненциального формата:
double value = 12345.6789;
Console::WriteLine(value.ToString("E", CultureInfo::InvariantCulture));
// Displays 1.234568E+004
Console::WriteLine(value.ToString("E10", CultureInfo::InvariantCulture));
// Displays 1.2345678900E+004
Console::WriteLine(value.ToString("e4", CultureInfo::InvariantCulture));
// Displays 1.2346e+004
Console::WriteLine(value.ToString("E",
CultureInfo::CreateSpecificCulture("fr-FR")));
// Displays 1,234568E+004
double value = 12345.6789;
Console.WriteLine(value.ToString("E", CultureInfo.InvariantCulture));
// Displays 1.234568E+004
Console.WriteLine(value.ToString("E10", CultureInfo.InvariantCulture));
// Displays 1.2345678900E+004
Console.WriteLine(value.ToString("e4", CultureInfo.InvariantCulture));
// Displays 1.2346e+004
Console.WriteLine(value.ToString("E",
CultureInfo.CreateSpecificCulture("fr-FR")));
// Displays 1,234568E+004
Dim value As Double = 12345.6789
Console.WriteLine(value.ToString("E", CultureInfo.InvariantCulture))
' Displays 1.234568E+004
Console.WriteLine(value.ToString("E10", CultureInfo.InvariantCulture))
' Displays 1.2345678900E+004
Console.WriteLine(value.ToString("e4", CultureInfo.InvariantCulture))
' Displays 1.2346e+004
Console.WriteLine(value.ToString("E", _
CultureInfo.CreateSpecificCulture("fr-FR")))
' Displays 1,234568E+004
Описатель формата фиксированной точки (F)
При использовании описателя формата с фиксированной запятой ("F") число преобразуется в строку вида "-ddd.ddd…", где каждый символ "d" обозначает цифру (0–9). Если число отрицательное, в начале строки ставится отрицательный знак.
Требуемое число знаков дробной части задается спецификатором точности. Если описатель точности опущен, текущее свойство NumberFormatInfo.NumberDecimalDigits предоставляет числовую точность.
Строка результата зависит от сведений о форматировании текущего объекта NumberFormatInfo. В следующей таблице перечислены свойства объекта NumberFormatInfo, который управляет форматированием строки результата.
Свойство NumberFormatInfo | Описание |
---|---|
NegativeSign | Определяет строку, указывающую, что число является отрицательным. |
NumberDecimalSeparator | Определяет строку, которая отделяет целочисленные цифры от десятичных цифр. |
NumberDecimalDigits | Определяет число десятичных цифр по умолчанию. Это значение можно переопределить с помощью описателя точности. |
В следующем примере форматируется Double и значение Int32 с описательом формата фиксированной точки:
int integerNumber;
integerNumber = 17843;
Console::WriteLine(integerNumber.ToString("F",
CultureInfo::InvariantCulture));
// Displays 17843.00
integerNumber = -29541;
Console::WriteLine(integerNumber.ToString("F3",
CultureInfo::InvariantCulture));
// Displays -29541.000
double doubleNumber;
doubleNumber = 18934.1879;
Console::WriteLine(doubleNumber.ToString("F", CultureInfo::InvariantCulture));
// Displays 18934.19
Console::WriteLine(doubleNumber.ToString("F0", CultureInfo::InvariantCulture));
// Displays 18934
doubleNumber = -1898300.1987;
Console::WriteLine(doubleNumber.ToString("F1", CultureInfo::InvariantCulture));
// Displays -1898300.2
Console::WriteLine(doubleNumber.ToString("F3",
CultureInfo::CreateSpecificCulture("es-ES")));
// Displays -1898300,199
int integerNumber;
integerNumber = 17843;
Console.WriteLine(integerNumber.ToString("F",
CultureInfo.InvariantCulture));
// Displays 17843.00
integerNumber = -29541;
Console.WriteLine(integerNumber.ToString("F3",
CultureInfo.InvariantCulture));
// Displays -29541.000
double doubleNumber;
doubleNumber = 18934.1879;
Console.WriteLine(doubleNumber.ToString("F", CultureInfo.InvariantCulture));
// Displays 18934.19
Console.WriteLine(doubleNumber.ToString("F0", CultureInfo.InvariantCulture));
// Displays 18934
doubleNumber = -1898300.1987;
Console.WriteLine(doubleNumber.ToString("F1", CultureInfo.InvariantCulture));
// Displays -1898300.2
Console.WriteLine(doubleNumber.ToString("F3",
CultureInfo.CreateSpecificCulture("es-ES")));
// Displays -1898300,199
Dim integerNumber As Integer
integerNumber = 17843
Console.WriteLine(integerNumber.ToString("F", CultureInfo.InvariantCulture))
' Displays 17843.00
integerNumber = -29541
Console.WriteLine(integerNumber.ToString("F3", CultureInfo.InvariantCulture))
' Displays -29541.000
Dim doubleNumber As Double
doubleNumber = 18934.1879
Console.WriteLine(doubleNumber.ToString("F", CultureInfo.InvariantCulture))
' Displays 18934.19
Console.WriteLine(doubleNumber.ToString("F0", CultureInfo.InvariantCulture))
' Displays 18934
doubleNumber = -1898300.1987
Console.WriteLine(doubleNumber.ToString("F1", CultureInfo.InvariantCulture))
' Displays -1898300.2
Console.WriteLine(doubleNumber.ToString("F3", _
CultureInfo.CreateSpecificCulture("es-ES")))
' Displays -1898300,199
Описатель общего формата (G)
При использовании описателя общего формата ("G") число преобразуется в более короткий из двух вариантов: запись с фиксированной запятой или экспоненциальная запись. При этом учитывается тип числа и наличие описателя точности. Описатель точности определяет максимальное количество значащих цифр, которые могут быть использованы в результирующей строке. Если описатель точности не задан или равен нулю, точность определяется типом числа, как показано в следующей таблице.
Числовой тип | Точность по умолчанию |
---|---|
Byte или SByte | 3 знака |
Int16 или UInt16 | 5 знака |
Int32 или UInt32 | 10 цифр. |
Int64 | 19 знака |
UInt64 | 20 цифр |
BigInteger | Неограниченное (то же, что и "R") |
Half | Наименьшее число цифр для представления числа |
Single | Наименьшее число цифр для представления числа (в .NET Framework G7 — значение по умолчанию) |
Double | Наименьшее число цифр для представления числа (в .NET Framework G15 — значение по умолчанию) |
Decimal | Наименьшее число цифр для представления числа |
Нотация с фиксированной запятой используется, если экспонента результата в экспоненциальной нотации длиннее пяти знаков, но меньше спецификатора точности, в противном случае используется научная нотация. При необходимости результат содержит разделитель целой и дробной частей; нули в конце дробной части после разделителя отбрасываются. Если описатель точности задан и число значащих цифр результата превосходит указанное значение точности, лишние цифры отбрасываются округлением.
Тем не менее, если число относится к типу Decimal и описатель точности не задан, всегда используется нотация с фиксированной запятой, а нули в конце не отбрасываются.
Если используется экспоненциальная нотация, регистр буквы, стоящей перед экспонентой, определяется регистром описателя формата (буква "E" соответствует "G", "e" соответствует "g"). Экспонента содержит не менее двух цифр. Это отличает данный формат от экспоненциальной записи, создаваемой при использовании описателя экспоненциального формата, поскольку в последнем случае экспонента содержит не менее трех цифр.
При использовании со значением Double описатель формата "G17" гарантирует, что исходное Double значение успешно выполняет круговые пути. Это связано с тем, что Double является числом с плавающей запятой IEEE 754-2008, совместимым с двойной точностью (binary64
), которая дает до 17 значимых цифр точности. В .NET Framework рекомендуется использовать вместо опис атель формата R"R", так как в некоторых случаях значения с плавающей запятой с двойной точностью не удается успешно выполнить обход.
При использовании со значением Single описатель формата G9 гарантирует, что исходное Single значение успешно выполняет циклический обход. Это связано с тем, что Single является номером с плавающей запятой IEEE 754-2008(binary32
), что дает до девяти значимых цифр точности. По соображениям производительности рекомендуется использовать вместо описателя формата R "R".
Строка результата зависит от сведений о форматировании текущего объекта NumberFormatInfo. В следующей таблице перечислены NumberFormatInfo свойства, управляющие форматированием строки результата.
Свойство NumberFormatInfo | Описание |
---|---|
NegativeSign | Определяет строку, указывающую, что число является отрицательным. |
NumberDecimalSeparator | Определяет строку, которая отделяет целочисленные цифры от десятичных цифр. |
PositiveSign | Определяет строку, указывающую, что экспонент является положительным. |
В следующем примере различные значения с плавающей запятой форматируются с помощью описателя общего формата.
double number;
number = 12345.6789;
Console::WriteLine(number.ToString("G", CultureInfo::InvariantCulture));
// Displays 12345.6789
Console::WriteLine(number.ToString("G",
CultureInfo::CreateSpecificCulture("fr-FR")));
// Displays 12345,6789
Console::WriteLine(number.ToString("G7", CultureInfo::InvariantCulture));
// Displays 12345.68
number = .0000023;
Console::WriteLine(number.ToString("G", CultureInfo::InvariantCulture));
// Displays 2.3E-06
Console::WriteLine(number.ToString("G",
CultureInfo::CreateSpecificCulture("fr-FR")));
// Displays 2,3E-06
number = .0023;
Console::WriteLine(number.ToString("G", CultureInfo::InvariantCulture));
// Displays 0.0023
number = 1234;
Console::WriteLine(number.ToString("G2", CultureInfo::InvariantCulture));
// Displays 1.2E+03
number = Math::PI;
Console::WriteLine(number.ToString("G5", CultureInfo::InvariantCulture));
// Displays 3.1416
double number;
number = 12345.6789;
Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture));
// Displays 12345.6789
Console.WriteLine(number.ToString("G",
CultureInfo.CreateSpecificCulture("fr-FR")));
// Displays 12345,6789
Console.WriteLine(number.ToString("G7", CultureInfo.InvariantCulture));
// Displays 12345.68
number = .0000023;
Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture));
// Displays 2.3E-06
Console.WriteLine(number.ToString("G",
CultureInfo.CreateSpecificCulture("fr-FR")));
// Displays 2,3E-06
number = .0023;
Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture));
// Displays 0.0023
number = 1234;
Console.WriteLine(number.ToString("G2", CultureInfo.InvariantCulture));
// Displays 1.2E+03
number = Math.PI;
Console.WriteLine(number.ToString("G5", CultureInfo.InvariantCulture));
// Displays 3.1416
Dim number As Double
number = 12345.6789
Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture))
' Displays 12345.6789
Console.WriteLine(number.ToString("G", _
CultureInfo.CreateSpecificCulture("fr-FR")))
' Displays 12345,6789
Console.WriteLine(number.ToString("G7", CultureInfo.InvariantCulture))
' Displays 12345.68
number = .0000023
Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture))
' Displays 2.3E-06
Console.WriteLine(number.ToString("G", _
CultureInfo.CreateSpecificCulture("fr-FR")))
' Displays 2,3E-06
number = .0023
Console.WriteLine(number.ToString("G", CultureInfo.InvariantCulture))
' Displays 0.0023
number = 1234
Console.WriteLine(number.ToString("G2", CultureInfo.InvariantCulture))
' Displays 1.2E+03
number = Math.Pi
Console.WriteLine(number.ToString("G5", CultureInfo.InvariantCulture))
' Displays 3.1416
Описатель числовых форматов (N)
Спецификатор числового формата ("N") преобразует число в стоку вида "-d,ddd,ddd.ddd… ", где знак "-" при необходимости представляет знак отрицательного числа, знак "d" означает цифру (0-9), знак "," — разделитель групп, а знак "." —- разделитель целой и дробной части. Требуемое число знаков дробной части задается спецификатором точности. Если описатель точности опущен, число десятичных разрядов определяется текущим свойством NumberFormatInfo.NumberDecimalDigits.
Строка результата зависит от сведений о форматировании текущего объекта NumberFormatInfo. В следующей таблице перечислены NumberFormatInfo свойства, управляющие форматированием строки результата.
Свойство NumberFormatInfo | Описание |
---|---|
NegativeSign | Определяет строку, указывающую, что число является отрицательным. |
NumberNegativePattern | Определяет формат отрицательных значений и указывает, представлен ли отрицательный знак скобками или свойством NegativeSign. |
NumberGroupSizes | Определяет количество целочисленных цифр, отображаемых между разделителями групп. |
NumberGroupSeparator | Определяет строку, разделяющую группы целочисленных чисел. |
NumberDecimalSeparator | Определяет строку, разделяющую целочисленные и десятичные цифры. |
NumberDecimalDigits | Определяет число десятичных цифр по умолчанию. Это значение можно переопределить с помощью описателя точности. |
В следующем примере различные значения с плавающей запятой форматируются с помощью описателя числового формата.
double dblValue = -12445.6789;
Console::WriteLine(dblValue.ToString("N", CultureInfo::InvariantCulture));
// Displays -12,445.68
Console::WriteLine(dblValue.ToString("N1",
CultureInfo::CreateSpecificCulture("sv-SE")));
// Displays -12 445,7
int intValue = 123456789;
Console::WriteLine(intValue.ToString("N1", CultureInfo::InvariantCulture));
// Displays 123,456,789.0
double dblValue = -12445.6789;
Console.WriteLine(dblValue.ToString("N", CultureInfo.InvariantCulture));
// Displays -12,445.68
Console.WriteLine(dblValue.ToString("N1",
CultureInfo.CreateSpecificCulture("sv-SE")));
// Displays -12 445,7
int intValue = 123456789;
Console.WriteLine(intValue.ToString("N1", CultureInfo.InvariantCulture));
// Displays 123,456,789.0
Dim dblValue As Double = -12445.6789
Console.WriteLine(dblValue.ToString("N", CultureInfo.InvariantCulture))
' Displays -12,445.68
Console.WriteLine(dblValue.ToString("N1", _
CultureInfo.CreateSpecificCulture("sv-SE")))
' Displays -12 445,7
Dim intValue As Integer = 123456789
Console.WriteLine(intValue.ToString("N1", CultureInfo.InvariantCulture))
' Displays 123,456,789.0
Описатель формата процента (P)
При использовании описателя формата процента ("P") число умножается на 100 и преобразуется в строку, представляющую процентную долю. Требуемое число знаков дробной части задается спецификатором точности. Если описатель точности опущен, используется числовая точность по умолчанию, предоставляемая текущим свойством PercentDecimalDigits.
В следующей таблице перечислены свойства NumberFormatInfo, которые управляют форматированием возвращаемой строки.
Свойство NumberFormatInfo | Описание |
---|---|
PercentPositivePattern | Определяет размещение символа процента для положительных значений. |
PercentNegativePattern | Определяет размещение символа процента и отрицательного символа для отрицательных значений. |
NegativeSign | Определяет строку, указывающую, что число является отрицательным. |
PercentSymbol | Определяет символ процента. |
PercentDecimalDigits | Определяет число десятичных цифр по умолчанию в процентном значении. Это значение можно переопределить с помощью описателя точности. |
PercentDecimalSeparator | Определяет строку, разделяющую целочисленные и десятичные цифры. |
PercentGroupSeparator | Определяет строку, разделяющую группы целочисленных чисел. |
PercentGroupSizes | Определяет число целых цифр, отображаемых в группе. |
В следующем примере значения с плавающей запятой форматируются с помощью описателя процентного формата.
double number = .2468013;
Console::WriteLine(number.ToString("P", CultureInfo::InvariantCulture));
// Displays 24.68 %
Console::WriteLine(number.ToString("P",
CultureInfo::CreateSpecificCulture("hr-HR")));
// Displays 24,68%
Console::WriteLine(number.ToString("P1", CultureInfo::InvariantCulture));
// Displays 24.7 %
double number = .2468013;
Console.WriteLine(number.ToString("P", CultureInfo.InvariantCulture));
// Displays 24.68 %
Console.WriteLine(number.ToString("P",
CultureInfo.CreateSpecificCulture("hr-HR")));
// Displays 24,68%
Console.WriteLine(number.ToString("P1", CultureInfo.InvariantCulture));
// Displays 24.7 %
Dim number As Double = .2468013
Console.WriteLine(number.ToString("P", CultureInfo.InvariantCulture))
' Displays 24.68 %
Console.WriteLine(number.ToString("P", _
CultureInfo.CreateSpecificCulture("hr-HR")))
' Displays 24,68%
Console.WriteLine(number.ToString("P1", CultureInfo.InvariantCulture))
' Displays 24.7 %
Описатель формата кругового пути (R)
Описатель формата "R") пытается убедиться, что числовое значение, преобразованное в строку, анализируется обратно в то же числовое значение. Этот формат поддерживается только для типов Half, Single, Doubleи BigInteger.
В .NET Framework и в версиях .NET Core до версии 3.0 описатель формата R не может успешно выполнять обходные Double значения в некоторых случаях. Для значений Double и Single описатель формата R обеспечивает относительно низкую производительность. Вместо этого рекомендуется использовать описатель формата "G17" для значений Double и "G9" формата для успешного обхода Single значений.
Если значение BigInteger отформатировано с помощью этого описателя, его строковое представление содержит все значимые цифры в значении BigInteger.
Хотя вы можете включить описатель точности, он игнорируется. Круглые пути имеют приоритет над точностью при использовании этого описателя. Строка результата зависит от сведений о форматировании текущего объекта NumberFormatInfo. В следующей таблице перечислены NumberFormatInfo свойства, управляющие форматированием строки результата.
Свойство NumberFormatInfo | Описание |
---|---|
NegativeSign | Определяет строку, указывающую, что число является отрицательным. |
NumberDecimalSeparator | Определяет строку, которая отделяет целочисленные цифры от десятичных цифр. |
PositiveSign | Определяет строку, указывающую, что экспонент является положительным. |
В следующем примере форматируется значение BigInteger с помощью описателя формата циклического пути.
#using <System.Numerics.dll>
using namespace System;
using namespace System::Numerics;
void main()
{
BigInteger value = BigInteger::Pow(Int64::MaxValue, 2);
Console::WriteLine(value.ToString("R"));
}
// The example displays the following output:
// 85070591730234615847396907784232501249
using System;
using System.Numerics;
public class Example
{
public static void Main()
{
var value = BigInteger.Pow(Int64.MaxValue, 2);
Console.WriteLine(value.ToString("R"));
}
}
// The example displays the following output:
// 85070591730234615847396907784232501249
Imports System.Numerics
Module Example
Public Sub Main()
Dim value = BigInteger.Pow(Int64.MaxValue, 2)
Console.WriteLine(value.ToString("R"))
End Sub
End Module
' The example displays the following output:
' 85070591730234615847396907784232501249
Это важно
В некоторых случаях Double значения, отформатированные со строкой стандартного числового формата R, не успешно выполняются при компиляции с помощью /platform:x64
или /platform:anycpu
коммутаторов и запускаются в 64-разрядных системах. Дополнительные сведения см. в следующем абзаце.
Чтобы обойти проблему с Double значениями, отформатированными со стандартной строкой числового формата R, не успешной обходной передачи при компиляции с помощью /platform:x64
или /platform:anycpu
коммутаторов и запускаемых в 64-разрядных системах, можно форматировать Double значения с помощью строки стандартного числового формата G17. В следующем примере используется строка формата "R" со значением Double, которое успешно не выполняет круговые пути, а также использует строку формата G17 для успешного обхода исходного значения:
Console.WriteLine("Attempting to round-trip a Double with 'R':");
double initialValue = 0.6822871999174;
string valueString = initialValue.ToString("R",
CultureInfo.InvariantCulture);
double roundTripped = double.Parse(valueString,
CultureInfo.InvariantCulture);
Console.WriteLine("{0:R} = {1:R}: {2}\n",
initialValue, roundTripped, initialValue.Equals(roundTripped));
Console.WriteLine("Attempting to round-trip a Double with 'G17':");
string valueString17 = initialValue.ToString("G17",
CultureInfo.InvariantCulture);
double roundTripped17 = double.Parse(valueString17,
CultureInfo.InvariantCulture);
Console.WriteLine("{0:R} = {1:R}: {2}\n",
initialValue, roundTripped17, initialValue.Equals(roundTripped17));
// If compiled to an application that targets anycpu or x64 and run on an x64 system,
// the example displays the following output:
// Attempting to round-trip a Double with 'R':
// .NET Framework:
// 0.6822871999174 = 0.68228719991740006: False
// .NET:
// 0.6822871999174 = 0.6822871999174: True
//
// Attempting to round-trip a Double with 'G17':
// 0.6822871999174 = 0.6822871999174: True
Imports System.Globalization
Module Example
Public Sub Main()
Console.WriteLine("Attempting to round-trip a Double with 'R':")
Dim initialValue As Double = 0.6822871999174
Dim valueString As String = initialValue.ToString("R",
CultureInfo.InvariantCulture)
Dim roundTripped As Double = Double.Parse(valueString,
CultureInfo.InvariantCulture)
Console.WriteLine("{0:R} = {1:R}: {2}",
initialValue, roundTripped, initialValue.Equals(roundTripped))
Console.WriteLine()
Console.WriteLine("Attempting to round-trip a Double with 'G17':")
Dim valueString17 As String = initialValue.ToString("G17",
CultureInfo.InvariantCulture)
Dim roundTripped17 As Double = double.Parse(valueString17,
CultureInfo.InvariantCulture)
Console.WriteLine("{0:R} = {1:R}: {2}",
initialValue, roundTripped17, initialValue.Equals(roundTripped17))
End Sub
End Module
' If compiled to an application that targets anycpu or x64 and run on an x64 system,
' the example displays the following output:
' Attempting to round-trip a Double with 'R':
' .NET Framework:
' 0.6822871999174 = 0.68228719991740006: False
' .NET:
' 0.6822871999174 = 0.6822871999174: True
'
' Attempting to round-trip a Double with 'G17':
' 0.6822871999174 = 0.6822871999174: True
Описатель шестнадцатеричного формата (X)
При использовании описателя шестнадцатеричного формата ("X") число преобразуется в строку шестнадцатеричных цифр. Регистр шестнадцатеричных цифр больше 9 совпадает с регистром описателя формата. Например, чтобы получить запись "ABCDEF", задайте описатель X" или, наоборот, задайте описатель "x", чтобы получить "abcdef". Этот формат доступен только для целых типов.
Минимальное количество знаков в выходной строке задается спецификатором точности. Недостающие знаки в строке заменяются нулями.
Строка результата не влияет на сведения о форматировании текущего объекта NumberFormatInfo.
В следующем примере форматы Int32 значения с описательом шестнадцатеричного формата.
int value;
value = 0x2045e;
Console::WriteLine(value.ToString("x"));
// Displays 2045e
Console::WriteLine(value.ToString("X"));
// Displays 2045E
Console::WriteLine(value.ToString("X8"));
// Displays 0002045E
value = 123456789;
Console::WriteLine(value.ToString("X"));
// Displays 75BCD15
Console::WriteLine(value.ToString("X2"));
// Displays 75BCD15
int value;
value = 0x2045e;
Console.WriteLine(value.ToString("x"));
// Displays 2045e
Console.WriteLine(value.ToString("X"));
// Displays 2045E
Console.WriteLine(value.ToString("X8"));
// Displays 0002045E
value = 123456789;
Console.WriteLine(value.ToString("X"));
// Displays 75BCD15
Console.WriteLine(value.ToString("X2"));
// Displays 75BCD15
Dim value As Integer
value = &h2045e
Console.WriteLine(value.ToString("x"))
' Displays 2045e
Console.WriteLine(value.ToString("X"))
' Displays 2045E
Console.WriteLine(value.ToString("X8"))
' Displays 0002045E
value = 123456789
Console.WriteLine(value.ToString("X"))
' Displays 75BCD15
Console.WriteLine(value.ToString("X2"))
' Displays 75BCD15
Примечания.
В этом разделе содержатся дополнительные сведения об использовании стандартных строк числовых форматов.
Параметры панели управления
Параметры в параметрах региональных и языковых параметров на панели управления влияют на строку результатов, созданную операцией форматирования. Эти параметры используются для инициализации объекта NumberFormatInfo, связанного с текущим языком и региональными параметрами, который предоставляет значения, используемые для управления форматированием. Компьютеры, использующие разные параметры, создают разные строки результатов.
Кроме того, если конструктор CultureInfo(String) используется для создания экземпляра нового объекта CultureInfo, представляющего тот же язык и региональные параметры, что и текущий язык и региональные параметры, все настройки, установленные элементом региональных и языковых параметров на панели управления, будут применены к новому объекту CultureInfo. Конструктор CultureInfo(String, Boolean) можно использовать для создания объекта CultureInfo, который не отражает настройки системы.
Свойства NumberFormatInfo
Форматирование зависит от свойств текущего объекта NumberFormatInfo, который предоставляется неявно текущим языком и региональными параметрами или явным образом параметром IFormatProvider метода, вызывающего форматирование. Укажите объект NumberFormatInfo или CultureInfo для этого параметра.
Примечание.
Сведения о настройке шаблонов или строк, используемых в форматировании числовых значений, см. в разделе NumberFormatInfo класса.
Целочисленные типы и типы с плавающей запятой
Некоторые описания спецификаторов стандартных числовых форматов относятся к целочисленным типам и типам с плавающей запятой. Целочисленные числовые типы : Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64и BigInteger. Числовые типы с плавающей запятой Decimal, Half, Singleи Double.
Бесконечности действительных чисел с плавающей запятой и NaN
Независимо от строки формата, если значение Half, Singleили Double типа с плавающей запятой является положительным бесконечностью, отрицательным бесконечностью или не числом (NaN), форматированная строка — это значение соответствующего PositiveInfinitySymbol, NegativeInfinitySymbolили свойства NaNSymbol, указанного текущим применимым объектом NumberFormatInfo.
Пример кода
Следующий пример форматирует целочисленное и числовое значение с плавающей запятой с помощью языка и региональных параметров en-US и всех стандартных числовых описателей. В этом примере используются два конкретных числовых типа (Double и Int32), но аналогичные результаты для любого из других числовых базовых типов (Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, BigInteger, Decimal, Halfи Single).
// Display string representations of numbers for en-us culture
CultureInfo ci = new CultureInfo("en-us");
// Output floating point values
double floating = 10761.937554;
Console.WriteLine("C: {0}",
floating.ToString("C", ci)); // Displays "C: $10,761.94"
Console.WriteLine("E: {0}",
floating.ToString("E03", ci)); // Displays "E: 1.076E+004"
Console.WriteLine("F: {0}",
floating.ToString("F04", ci)); // Displays "F: 10761.9376"
Console.WriteLine("G: {0}",
floating.ToString("G", ci)); // Displays "G: 10761.937554"
Console.WriteLine("N: {0}",
floating.ToString("N03", ci)); // Displays "N: 10,761.938"
Console.WriteLine("P: {0}",
(floating/10000).ToString("P02", ci)); // Displays "P: 107.62 %"
Console.WriteLine("R: {0}",
floating.ToString("R", ci)); // Displays "R: 10761.937554"
Console.WriteLine();
// Output integral values
int integral = 8395;
Console.WriteLine("C: {0}",
integral.ToString("C", ci)); // Displays "C: $8,395.00"
Console.WriteLine("D: {0}",
integral.ToString("D6", ci)); // Displays "D: 008395"
Console.WriteLine("E: {0}",
integral.ToString("E03", ci)); // Displays "E: 8.395E+003"
Console.WriteLine("F: {0}",
integral.ToString("F01", ci)); // Displays "F: 8395.0"
Console.WriteLine("G: {0}",
integral.ToString("G", ci)); // Displays "G: 8395"
Console.WriteLine("N: {0}",
integral.ToString("N01", ci)); // Displays "N: 8,395.0"
Console.WriteLine("P: {0}",
(integral/10000.0).ToString("P02", ci)); // Displays "P: 83.95 %"
Console.WriteLine("X: 0x{0}",
integral.ToString("X", ci)); // Displays "X: 0x20CB"
Console.WriteLine();
Option Strict On
Imports System.Globalization
Imports System.Threading
Module NumericFormats
Public Sub Main()
' Display string representations of numbers for en-us culture
Dim ci As New CultureInfo("en-us")
' Output floating point values
Dim floating As Double = 10761.937554
Console.WriteLine("C: {0}", _
floating.ToString("C", ci)) ' Displays "C: $10,761.94"
Console.WriteLine("E: {0}", _
floating.ToString("E03", ci)) ' Displays "E: 1.076E+004"
Console.WriteLine("F: {0}", _
floating.ToString("F04", ci)) ' Displays "F: 10761.9376"
Console.WriteLine("G: {0}", _
floating.ToString("G", ci)) ' Displays "G: 10761.937554"
Console.WriteLine("N: {0}", _
floating.ToString("N03", ci)) ' Displays "N: 10,761.938"
Console.WriteLine("P: {0}", _
(floating / 10000).ToString("P02", ci)) ' Displays "P: 107.62 %"
Console.WriteLine("R: {0}", _
floating.ToString("R", ci)) ' Displays "R: 10761.937554"
Console.WriteLine()
' Output integral values
Dim integral As Integer = 8395
Console.WriteLine("C: {0}", _
integral.ToString("C", ci)) ' Displays "C: $8,395.00"
Console.WriteLine("D: {0}", _
integral.ToString("D6")) ' Displays "D: 008395"
Console.WriteLine("E: {0}", _
integral.ToString("E03", ci)) ' Displays "E: 8.395E+003"
Console.WriteLine("F: {0}", _
integral.ToString("F01", ci)) ' Displays "F: 8395.0"
Console.WriteLine("G: {0}", _
integral.ToString("G", ci)) ' Displays "G: 8395"
Console.WriteLine("N: {0}", _
integral.ToString("N01", ci)) ' Displays "N: 8,395.0"
Console.WriteLine("P: {0}", _
(integral / 10000).ToString("P02", ci)) ' Displays "P: 83.95 %"
Console.WriteLine("X: 0x{0}", _
integral.ToString("X", ci)) ' Displays "X: 0x20CB"
Console.WriteLine()
End Sub
End Module