NumberFormatInfo Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет сведения для конкретного языка и региональных параметров для числовых значений форматирования и анализа.
public ref class NumberFormatInfo sealed : IFormatProvider
public ref class NumberFormatInfo sealed : ICloneable, IFormatProvider
public sealed class NumberFormatInfo : IFormatProvider
public sealed class NumberFormatInfo : ICloneable, IFormatProvider
[System.Serializable]
public sealed class NumberFormatInfo : ICloneable, IFormatProvider
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class NumberFormatInfo : ICloneable, IFormatProvider
type NumberFormatInfo = class
interface IFormatProvider
type NumberFormatInfo = class
interface ICloneable
interface IFormatProvider
[<System.Serializable>]
type NumberFormatInfo = class
interface ICloneable
interface IFormatProvider
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type NumberFormatInfo = class
interface ICloneable
interface IFormatProvider
Public NotInheritable Class NumberFormatInfo
Implements IFormatProvider
Public NotInheritable Class NumberFormatInfo
Implements ICloneable, IFormatProvider
- Наследование
-
NumberFormatInfo
- Атрибуты
- Реализации
Примеры
В следующем примере показано, как получить NumberFormatInfo объект для соответствующего CultureInfo объекта и использовать полученный объект для запроса сведений о форматировании чисел для конкретного языка и региональных параметров.
using namespace System;
using namespace System::Globalization;
using namespace System::Text;
int main()
{
StringBuilder^ builder = gcnew StringBuilder();
// Loop through all the specific cultures known to the CLR.
for each(CultureInfo^ culture in
CultureInfo::GetCultures (CultureTypes::SpecificCultures))
{
// Only show the currency symbols for cultures
// that speak English.
if (culture->TwoLetterISOLanguageName == "en")
{
// Display the culture name and currency symbol.
NumberFormatInfo^ numberFormat = culture->NumberFormat;
builder->AppendFormat("The currency symbol for '{0}'"+
"is '{1}'",culture->DisplayName,
numberFormat->CurrencySymbol);
builder->AppendLine();
}
}
Console::WriteLine(builder);
}
// This code produces the following output.
//
// The currency symbol for 'English (United States)' is '$'
// The currency symbol for 'English (United Kingdom)' is 'Ј'
// The currency symbol for 'English (Australia)' is '$'
// The currency symbol for 'English (Canada)' is '$'
// The currency symbol for 'English (New Zealand)' is '$'
// The currency symbol for 'English (Ireland)' is '?'
// The currency symbol for 'English (South Africa)' is 'R'
// The currency symbol for 'English (Jamaica)' is 'J$'
// The currency symbol for 'English (Caribbean)' is '$'
// The currency symbol for 'English (Belize)' is 'BZ$'
// The currency symbol for 'English (Trinidad and Tobago)' is 'TT$'
// The currency symbol for 'English (Zimbabwe)' is 'Z$'
// The currency symbol for 'English (Republic of the Philippines)' is 'Php'
using System;
using System.Globalization;
using System.Text;
public sealed class App
{
static void Main()
{
StringBuilder sb = new StringBuilder();
// Loop through all the specific cultures known to the CLR.
foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{
// Only show the currency symbols for cultures that speak English.
if (ci.TwoLetterISOLanguageName != "en") continue;
// Display the culture name and currency symbol.
NumberFormatInfo nfi = ci.NumberFormat;
sb.AppendFormat("The currency symbol for '{0}' is '{1}'",
ci.DisplayName, nfi.CurrencySymbol);
sb.AppendLine();
}
Console.WriteLine(sb.ToString());
}
}
// This code produces the following output.
//
// The currency symbol for 'English (United States)' is '$'
// The currency symbol for 'English (United Kingdom)' is '£'
// The currency symbol for 'English (Australia)' is '$'
// The currency symbol for 'English (Canada)' is '$'
// The currency symbol for 'English (New Zealand)' is '$'
// The currency symbol for 'English (Ireland)' is '?'
// The currency symbol for 'English (South Africa)' is 'R'
// The currency symbol for 'English (Jamaica)' is 'J$'
// The currency symbol for 'English (Caribbean)' is '$'
// The currency symbol for 'English (Belize)' is 'BZ$'
// The currency symbol for 'English (Trinidad and Tobago)' is 'TT$'
// The currency symbol for 'English (Zimbabwe)' is 'Z$'
// The currency symbol for 'English (Republic of the Philippines)' is 'Php'
Imports System.Globalization
Imports System.Text
Public Module Example
Public Sub Main()
Dim sb As New StringBuilder()
' Loop through all the specific cultures known to the CLR.
For Each ci In CultureInfo.GetCultures(CultureTypes.SpecificCultures)
' Only show the currency symbols for cultures that speak English.
If ci.TwoLetterISOLanguageName <> "en" Then Continue For
' Display the culture name and currency symbol.
Dim nfi As NumberFormatInfo = ci.NumberFormat
sb.AppendFormat("The currency symbol for '{0}' is '{1}'",
ci.DisplayName, nfi.CurrencySymbol)
sb.AppendLine()
Next
Console.WriteLine(sb.ToString())
End Sub
End Module
' The example displays output like the following:
' The currency symbol for 'English (United States)' is '$'
' The currency symbol for 'English (United Kingdom)' is '£'
' The currency symbol for 'English (Australia)' is '$'
' The currency symbol for 'English (Canada)' is '$'
' The currency symbol for 'English (New Zealand)' is '$'
' The currency symbol for 'English (Ireland)' is '?'
' The currency symbol for 'English (South Africa)' is 'R'
' The currency symbol for 'English (Jamaica)' is 'J$'
' The currency symbol for 'English (Caribbean)' is '$'
' The currency symbol for 'English (Belize)' is 'BZ$'
' The currency symbol for 'English (Trinidad and Tobago)' is 'TT$'
' The currency symbol for 'English (Zimbabwe)' is 'Z$'
' The currency symbol for 'English (Republic of the Philippines)' is 'Php'
' The currency symbol for 'English (India)' is 'Rs.'
' The currency symbol for 'English (Malaysia)' is 'RM'
' The currency symbol for 'English (Singapore)' is '$'
Комментарии
Класс NumberFormatInfo содержит сведения, относящиеся к языку и региональным параметрам, которые используются при форматировании и анализе числовых значений. Эти сведения включают символ валюты, десятичный символ, разделитель групп и символы для положительных и отрицательных знаков.
Создание экземпляра объекта NumberFormatInfo
Можно создать экземпляр NumberFormatInfo объекта, представляющего соглашения о форматировании текущего языка и региональных параметров, инвариантного языка и региональных параметров, определенного языка и региональных параметров или нейтрального языка и региональных параметров.
Создание экземпляра объекта NumberFormatInfo для текущего языка и региональных параметров
Вы можете создать экземпляр NumberFormatInfo объекта для текущего языка и региональных параметров любым из следующих способов. В каждом случае возвращенный NumberFormatInfo объект доступен только для чтения.
Извлекая объект, представляющий текущий язык и региональные CultureInfo параметры из CultureInfo.CurrentCulture свойства, и извлекая CultureInfo объект из его CultureInfo.NumberFormat свойства.
Извлекая объект, NumberFormatInfo возвращенный свойством
static
(Shared
в Visual Basic). CurrentInfoПутем вызова GetInstance метода с CultureInfo объектом, представляющим текущий язык и региональные параметры.
В следующем примере используются три способа создания NumberFormatInfo объектов, представляющих соглашения о форматировании текущего языка и региональных параметров. Он также извлекает значение IsReadOnly свойства, чтобы проиллюстрировать, что каждый объект доступен только для чтения.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
NumberFormatInfo current1 = CultureInfo.CurrentCulture.NumberFormat;
Console.WriteLine(current1.IsReadOnly);
NumberFormatInfo current2 = NumberFormatInfo.CurrentInfo;
Console.WriteLine(current2.IsReadOnly);
NumberFormatInfo current3 = NumberFormatInfo.GetInstance(CultureInfo.CurrentCulture);
Console.WriteLine(current3.IsReadOnly);
}
}
// The example displays the following output:
// True
// True
// True
Imports System.Globalization
Module Example
Public Sub Main()
Dim current1 As NumberFormatInfo = CultureInfo.CurrentCulture.NumberFormat
Console.WriteLine(current1.IsReadOnly)
Dim current2 As NumberFormatInfo = NumberFormatInfo.CurrentInfo
Console.WriteLine(current2.IsReadOnly)
Dim current3 As NumberFormatInfo = NumberFormatInfo.GetInstance(CultureInfo.CurrentCulture)
Console.WriteLine(current3.IsReadOnly)
End Sub
End Module
' The example displays the following output:
' True
' True
' True
Можно создать объект, доступный NumberFormatInfo для записи, который представляет соглашения текущего языка и региональных параметров любым из следующих способов:
Извлекая объект любым из способов, показанных в предыдущем примере кода, и вызывая NumberFormatInfo Clone метод для возвращаемого NumberFormatInfo объекта. При этом создается копия исходного NumberFormatInfo объекта, за исключением того, что его IsReadOnly свойство равно
false
.Вызывая CultureInfo.CreateSpecificCulture метод для создания CultureInfo объекта, представляющего текущий язык и региональные параметры, а затем используя его CultureInfo.NumberFormat свойство для получения NumberFormatInfo объекта.
В следующем примере показаны два способа создания экземпляра NumberFormatInfo объекта и отображение значения его IsReadOnly свойства для иллюстрации того, что объект не доступен только для чтения.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
NumberFormatInfo current1 = NumberFormatInfo.CurrentInfo;
current1 = (NumberFormatInfo) current1.Clone();
Console.WriteLine(current1.IsReadOnly);
CultureInfo culture2 = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name);
NumberFormatInfo current2 = culture2.NumberFormat;
Console.WriteLine(current2.IsReadOnly);
}
}
// The example displays the following output:
// False
// False
Imports System.Globalization
Module Example
Public Sub Main()
Dim current1 As NumberFormatInfo = NumberFormatInfo.CurrentInfo
current1 = CType(current1.Clone(), NumberFormatInfo)
Console.WriteLine(current1.IsReadOnly)
Dim culture2 As CultureInfo = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name)
Dim current2 As NumberFormatInfo = culture2.NumberFormat
Console.WriteLine(current2.IsReadOnly)
End Sub
End Module
' The example displays the following output:
' False
' False
Обратите внимание, что операционная система Windows позволяет пользователю переопределять некоторые NumberFormatInfo значения свойств, используемые в числовых операциях форматирования и синтаксического анализа с помощью элемента Region и Language в панель управления. Например, пользователь с языком и региональными параметрами (США) может отображать денежные значения как 1,1 ДОЛЛ. США вместо значения по умолчанию 1,1 долл. США. Объекты NumberFormatInfo , полученные ранее, отражают переопределения этих пользователей. Если это нежелательно, можно создать NumberFormatInfo объект, который не отражает переопределения пользователей (а также чтение и запись, а не только для чтения), вызвав CultureInfo.CultureInfo(String, Boolean) конструктор и указав значение false
аргумента useUserOverride
. В следующем примере показана иллюстрация для системы с текущим языком и региональными параметрами (США) и символом валюты которого по умолчанию было изменено значение $на USD.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
CultureInfo culture;
NumberFormatInfo nfi;
culture = CultureInfo.CurrentCulture;
nfi = culture.NumberFormat;
Console.WriteLine("Culture Name: {0}", culture.Name);
Console.WriteLine("User Overrides: {0}", culture.UseUserOverride);
Console.WriteLine("Currency Symbol: {0}\n", culture.NumberFormat.CurrencySymbol);
culture = new CultureInfo(CultureInfo.CurrentCulture.Name, false);
Console.WriteLine("Culture Name: {0}", culture.Name);
Console.WriteLine("User Overrides: {0}", culture.UseUserOverride);
Console.WriteLine("Currency Symbol: {0}", culture.NumberFormat.CurrencySymbol);
}
}
// The example displays the following output:
// Culture Name: en-US
// User Overrides: True
// Currency Symbol: USD
//
// Culture Name: en-US
// User Overrides: False
// Currency Symbol: $
Imports System.Globalization
Module Example
Public Sub Main()
Dim culture As CultureInfo
Dim nfi As NumberFormatInfo
culture = CultureInfo.CurrentCulture
nfi = culture.NumberFormat
Console.WriteLine("Culture Name: {0}", culture.Name)
Console.WriteLine("User Overrides: {0}", culture.UseUserOverride)
Console.WriteLine("Currency Symbol: {0}", culture.NumberFormat.CurrencySymbol)
Console.WriteLine()
culture = New CultureInfo(CultureInfo.CurrentCulture.Name, False)
Console.WriteLine("Culture Name: {0}", culture.Name)
Console.WriteLine("User Overrides: {0}", culture.UseUserOverride)
Console.WriteLine("Currency Symbol: {0}", culture.NumberFormat.CurrencySymbol)
End Sub
End Module
' The example displays the following output:
' Culture Name: en-US
' User Overrides: True
' Currency Symbol: USD
'
' Culture Name: en-US
' User Overrides: False
' Currency Symbol: $
CultureInfo.UseUserOverride Если свойству присвоено значение true
, свойства CultureInfo.DateTimeFormatCultureInfo.NumberFormat, а CultureInfo.TextInfo также извлекаются из параметров пользователя. Если параметры пользователя несовместимы с языком и региональными параметрами, связанными с CultureInfo объектом (например, если выбранный календарь не является одним из календарей, перечисленных свойством OptionalCalendars ), результаты методов и значения свойств не определены.
Создание экземпляра объекта NumberFormatInfo для инвариантного языка и региональных параметров
Инвариантная культура представляет язык и региональные параметры, не зависящие от языка и региональных параметров. Он основан на английском языке, но не на какой-либо конкретной англоязычной стране или регионе. Хотя данные конкретных языков и региональных параметров могут быть динамическими и могут изменяться в соответствии с новыми культурными соглашениями или предпочтениями пользователей, данные инвариантных региональных параметров не изменяются. Объект NumberFormatInfo , представляющий соглашения о форматировании инвариантного языка и региональных параметров, можно использовать для операций форматирования, в которых результирующих строк не должно отличаться в зависимости от языка и региональных параметров.
Вы можете создать экземпляр NumberFormatInfo объекта, представляющего соглашения о форматировании инвариантного языка и региональных параметров следующим образом:
Извлекая значение InvariantInfo свойства. Возвращенный NumberFormatInfo объект доступен только для чтения.
Извлекая значение CultureInfo.NumberFormat свойства из CultureInfo объекта, возвращаемого свойством CultureInfo.InvariantCulture . Возвращенный NumberFormatInfo объект доступен только для чтения.
Вызов конструктора класса без NumberFormatInfo параметров. Возвращаемый объект NumberFormatInfo доступен для чтения и записи.
В следующем примере каждый из этих методов используется для создания экземпляра NumberFormatInfo объекта, представляющего инвариантный язык и региональные параметры. Затем он указывает, доступен ли объект только для чтения.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
NumberFormatInfo nfi;
nfi = System.Globalization.NumberFormatInfo.InvariantInfo;
Console.WriteLine(nfi.IsReadOnly);
nfi = CultureInfo.InvariantCulture.NumberFormat;
Console.WriteLine(nfi.IsReadOnly);
nfi = new NumberFormatInfo();
Console.WriteLine(nfi.IsReadOnly);
}
}
// The example displays the following output:
// True
// True
// False
Imports System.Globalization
Module Example
Public Sub Main()
Dim nfi As NumberFormatInfo
nfi = System.Globalization.NumberFormatInfo.InvariantInfo
Console.WriteLine(nfi.IsReadOnly)
nfi = CultureInfo.InvariantCulture.NumberFormat
Console.WriteLine(nfi.IsReadOnly)
nfi = New NumberFormatInfo()
Console.WriteLine(nfi.IsReadOnly)
End Sub
End Module
' The example displays the following output:
' True
' True
' False
Создание экземпляра объекта NumberFormatInfo для определенного языка и региональных параметров
Определенный язык и региональные параметры представляют язык, который говорится в определенной стране или регионе. Например, en-US — это определенная культура, представляющая английский язык, который говорится в США, а en-CA — это определенная культура, представляющая английский язык, который говорится в Канаде. Вы можете создать экземпляр NumberFormatInfo объекта, представляющего соглашения о форматировании определенного языка и региональных параметров следующими способами:
Вызывая CultureInfo.GetCultureInfo(String) метод и извлекая значение свойства возвращаемого CultureInfo объекта NumberFormat . Возвращенный NumberFormatInfo объект доступен только для чтения.
Передав объект, представляющий язык и региональные CultureInfo параметры, объект которого NumberFormatInfo требуется получить в статический GetInstance метод. Возвращаемый объект NumberFormatInfo доступен для чтения и записи.
Вызывая CultureInfo.CreateSpecificCulture метод и извлекая значение свойства возвращаемого CultureInfo объекта NumberFormat . Возвращаемый объект NumberFormatInfo доступен для чтения и записи.
Вызывая один из CultureInfo.CultureInfo конструкторов классов и извлекая значение свойства возвращаемого CultureInfo объекта NumberFormat . Возвращаемый объект NumberFormatInfo доступен для чтения и записи.
В следующем примере используются четыре способа создания NumberFormatInfo объекта, который отражает соглашения о форматировании индонезийского языка и региональных параметров (Индонезия). Он также указывает, доступен ли каждый объект только для чтения.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
CultureInfo culture;
NumberFormatInfo nfi;
nfi = CultureInfo.GetCultureInfo("id-ID").NumberFormat;
Console.WriteLine("Read-only: {0}", nfi.IsReadOnly);
culture = new CultureInfo("id-ID");
nfi = NumberFormatInfo.GetInstance(culture);
Console.WriteLine("Read-only: {0}", nfi.IsReadOnly);
culture = CultureInfo.CreateSpecificCulture("id-ID");
nfi = culture.NumberFormat;
Console.WriteLine("Read-only: {0}", nfi.IsReadOnly);
culture = new CultureInfo("id-ID");
nfi = culture.NumberFormat;
Console.WriteLine("Read-only: {0}", nfi.IsReadOnly);
}
}
// The example displays the following output:
// Read-only: True
// Read-only: False
// Read-only: False
// Read-only: False
Imports System.Globalization
Module Example
Public Sub Main()
Dim culture As CultureInfo
Dim nfi As NumberFormatInfo
nfi = CultureInfo.GetCultureInfo("id-ID").NumberFormat
Console.WriteLine("Read-only: {0}", nfi.IsReadOnly)
culture = New CultureInfo("id-ID")
nfi = NumberFormatInfo.GetInstance(culture)
Console.WriteLine("Read-only: {0}", nfi.IsReadOnly)
culture = CultureInfo.CreateSpecificCulture("id-ID")
nfi = culture.NumberFormat
Console.WriteLine("Read-only: {0}", nfi.IsReadOnly)
culture = New CultureInfo("id-ID")
nfi = culture.NumberFormat
Console.WriteLine("Read-only: {0}", nfi.IsReadOnly)
End Sub
End Module
' The example displays the following output:
' Read-only: True
' Read-only: False
' Read-only: False
' Read-only: False
Создание экземпляра объекта NumberFormatInfo для нейтрального языка и региональных параметров
Нейтральный язык и региональные параметры представляют язык и региональные параметры, независимые от страны или региона. Обычно это родитель одного или нескольких конкретных языков и региональных параметров. Например, fr — это нейтральный язык и региональные параметры французского языка, а также родитель языка fr-FR. NumberFormatInfo Создается объект, представляющий соглашения о форматировании нейтрального языка и региональных параметров так же, как и NumberFormatInfo объект, представляющий соглашения о форматировании определенного языка и региональных параметров.
Примечание
В платформа .NET Framework версии 3.5 и более ранних версиях попытка получить NumberFormatInfo объект, который отражает соглашения о форматировании нейтрального языка и региональных параметров, NotSupportedException вызывает исключение.
Тем не менее, поскольку она не зависит от конкретной страны или региона, нейтральный язык и региональные параметры не имеют сведений о форматировании, зависящих от языка и региональных параметров. Вместо заполнения NumberFormatInfo объекта универсальными значениями платформа .NET Framework возвращает NumberFormatInfo объект, который отражает соглашения о форматировании определенного языка и региональных параметров, который является дочерним элементом нейтрального языка и региональных параметров. Например, NumberFormatInfo объект для нейтрального языка и региональных параметров отражает соглашения о форматировании языка и региональных параметров en-US, а NumberFormatInfo объект для языка и региональных параметров fr отражает соглашения о форматировании языка fr-FR.
Для определения соглашений о форматировании конкретных языков и региональных параметров каждый нейтральный язык и региональные параметры можно использовать следующий код.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
public class Example
{
public static void Main()
{
// Get all the neutral cultures
List<String> names = new List<String>();
Array.ForEach(CultureInfo.GetCultures(CultureTypes.NeutralCultures),
culture => names.Add(culture.Name));
names.Sort();
foreach (var name in names) {
// Ignore the invariant culture.
if (name == "") continue;
ListSimilarChildCultures(name);
}
}
private static void ListSimilarChildCultures(string name)
{
// Create the neutral NumberFormatInfo object.
NumberFormatInfo nfi = CultureInfo.GetCultureInfo(name).NumberFormat;
// Retrieve all specific cultures of the neutral culture.
CultureInfo[] cultures = Array.FindAll(CultureInfo.GetCultures(CultureTypes.SpecificCultures),
culture => culture.Name.StartsWith(name + "-", StringComparison.OrdinalIgnoreCase));
// Create an array of NumberFormatInfo properties
PropertyInfo[] properties = typeof(NumberFormatInfo).GetProperties(BindingFlags.Instance | BindingFlags.Public);
bool hasOneMatch = false;
foreach (var ci in cultures) {
bool match = true;
// Get the NumberFormatInfo for a specific culture.
NumberFormatInfo specificNfi = ci.NumberFormat;
// Compare the property values of the two.
foreach (var prop in properties) {
// We're not interested in the value of IsReadOnly.
if (prop.Name == "IsReadOnly") continue;
// For arrays, iterate the individual elements to see if they are the same.
if (prop.PropertyType.IsArray) {
IList nList = (IList) prop.GetValue(nfi, null);
IList sList = (IList) prop.GetValue(specificNfi, null);
if (nList.Count != sList.Count) {
match = false;
break;
}
for (int ctr = 0; ctr < nList.Count; ctr++) {
if (! nList[ctr].Equals(sList[ctr])) {
match = false;
break;
}
}
}
else if (! prop.GetValue(specificNfi).Equals(prop.GetValue(nfi))) {
match = false;
break;
}
}
if (match) {
Console.WriteLine("NumberFormatInfo object for '{0}' matches '{1}'",
name, ci.Name);
hasOneMatch = true;
}
}
if (! hasOneMatch)
Console.WriteLine("NumberFormatInfo object for '{0}' --> No Match", name);
Console.WriteLine();
}
}
Imports System.Collections
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Reflection
Module Example
Public Sub Main()
' Get all the neutral cultures
Dim names As New List(Of String)
Array.ForEach(CultureInfo.GetCultures(CultureTypes.NeutralCultures),
Sub(culture) names.Add(culture.Name))
names.Sort()
For Each name In names
' Ignore the invariant culture.
If name = "" Then Continue For
ListSimilarChildCultures(name)
Next
End Sub
Private Sub ListSimilarChildCultures(name As String)
' Create the neutral NumberFormatInfo object.
Dim nfi As NumberFormatInfo = CultureInfo.GetCultureInfo(name).NumberFormat
' Retrieve all specific cultures of the neutral culture.
Dim cultures() As CultureInfo = Array.FindAll(CultureInfo.GetCultures(CultureTypes.SpecificCultures),
Function(culture) culture.Name.StartsWith(name + "-", StringComparison.OrdinalIgnoreCase))
' Create an array of NumberFormatInfo properties
Dim properties() As PropertyInfo = GetType(NumberFormatInfo).GetProperties(BindingFlags.Instance Or BindingFlags.Public)
Dim hasOneMatch As Boolean = False
For Each ci In cultures
Dim match As Boolean = True
' Get the NumberFormatInfo for a specific culture.
Dim specificNfi As NumberFormatInfo = ci.NumberFormat
' Compare the property values of the two.
For Each prop In properties
' We're not interested in the value of IsReadOnly.
If prop.Name = "IsReadOnly" Then Continue For
' For arrays, iterate the individual elements to see if they are the same.
If prop.PropertyType.IsArray Then
Dim nList As IList = CType(prop.GetValue(nfi, Nothing), IList)
Dim sList As IList = CType(prop.GetValue(specificNfi, Nothing), IList)
If nList.Count <> sList.Count Then
match = false
Exit For
End If
For ctr As Integer = 0 To nList.Count - 1
If Not nList(ctr).Equals(sList(ctr))
match = false
Exit For
End If
Next
Else If Not prop.GetValue(specificNfi).Equals(prop.GetValue(nfi))
match = false
Exit For
End If
Next
If match Then
Console.WriteLine("NumberFormatInfo object for '{0}' matches '{1}'",
name, ci.Name)
hasOneMatch = true
End If
Next
If Not hasOneMatch Then
Console.WriteLine("NumberFormatInfo object for '{0}' --> No Match", name)
End If
Console.WriteLine()
End Sub
End Module
NumberFormatInfo и динамические данные
Данные, зависящие от языка и региональных параметров, для форматирования числовых значений, предоставляемых NumberFormatInfo классом, являются динамическими, как и культурные данные, предоставляемые классом CultureInfo . Не следует делать никаких предположений о стабильности значений для NumberFormatInfo объектов, связанных с конкретными CultureInfo объектами. Только данные, предоставляемые инвариантным языком и региональными параметрами и связанными с ним NumberFormatInfo объектами, стабильны. Другие данные могут меняться между сеансами приложений или даже в рамках одного сеанса по следующим причинам:
Обновления системы. Культурные предпочтения, такие как символ валюты или форматы валют, изменяются с течением времени. В этом случае клиентский компонент Центра обновления Windows включает изменения NumberFormatInfo в значение свойства для определенного языка и региональных параметров.
Язык и региональные параметры замены. Класс CultureAndRegionInfoBuilder можно использовать для замены данных существующего языка и региональных параметров.
Каскадные изменения значений свойств. Ряд свойств, связанных с языком и региональными параметрами, может изменяться во время выполнения, что, в свою очередь, приводит NumberFormatInfo к изменению данных. Например, текущий язык и региональные параметры можно изменить программным способом или с помощью действий пользователя. В этом случае объект, возвращаемый свойством, изменяется на объект, NumberFormatInfo связанный с текущим языком CurrentInfo и региональными параметрами.
Пользовательские настройки. Пользователи приложения могут переопределить некоторые значения, связанные с текущим языком и региональными параметрами системы, через регион и языковые параметры в панель управления. Например, пользователи могут выбрать другой символ валюты или другой символ десятичного разделителя. CultureInfo.UseUserOverride Если свойству
true
присвоено значение (значение по умолчанию), свойства NumberFormatInfo объекта также извлекаются из параметров пользователя.
Начиная с платформа .NET Framework 2.0 все переопределимые пользователем свойства NumberFormatInfo объекта инициализируются при создании объекта. По-прежнему существует вероятность несоответствия, так как ни создание объекта, ни процесс переопределения пользователя атомарны, а соответствующие значения могут изменяться во время создания объекта. Однако эти несоответствия должны быть крайне редкими.
Вы можете контролировать, отражаются ли переопределения пользователей в NumberFormatInfo объектах, представляющих тот же язык и региональные параметры, что и текущий язык и региональные параметры. В следующей таблице перечислены способы NumberFormatInfo извлечения объекта и указывает, отражает ли результирующий объект переопределения пользователей.
Источник объекта CultureInfo и NumberFormatInfo | Отражает переопределения пользователей |
---|---|
СвойствоCultureInfo.CurrentCulture.NumberFormat |
Да |
СвойствоNumberFormatInfo.CurrentInfo | Да |
Метод CultureInfo.CreateSpecificCulture | Да |
Метод CultureInfo.GetCultureInfo | Нет |
Конструктор CultureInfo(String) | Да |
Конструктор CultureInfo.CultureInfo(String, Boolean) | Зависит от значения useUserOverride параметра |
Если в противном случае нет убедительных причин, следует учитывать переопределения пользователей при использовании NumberFormatInfo объекта в клиентских приложениях для форматирования и анализа входных данных пользователя или отображения числовых данных. Для серверных приложений или автоматических приложений не следует учитывать переопределения пользователей. Однако если объект используется NumberFormatInfo явно или неявно для сохранения числовых данных в строковой NumberFormatInfo форме, следует либо использовать объект, который отражает соглашения о форматировании инвариантного языка и региональных параметров, либо указать строку настраиваемого числового формата, используемую независимо от языка и региональных параметров.
IFormatProvider, NumberFormatInfo и числовое форматирование
NumberFormatInfo Объект используется неявно или явно во всех числовых операциях форматирования. К ним относятся вызовы следующих методов:
Все числовые методы форматирования, такие как Int32.ToString, Double.ToStringи Convert.ToString(Int32).
Основной метод составного форматирования. String.Format
Другие методы составного форматирования, такие как Console.WriteLine(String, Object[]) и StringBuilder.AppendFormat(String, Object[]).
Все числовые операции форматирования используют реализацию IFormatProvider . Интерфейс IFormatProvider включает один метод. GetFormat(Type) Это метод обратного Type вызова, который передает объект, представляющий тип, необходимый для предоставления сведений о форматировании. Метод отвечает за возврат экземпляра этого типа или null
, если он не может предоставить экземпляр типа. Платформа .NET Framework предоставляет две IFormatProvider реализации для форматирования чисел:
Класс CultureInfo , представляющий определенный язык и региональные параметры (или определенный язык в определенной стране или регионе). В операции числового форматирования метод возвращает объект, CultureInfo.GetFormat связанный NumberFormatInfo со своим CultureInfo.NumberFormat свойством.
Класс NumberFormatInfo , предоставляющий сведения о соглашениях о форматировании связанного языка и региональных параметров. Метод NumberFormatInfo.GetFormat возвращает сам экземпляр.
IFormatProvider Если реализация не предоставляется методу форматирования явным образом, используется объект, CultureInfo возвращаемый свойствомCultureInfo.CurrentCulture, представляющим текущий язык и региональные параметры.
В следующем примере показана связь между интерфейсом IFormatProvider и NumberFormatInfo классом в операциях форматирования путем определения пользовательской IFormatProvider реализации. Его GetFormat метод отображает имя типа объекта, запрошенного операцией форматирования. Если интерфейс запрашивает NumberFormatInfo объект, этот метод предоставляет NumberFormatInfo объект для текущего языка и региональных параметров. Как показано в выходных данных из примера, Decimal.ToString(IFormatProvider) метод запрашивает NumberFormatInfo объект для предоставления сведений о форматировании, в то время как String.Format(IFormatProvider, String, Object[]) запросы NumberFormatInfo и объекты метода, DateTimeFormatInfo а также ICustomFormatter реализация.
using System;
using System.Globalization;
public class CurrentCultureFormatProvider : IFormatProvider
{
public Object GetFormat(Type formatType)
{
Console.WriteLine("Requesting an object of type {0}",
formatType.Name);
if (formatType == typeof(NumberFormatInfo))
return NumberFormatInfo.CurrentInfo;
else if (formatType == typeof(DateTimeFormatInfo))
return DateTimeFormatInfo.CurrentInfo;
else
return null;
}
}
public class Example
{
public static void Main()
{
Decimal amount = 1203.541m;
string value = amount.ToString("C2", new CurrentCultureFormatProvider());
Console.WriteLine(value);
Console.WriteLine();
string composite = String.Format(new CurrentCultureFormatProvider(),
"Date: {0} Amount: {1} Description: {2}",
DateTime.Now, 1264.03m, "Service Charge");
Console.WriteLine(composite);
Console.WriteLine();
}
}
// The example displays output like the following:
// Requesting an object of type NumberFormatInfo
// $1,203.54
//
// Requesting an object of type ICustomFormatter
// Requesting an object of type DateTimeFormatInfo
// Requesting an object of type NumberFormatInfo
// Date: 11/15/2012 2:00:01 PM Amount: 1264.03 Description: Service Charge
Imports System.Globalization
Public Class CurrentCultureFormatProvider : Implements IFormatProvider
Public Function GetFormat(formatType As Type) As Object _
Implements IFormatProvider.GetFormat
Console.WriteLine("Requesting an object of type {0}",
formatType.Name)
If formatType Is GetType(NumberFormatInfo) Then
Return NumberFormatInfo.CurrentInfo
Else If formatType Is GetType(DateTimeFormatInfo) Then
Return DateTimeFormatInfo.CurrentInfo
Else
Return Nothing
End If
End Function
End Class
Module Example
Public Sub Main()
Dim amount As Decimal = 1203.541d
Dim value As String = amount.ToString("C2", New CurrentCultureFormatProvider())
Console.WriteLine(value)
Console.WriteLine()
Dim composite As String = String.Format(New CurrentCultureFormatProvider,
"Date: {0} Amount: {1} Description: {2}",
Date.Now, 1264.03d, "Service Charge")
Console.WriteLine(composite)
Console.WriteLine()
End Sub
End Module
' The example displays output like the following:
' Requesting an object of type NumberFormatInfo
' $1,203.54
'
' Requesting an object of type ICustomFormatter
' Requesting an object of type DateTimeFormatInfo
' Requesting an object of type NumberFormatInfo
' Date: 11/15/2012 2:00:01 PM Amount: 1264.03 Description: Service Charge
IFormatProvider Если реализация не предоставляется явным образом в вызове метода числового форматирования, метод вызывает CultureInfo.CurrentCulture.GetFormat
метод, который возвращает NumberFormatInfo объект, соответствующий текущему языку и региональным параметрам.
Форматирование строк и свойств NumberFormatInfo
Каждая операция форматирования использует строку стандартного или настраиваемого числового формата для создания результирующих строк из числа. В некоторых случаях использование строки форматирования для получения результирующих строк является явным, как показано в следующем примере. Этот код вызывает Decimal.ToString(IFormatProvider) метод для преобразования Decimal значения в несколько различных строковых представлений с помощью соглашений о форматировании языка и региональных параметров en-US.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
string[] formatStrings = { "C2", "E1", "F", "G3", "N",
"#,##0.000", "0,000,000,000.0##" };
CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");
Decimal[] values = { 1345.6538m, 1921651.16m };
foreach (var value in values) {
foreach (var formatString in formatStrings) {
string resultString = value.ToString(formatString, culture);
Console.WriteLine("{0,-18} --> {1}", formatString, resultString);
}
Console.WriteLine();
}
}
}
// The example displays the following output:
// C2 --> $1,345.65
// E1 --> 1.3E+003
// F --> 1345.65
// G3 --> 1.35E+03
// N --> 1,345.65
// #,##0.000 --> 1,345.654
// 0,000,000,000.0## --> 0,000,001,345.654
//
// C2 --> $1,921,651.16
// E1 --> 1.9E+006
// F --> 1921651.16
// G3 --> 1.92E+06
// N --> 1,921,651.16
// #,##0.000 --> 1,921,651.160
// 0,000,000,000.0## --> 0,001,921,651.16
Imports System.Globalization
Module Example
Public Sub Main()
Dim formatStrings() As String = { "C2", "E1", "F", "G3", "N",
"#,##0.000", "0,000,000,000.0##" }
Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture("en-US")
Dim values() As Decimal = { 1345.6538d, 1921651.16d }
For Each value In values
For Each formatString In formatStrings
Dim resultString As String = value.ToString(formatString, culture)
Console.WriteLine("{0,-18} --> {1}", formatString, resultString)
Next
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' C2 --> $1,345.65
' E1 --> 1.3E+003
' F --> 1345.65
' G3 --> 1.35E+03
' N --> 1,345.65
' #,##0.000 --> 1,345.654
' 0,000,000,000.0## --> 0,000,001,345.654
'
' C2 --> $1,921,651.16
' E1 --> 1.9E+006
' F --> 1921651.16
' G3 --> 1.92E+06
' N --> 1,921,651.16
' #,##0.000 --> 1,921,651.160
' 0,000,000,000.0## --> 0,001,921,651.16
В других случаях использование строки формата неявно. Например, в следующем методе вызывается метод по умолчанию или без Decimal.ToString() параметров, значение Decimal экземпляра форматируется с помощью описателя общего формата ("G") и соглашений текущего языка и региональных параметров, которые в данном случае являются языком и региональными параметрами en-US.
using System;
public class Example
{
public static void Main()
{
Decimal[] values = { 1345.6538m, 1921651.16m };
foreach (var value in values) {
string resultString = value.ToString();
Console.WriteLine(resultString);
Console.WriteLine();
}
}
}
// The example displays the following output:
// 1345.6538
//
// 1921651.16
Module Example
Public Sub Main()
Dim values() As Decimal = { 1345.6538d, 1921651.16d }
For Each value In values
Dim resultString As String = value.ToString()
Console.WriteLine(resultString)
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' 1345.6538
'
' 1921651.16
Каждая строка стандартного числового формата использует одно или несколько NumberFormatInfo свойств для определения шаблона или символов, используемых в результируемой строке. Аналогичным образом, каждый описатель настраиваемого числового формата, кроме символов "0" и "#" вставки в результирующую строку, определяемую свойствами NumberFormatInfo . В следующей таблице перечислены описатели стандартного и настраиваемого числовых форматов и связанные с ними NumberFormatInfo свойства. Чтобы изменить внешний вид строки результата для определенного языка и региональных параметров, см. раздел свойств Modifying NumberFormatInfo . Дополнительные сведения об использовании этих описателей формата см. в разделе " Стандартные числовые строки" и "Строки настраиваемого числового формата".
Описатель формата | Связанные свойства |
---|---|
"C" или "c" (описатель формата валюты) | CurrencyDecimalDigits, чтобы определить число дробных цифр по умолчанию. CurrencyDecimalSeparator, для определения символа десятичного разделителя. CurrencyGroupSeparator, для определения разделителя групп или тысяч. CurrencyGroupSizes, чтобы определить размеры целочисленных групп. CurrencyNegativePattern, чтобы определить шаблон отрицательных значений валюты. CurrencyPositivePattern, чтобы определить шаблон положительных валютных значений. CurrencySymbol, для определения символа валюты. NegativeSign, для определения знака минус. |
"D" или "d" (описатель десятичного формата) | NegativeSign, для определения знака минус. |
"E" или "e" (описатель экспоненциального или научного формата) | NegativeSign, чтобы определить символ отрицательного знака в мантиссе и экспоненте. NumberDecimalSeparator, для определения символа десятичного разделителя. PositiveSign, чтобы определить символ положительного знака в экспоненте. |
"F" или "f" (описатель формата фиксированной точки) | NegativeSign, для определения знака минус. NumberDecimalDigits, чтобы определить число дробных цифр по умолчанию. NumberDecimalSeparator, для определения символа десятичного разделителя. |
"G" или "g" (описатель общего формата) | NegativeSign, для определения знака минус. NumberDecimalSeparator, для определения символа десятичного разделителя. PositiveSign, чтобы определить символ положительного знака для строк результатов в экспоненциальном формате. |
"N" или "n" (описатель числового формата) | NegativeSign, для определения знака минус. NumberDecimalDigits, чтобы определить число дробных цифр по умолчанию. NumberDecimalSeparator, для определения символа десятичного разделителя. NumberGroupSeparator, чтобы определить символ разделителя групп (тысяч). NumberGroupSizes, чтобы определить число целочисленных цифр в группе. NumberNegativePattern, чтобы определить формат отрицательных значений. |
"P" или "p" (описатель формата процента) | NegativeSign, для определения знака минус. PercentDecimalDigits, чтобы определить число дробных цифр по умолчанию. PercentDecimalSeparator, для определения символа десятичного разделителя. PercentGroupSeparator, чтобы определить символ разделителя групп. PercentGroupSizes, чтобы определить число целочисленных цифр в группе. PercentNegativePattern, чтобы определить размещение символа процента и отрицательного символа для отрицательных значений. PercentPositivePattern, чтобы определить размещение символа процента для положительных значений. PercentSymbol, для определения символа процента. |
"R" или "r" (описатель формата кругового пути) | NegativeSign, для определения знака минус. NumberDecimalSeparator, для определения символа десятичного разделителя. PositiveSign, чтобы определить символ положительного знака в экспоненте. |
"X" или "x" (описатель шестнадцатеричного формата) | Нет. |
"." (описатель настраиваемого формата десятичной запятой) | NumberDecimalSeparator, для определения символа десятичного разделителя. |
"," (описатель настраиваемого формата разделителя групп) | NumberGroupSeparator, чтобы определить символ разделителя группы (тысяч). |
"%" (описатель настраиваемого формата в процентах) | PercentSymbol, чтобы определить символ процента. |
""." (описатель настраиваемого формата в милле) | PerMilleSymbol, чтобы определить символ милли. |
"E" (описатель настраиваемого формата экспоненциальной нотации) | NegativeSign, чтобы определить символ отрицательного знака в мантиссе и экспоненте. PositiveSign, чтобы определить символ положительного знака в экспоненте. |
Обратите внимание, что NumberFormatInfo класс содержит NativeDigits свойство, указывающее базовые 10 цифр, используемых определенным языком и региональными параметрами. Однако свойство не используется в операциях форматирования; В результирующем строке используются только цифры "Базовый латиница" от 0 (U+0030) до 9 (U+0039). Кроме того, для Single и Double значений NaN``PositiveInfinity
, а NegativeInfinity
также результирующих строк состоит исключительно из символов, определенных атрибутами NaNSymbolNegativeInfinitySymbol и PositiveInfinitySymbolсвойствами соответственно.
Изменение свойств NumberFormatInfo
Вы можете изменить свойства NumberFormatInfo объекта, чтобы настроить результируемую строку, созданную в операции числового форматирования. Для этого выполните следующие действия.
Создайте копию NumberFormatInfo объекта, для которого требуется изменить соглашения о форматировании и записи. Дополнительные сведения см. в разделе создания экземпляра объекта NumberFormatInfo .
Измените свойство или свойства, которые используются для получения требуемой строки результата. Сведения о том, как методы форматирования используют NumberFormatInfo свойства для определения результирующих строк, см. в разделе "Строки формата" и свойств NumberFormatInfo .
Используйте пользовательский NumberFormatInfo объект в качестве аргумента IFormatProvider в вызовах методов форматирования.
Примечание
Вместо динамического изменения значений свойств языка и региональных параметров при каждом запуске приложения можно использовать CultureAndRegionInfoBuilder класс для определения пользовательского языка и региональных параметров (языка и региональных параметров, имеющих уникальное имя и дополняющего существующие язык и региональные параметры) или замещающего языка и региональных параметров (который используется вместо конкретного языка и региональных параметров).
В следующих разделах приведены некоторые примеры.
Изменение символа и шаблона валюты
В следующем примере изменяется NumberFormatInfo объект, представляющий соглашения о форматировании языка и региональных параметров en-US. Он назначает символ денежной единицы ISO-4217 свойству CurrencySymbol и определяет шаблон для значений валют, состоящий из символа валюты, за которым следует пробел и числовое значение.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
// Retrieve a writable NumberFormatInfo object.
CultureInfo enUS = CultureInfo.CreateSpecificCulture("en-US");
NumberFormatInfo nfi = enUS.NumberFormat;
// Use the ISO currency symbol instead of the native currency symbol.
nfi.CurrencySymbol = (new RegionInfo(enUS.Name)).ISOCurrencySymbol;
// Change the positive currency pattern to <code><space><value>.
nfi.CurrencyPositivePattern = 2;
// Change the negative currency pattern to <code><space><sign><value>.
nfi.CurrencyNegativePattern = 12;
// Produce the result strings by calling ToString.
Decimal[] values = { 1065.23m, 19.89m, -.03m, -175902.32m };
foreach (var value in values)
Console.WriteLine(value.ToString("C", enUS));
Console.WriteLine();
// Produce the result strings by calling a composite formatting method.
foreach (var value in values)
Console.WriteLine(String.Format(enUS, "{0:C}", value));
}
}
// The example displays the following output:
// USD 1,065.23
// USD 19.89
// USD -0.03
// USD -175,902.32
//
// USD 1,065.23
// USD 19.89
// USD -0.03
// USD -175,902.32
Imports System.Globalization
Module Example
Public Sub Main()
' Retrieve a writable NumberFormatInfo object.
Dim enUS As CultureInfo = CultureInfo.CreateSpecificCulture("en-US")
Dim nfi As NumberFormatInfo = enUS.NumberFormat
' Use the ISO currency symbol instead of the native currency symbol.
nfi.CurrencySymbol = (New RegionInfo(enUS.Name)).ISOCurrencySymbol
' Change the positive currency pattern to <code><space><value>.
nfi.CurrencyPositivePattern = 2
' Change the negative currency pattern to <code><space><sign><value>.
nfi.CurrencyNegativePattern = 12
' Produce the result strings by calling ToString.
Dim values() As Decimal = { 1065.23d, 19.89d, -.03d, -175902.32d }
For Each value In values
Console.WriteLine(value.ToString("C", enUS))
Next
Console.WriteLine()
' Produce the result strings by calling a composite formatting method.
For Each value In values
Console.WriteLine(String.Format(enUS, "{0:C}", value))
Next
End Sub
End Module
' The example displays the following output:
' USD 1,065.23
' USD 19.89
' USD -0.03
' USD -175,902.32
'
' USD 1,065.23
' USD 19.89
' USD -0.03
' USD -175,902.32
Форматирование национального идентификационного номера
Многие национальные идентификационные номера состоят исключительно из цифр, поэтому их можно легко отформатировать, изменив свойства NumberFormatInfo объекта. Например, номер социального страхования в США состоит из 9 цифр, расположенных следующим образом: XXX-XX-XXXX
В следующем примере предполагается, что номера социального страхования хранятся в виде целых значений и форматируют их соответствующим образом.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
// Instantiate a read-only NumberFormatInfo object.
CultureInfo enUS = CultureInfo.CreateSpecificCulture("en-US");
NumberFormatInfo nfi = enUS.NumberFormat;
// Modify the relevant properties.
nfi.NumberGroupSeparator = "-";
nfi.NumberGroupSizes = new int[] { 3, 2, 4};
nfi.NumberDecimalDigits = 0;
int[] ids = { 111223333, 999776666 };
// Produce the result string by calling ToString.
foreach (var id in ids)
Console.WriteLine(id.ToString("N", enUS));
Console.WriteLine();
// Produce the result string using composite formatting.
foreach (var id in ids)
Console.WriteLine(String.Format(enUS, "{0:N}", id));
}
}
// The example displays the following output:
// 1112-23-333
// 9997-76-666
//
// 1112-23-333
// 9997-76-666
Imports System.Globalization
Module Example
Public Sub Main()
' Instantiate a read-only NumberFormatInfo object.
Dim enUS As CultureInfo = CultureInfo.CreateSpecificCulture("en-US")
Dim nfi As NumberFormatInfo = enUS.NumberFormat
' Modify the relevant properties.
nfi.NumberGroupSeparator = "-"
nfi.NumberGroupSizes = { 3, 2, 4}
nfi.NumberDecimalDigits = 0
Dim ids() As Integer = { 111223333, 999776666 }
' Produce the result string by calling ToString.
For Each id In ids
Console.WriteLine(id.ToString("N", enUS))
Next
Console.WriteLine()
' Produce the result string using composite formatting.
For Each id In ids
Console.WriteLine(String.Format(enUS, "{0:N}", id))
Next
End Sub
End Module
' The example displays the following output:
' 1112-23-333
' 9997-76-666
'
' 1112-23-333
' 9997-76-666
Анализ числовых строк
Синтаксический анализ включает преобразование строкового представления числа в число. Каждый числовой тип в платформа .NET Framework включает два перегруженных метода синтаксического анализа: Parse
и TryParse
. Метод Parse
преобразует строку в число и выдает исключение, если преобразование завершается ошибкой. Метод TryParse
преобразует строку в число, присваивает число аргументу out
и возвращает Boolean значение, указывающее, успешно ли выполнено преобразование.
Методы синтаксического анализа неявно или явно используют NumberStyles значение перечисления, чтобы определить, какие элементы стиля (например, разделители групп, десятичный разделитель или символ валюты) могут присутствовать в строке, если операция синтаксического анализа выполнена успешно. NumberStyles Если значение не указано в вызове метода, по умолчанию используется NumberStyles значение, включающее Float и AllowThousands флаги, которое указывает, что проанализированная строка может включать символы групп, десятичный разделитель, отрицательный знак и символы пробела, а также строковое представление числа в экспоненциальной нотации.
Методы синтаксического анализа также неявно или явно используют NumberFormatInfo объект, который определяет определенные символы и шаблоны, которые могут возникнуть в строке для анализа. NumberFormatInfo Если объект не указан, по умолчанию используется NumberFormatInfo текущий язык и региональные параметры. Дополнительные сведения о синтаксическом анализе см. в отдельных методах синтаксического анализа, таких как Int16.Parse(String), , , Decimal.Parse(String, NumberStyles, IFormatProvider)Int64.Parse(String, IFormatProvider)и Double.TryParse(String, Double)BigInteger.TryParse(String, NumberStyles, IFormatProvider, BigInteger). Int32.Parse(String, NumberStyles)
В следующем примере показана характер синтаксического анализа строк с учетом языка и региональных параметров. Он пытается проанализировать строку, включающую разделители тысяч, с помощью соглашений en-US, fr-FR и инвариантных языков и региональных параметров. Строка, содержащая запятую в качестве разделителя групп и точки в качестве десятичного разделителя, не может анализироваться в языке и региональных параметрах fr-FR, а строка с пробелом в качестве разделителя групп и запятой в качестве десятичного разделителя не может анализироваться в языках и региональных параметрах en-US и инвариантных языках.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
String[] values = { "1,034,562.91", "9 532 978,07" };
String[] cultureNames = { "en-US", "fr-FR", "" };
foreach (var value in values) {
foreach (var cultureName in cultureNames) {
CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureName);
String name = culture.Name == "" ? "Invariant" : culture.Name;
try {
Decimal amount = Decimal.Parse(value, culture);
Console.WriteLine("'{0}' --> {1} ({2})", value, amount, name);
}
catch (FormatException) {
Console.WriteLine("'{0}': FormatException ({1})",
value, name);
}
}
Console.WriteLine();
}
}
}
// The example displays the following output:
// '1,034,562.91' --> 1034562.91 (en-US)
// '1,034,562.91': FormatException (fr-FR)
// '1,034,562.91' --> 1034562.91 (Invariant)
//
// '9 532 978,07': FormatException (en-US)
// '9 532 978,07' --> 9532978.07 (fr-FR)
// '9 532 978,07': FormatException (Invariant)
Imports System.Globalization
Module Example
Public Sub Main()
Dim values() As String = { "1,034,562.91", "9 532 978,07" }
Dim cultureNames() As String = { "en-US", "fr-FR", "" }
For Each value In values
For Each cultureName In cultureNames
Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureName)
Dim name As String = If(culture.Name = "", "Invariant", culture.Name)
Try
Dim amount As Decimal = Decimal.Parse(value, culture)
Console.WriteLine("'{0}' --> {1} ({2})", value, amount, name)
Catch e As FormatException
Console.WriteLine("'{0}': FormatException ({1})",
value, name)
End Try
Next
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' '1,034,562.91' --> 1034562.91 (en-US)
' '1,034,562.91': FormatException (fr-FR)
' '1,034,562.91' --> 1034562.91 (Invariant)
'
' '9 532 978,07': FormatException (en-US)
' '9 532 978,07' --> 9532978.07 (fr-FR)
' '9 532 978,07': FormatException (Invariant)
Синтаксический анализ обычно выполняется в двух контекстах:
Как операция, предназначенная для преобразования введенных пользователем данных в числовое значение.
Как операция, предназначенная для кругового пути числового значения; то есть для десериализации числового значения, ранее сериализованного в виде строки.
В следующих разделах более подробно рассматриваются эти две операции.
Синтаксический анализ строк пользователя
При синтаксическом анализе числовых строк, введенных пользователем, всегда следует создать экземпляр NumberFormatInfo объекта, который отражает региональные параметры пользователя. Сведения о создании экземпляра NumberFormatInfo объекта, который отражает пользовательские настройки, см. в разделе NumberFormatInfo и динамических данных .
В следующем примере показано различие между операцией синтаксического анализа, которая отражает региональные параметры пользователя и ту, которая не используется. В этом случае системный язык и региональные параметры по умолчанию — en-US, но пользователь определил "", как десятичный символ и "." в качестве разделителя групп в панель управления, регионе и языке. Обычно эти символы отменяются в языке и региональных параметрах en-US по умолчанию. Когда пользователь вводит строку, которая отражает параметры пользователя, и строка анализируется объектом, который также отражает пользовательские параметры (переопределения), операция синтаксического NumberFormatInfo анализа возвращает правильный результат. Однако если строка анализируется NumberFormatInfo объектом, который отражает стандартные региональные параметры en-US, он ошибает символ запятой для разделителя групп и возвращает неправильный результат.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
CultureInfo stdCulture = CultureInfo.GetCultureInfo("en-US");
CultureInfo custCulture = CultureInfo.CreateSpecificCulture("en-US");
String value = "310,16";
try {
Console.WriteLine("{0} culture reflects user overrides: {1}",
stdCulture.Name, stdCulture.UseUserOverride);
Decimal amount = Decimal.Parse(value, stdCulture);
Console.WriteLine("'{0}' --> {1}", value, amount.ToString(CultureInfo.InvariantCulture));
}
catch (FormatException) {
Console.WriteLine("Unable to parse '{0}'", value);
}
Console.WriteLine();
try {
Console.WriteLine("{0} culture reflects user overrides: {1}",
custCulture.Name, custCulture.UseUserOverride);
Decimal amount = Decimal.Parse(value, custCulture);
Console.WriteLine("'{0}' --> {1}", value, amount.ToString(CultureInfo.InvariantCulture));
}
catch (FormatException) {
Console.WriteLine("Unable to parse '{0}'", value);
}
}
}
// The example displays the following output:
// en-US culture reflects user overrides: False
// '310,16' --> 31016
//
// en-US culture reflects user overrides: True
// '310,16' --> 310.16
Imports System.Globalization
Module Example
Public Sub Main()
Dim stdCulture As CultureInfo = CultureInfo.GetCultureInfo("en-US")
Dim custCulture As CultureInfo = CultureInfo.CreateSpecificCulture("en-US")
Dim value As String = "310,16"
Try
Console.WriteLine("{0} culture reflects user overrides: {1}",
stdCulture.Name, stdCulture.UseUserOverride)
Dim amount As Decimal = Decimal.Parse(value, stdCulture)
Console.WriteLine("'{0}' --> {1}", value, amount.ToString(CultureInfo.InvariantCulture))
Catch e As FormatException
Console.WriteLine("Unable to parse '{0}'", value)
End Try
Console.WriteLine()
Try
Console.WriteLine("{0} culture reflects user overrides: {1}",
custCulture.Name, custCulture.UseUserOverride)
Dim amount As Decimal = Decimal.Parse(value, custCulture)
Console.WriteLine("'{0}' --> {1}", value, amount.ToString(CultureInfo.InvariantCulture))
Catch e As FormatException
Console.WriteLine("Unable to parse '{0}'", value)
End Try
End Sub
End Module
' The example displays the following output:
' en-US culture reflects user overrides: False
' '310,16' --> 31016
'
' en-US culture reflects user overrides: True
' '310,16' --> 310.16
Сериализация и десериализация числовых данных
Если числовые данные сериализуются в строковом формате, а затем десериализируются и анализируются, строки должны создаваться и анализироваться с помощью соглашений инвариантного языка и региональных параметров. Операции форматирования и синтаксического анализа никогда не должны отражать соглашения определенного языка и региональных параметров. Если используются параметры, зависящие от языка и региональных параметров, переносимость данных строго ограничена; его можно успешно десериализировать только в потоке, параметры которого зависят от параметров языка и региональных параметров, идентичных параметрам потока, в котором он был сериализован. В некоторых случаях это означает, что данные невозможно даже десериализировать в той же системе, в которой она была сериализована.
В следующем примере показано, что может произойти при нарушении этого принципа. Значения с плавающей запятой в массиве преобразуются в строки, когда текущий поток использует параметры языка и региональных параметров языка и региональных параметров en-US. Затем данные анализируются потоком, использующими параметры языка и региональных параметров языка и региональных параметров языка и региональных параметров pt-BR. В этом случае, хотя каждая операция синтаксического анализа завершается успешно, данные не будут успешно завершены и происходит повреждение данных. В других случаях операция синтаксического анализа может завершиться ошибкой, и FormatException может возникнуть исключение.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Threading;
public class Example
{
public static void Main()
{
CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
PersistData();
CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("pt-BR");
RestoreData();
}
private static void PersistData()
{
// Define an array of floating-point values.
Double[] values = { 160325.972, 8631.16, 1.304e5, 98017554.385,
8.5938287084321676e94 };
Console.WriteLine("Original values: ");
foreach (var value in values)
Console.WriteLine(value.ToString("R", CultureInfo.InvariantCulture));
// Serialize an array of doubles to a file
StreamWriter sw = new StreamWriter(@".\NumericData.bin");
for (int ctr = 0; ctr < values.Length; ctr++) {
sw.Write(values[ctr].ToString("R"));
if (ctr < values.Length - 1) sw.Write("|");
}
sw.Close();
Console.WriteLine();
}
private static void RestoreData()
{
// Deserialize the data
StreamReader sr = new StreamReader(@".\NumericData.bin");
String data = sr.ReadToEnd();
sr.Close();
String[] stringValues = data.Split('|');
List<Double> newValueList = new List<Double>();
foreach (var stringValue in stringValues) {
try {
newValueList.Add(Double.Parse(stringValue));
}
catch (FormatException) {
newValueList.Add(Double.NaN);
}
}
Console.WriteLine("Restored values:");
foreach (var newValue in newValueList)
Console.WriteLine(newValue.ToString("R", NumberFormatInfo.InvariantInfo));
}
}
// The example displays the following output:
// Original values:
// 160325.972
// 8631.16
// 130400
// 98017554.385
// 8.5938287084321671E+94
//
// Restored values:
// 160325972
// 863116
// 130400
// 98017554385
// 8.5938287084321666E+110
Imports System.Collections.Generic
Imports System.Globalization
Imports System.IO
Imports System.Threading
Module Example
Public Sub Main()
CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US")
PersistData()
CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("pt-BR")
RestoreData()
End Sub
Private Sub PersistData()
' Define an array of floating-point values.
Dim values() As Double = { 160325.972, 8631.16, 1.304e5, 98017554.385,
8.5938287084321676e94 }
Console.WriteLine("Original values: ")
For Each value In values
Console.WriteLine(value.ToString("R", CultureInfo.InvariantCulture))
Next
' Serialize an array of doubles to a file
Dim sw As New StreamWriter(".\NumericData.bin")
For ctr As Integer = 0 To values.Length - 1
sw.Write(values(ctr).ToString("R"))
If ctr < values.Length - 1 Then sw.Write("|")
Next
sw.Close()
Console.WriteLine()
End Sub
Private Sub RestoreData()
' Deserialize the data
Dim sr AS New StreamReader(".\NumericData.bin")
Dim data As String = sr.ReadToEnd()
sr.Close()
Dim stringValues() As String = data.Split("|"c)
Dim newValueList As New List(Of Double)
For Each stringValue In stringValues
Try
newValueList.Add(Double.Parse(stringValue))
Catch e As FormatException
newValueList.Add(Double.NaN)
End Try
Next
Console.WriteLine("Restored values:")
For Each newValue In newValueList
Console.WriteLine(newValue.ToString("R", NumberFormatInfo.InvariantInfo))
Next
End Sub
End Module
' The example displays the following output:
' Original values:
' 160325.972
' 8631.16
' 130400
' 98017554.385
' 8.5938287084321671E+94
'
' Restored values:
' 160325972
' 863116
' 130400
' 98017554385
' 8.5938287084321666E+110
Конструкторы
NumberFormatInfo() |
Инициализирует новый доступный для записи экземпляр класса NumberFormatInfo, не зависящий от языка и региональных параметров (инвариантный). |
Свойства
CurrencyDecimalDigits |
Получает или задает число десятичных разрядов, используемое в значениях денежных сумм. |
CurrencyDecimalSeparator |
Возвращает или задает строку, используемую в качестве десятичного разделителя в значениях денежных сумм. |
CurrencyGroupSeparator |
Возвращает или задает строку, разделяющую разряды в целой части десятичной дроби в значениях денежных сумм. |
CurrencyGroupSizes |
Возвращает или задает число цифр в каждой из групп целой части десятичной дроби в значениях денежных сумм. |
CurrencyNegativePattern |
Возвращает или задает шаблон формата для отрицательных значений денежных сумм. |
CurrencyPositivePattern |
Возвращает или задает шаблон формата для положительных значений денежных сумм. |
CurrencySymbol |
Возвращает или задает строку, используемую в качестве знака денежной единицы. |
CurrentInfo |
Возвращает доступный только для чтения объект NumberFormatInfo, форматирующий значения на основе текущего языка и региональных параметров. |
DigitSubstitution |
Получает или задает значение, определяющее, каким образом а графическом интерфейсе пользователя должны отображаться фигуры цифр. |
InvariantInfo |
Возвращает объект NumberFormatInfo, доступный только для чтения, который не зависит от языка и региональных параметров (инвариантный). |
IsReadOnly |
Возвращает значение, указывающее, является ли данный объект NumberFormatInfo доступным только для чтения. |
NaNSymbol |
Возвращает или задает строку, представляющую значение IEEE NaN (не числовое). |
NativeDigits |
Возвращает или задает массив строк собственных цифр, эквивалентных арабским цифрам от 0 до 9. |
NegativeInfinitySymbol |
Возвращает или задает строку, представляющую минус бесконечность. |
NegativeSign |
Возвращает или задает строку, указывающую, что соответствующее число является отрицательным. |
NumberDecimalDigits |
Возвращает или задает число десятичных разрядов, используемое в числовых значениях. |
NumberDecimalSeparator |
Возвращает или задает строку, используемую в качестве десятичного разделителя в числовых значениях. |
NumberGroupSeparator |
Возвращает или задает строку, разделяющую разряды в целой части десятичной дроби в числовых значениях. |
NumberGroupSizes |
Возвращает или задает число цифр в каждой из групп целой части десятичной дроби в числовых значениях. |
NumberNegativePattern |
Возвращает или задает шаблон формата для отрицательных числовых значений. |
PercentDecimalDigits |
Возвращает или задает количество десятичных разрядов, используемое в значениях процентов. |
PercentDecimalSeparator |
Возвращает или задает строку, используемую в качестве десятичного разделителя в значениях процентов. |
PercentGroupSeparator |
Возвращает или задает строку, разделяющую разряды в целой части десятичной дроби в значениях процентов. |
PercentGroupSizes |
Возвращает или задает количество цифр в каждой из групп разрядов целой части десятичной дроби в значениях процентов. |
PercentNegativePattern |
Возвращает или задает шаблон формата для отрицательных значений процентов. |
PercentPositivePattern |
Возвращает или задает шаблон формата для положительных значений процентов. |
PercentSymbol |
Возвращает или задает строку, используемую в качестве знака процентов. |
PerMilleSymbol |
Возвращает или задает строку, используемую в качестве знака промилле. |
PositiveInfinitySymbol |
Возвращает или задает строку, представляющую плюс бесконечность. |
PositiveSign |
Возвращает или задает строку, указывающую, что соответствующее число является положительным. |
Методы
Clone() |
Создает неполную копию объекта NumberFormatInfo. |
Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
GetFormat(Type) |
Возвращает объект указанного типа, предоставляющий службу форматирования чисел. |
GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
GetInstance(IFormatProvider) |
Возвращает класс NumberFormatInfo, связанный с заданным IFormatProvider. |
GetType() |
Возвращает объект Type для текущего экземпляра. (Унаследовано от Object) |
MemberwiseClone() |
Создает неполную копию текущего объекта Object. (Унаследовано от Object) |
ReadOnly(NumberFormatInfo) |
Возвращает программу-оболочку NumberFormatInfo, доступную только для чтения. |
ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |