NumberFormatInfo Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Poskytuje informace specifické pro jazykovou verzi pro formátování a parsování číselných hodnot.
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
- Dědičnost
-
NumberFormatInfo
- Atributy
- Implementuje
Příklady
Následující příklad ukazuje, jak načíst NumberFormatInfo objekt pro odpovídající CultureInfo objekt a použít načtený objekt k dotazování na informace o formátování čísel pro konkrétní jazykovou verzi.
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 '$'
Poznámky
Třída NumberFormatInfo obsahuje informace specifické pro jazykovou verzi, které se používají při formátování a analýze číselných hodnot. Tyto informace zahrnují symbol měny, symbol desetinného čísla, symbol oddělovače skupin a symboly pro kladná a záporná znaménka.
Vytvoření instance objektu NumberFormatInfo
Můžete vytvořit instanci objektu, který představuje konvence formátování aktuální jazykové verze, neutrální jazykové verze, konkrétní jazykové verze NumberFormatInfo nebo neutrální jazykové verze.
Vytvoření instance objektu NumberFormatInfo pro aktuální jazykovou verzi
Instanci objektu pro aktuální jazykovou verzi můžete vytvořit NumberFormatInfo libovolným z následujících způsobů. V každém případě je NumberFormatInfo vrácený objekt jen pro čtení.
Načtením objektu, který představuje aktuální jazykovou verzi z vlastnosti , a načtením CultureInfo CultureInfo.CurrentCulture objektu z jeho CultureInfo CultureInfo.NumberFormat vlastnosti.
Načtením objektu NumberFormatInfo vráceného
static
vlastností (Shared
Visual Basic) CurrentInfoVoláním GetInstance metody s CultureInfo objektem, který představuje aktuální jazykovou verzi.
Následující příklad používá tyto tři způsoby k vytvoření NumberFormatInfo objektů, které představují konvence formátování aktuální jazykové verze. Načte také hodnotu vlastnosti pro IsReadOnly ilustraci, že každý objekt je jen pro čtení.
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
Zapisovatelný objekt, který představuje konvence aktuální jazykové verze, můžete vytvořit NumberFormatInfo následujícími způsoby:
Načtením objektu libovolným ze způsobů znázorněných v předchozím příkladu kódu a voláním NumberFormatInfo Clone metody pro vrácený NumberFormatInfo objekt. Tím se vytvoří kopie původního objektu NumberFormatInfo s tím rozdílem, že jeho IsReadOnly vlastnost je
false
.Voláním metody vytvořte objekt, který představuje aktuální jazykovou verzi, a potom pomocí její CultureInfo.CreateSpecificCulture CultureInfo vlastnosti CultureInfo.NumberFormat načtěte NumberFormatInfo objekt .
Následující příklad znázorňuje tyto dva způsoby vytvoření instance objektu a zobrazuje hodnotu jeho vlastnosti, aby bylo znázorněno, že objekt není NumberFormatInfo IsReadOnly jen pro čtení.
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
Všimněte si, Windows operační systém umožňuje uživateli přepsat některé hodnoty vlastností použité v operacích číselného formátování a analýzy prostřednictvím položky Region a Language v NumberFormatInfo Ovládací panely. Například uživatel, jehož jazyková verze je angličtina (USA), může místo výchozí hodnoty 1,1 USD zobrazit hodnoty měny jako 1,1 USD. Objekty NumberFormatInfo načtené dříve probíraly tato přepsání uživatele. Pokud je to nežádoucí, můžete vytvořit objekt, který neodráží přepsání uživatele (a který je také určen pro čtení a zápis, nikoli jen pro čtení) voláním konstruktoru a poskytnutím hodnoty pro NumberFormatInfo CultureInfo.CultureInfo(String, Boolean) argument false
useUserOverride
. Následující příklad obsahuje obrázek pro systém, jehož aktuální jazyková verze je angličtina (USA) a jejíž symbol měny byl změněn z výchozí hodnoty $ na 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: $
Pokud je vlastnost nastavená na , vlastnosti , a se CultureInfo.UseUserOverride true
také CultureInfo.DateTimeFormat CultureInfo.NumberFormat CultureInfo.TextInfo načítá z uživatelského nastavení. Pokud jsou uživatelská nastavení nekompatibilní s jazykovou verzí přidruženou k objektu (například pokud vybraný kalendář není jedním z kalendářů uvedených vlastností), výsledky metod a hodnoty vlastností CultureInfo OptionalCalendars nejsou definovány.
Vytvoření instance objektu NumberFormatInfo pro invariantní jazykovou verzi
Invariantní jazyková verze představuje jazykovou verzi, která není závislá na jazykové verzi. Je založená na anglickém jazyce, ale ne na konkrétní anglicky mluvící zemi nebo oblasti. I když data konkrétních kultur mohou být dynamická a mohou se změnit tak, aby odrážela nové kulturní konvence nebo předvolby uživatelů, data invariantní kultury se nemění. Objekt, NumberFormatInfo který představuje konvence formátování invariantní jazykové verze, lze použít pro operace formátování, ve kterých by se výsledné řetězce neměly lišit podle jazykové verze.
Instanci objektu, který představuje konvence formátování invariantní jazykové verze, můžete vytvořit NumberFormatInfo následujícími způsoby:
Načtením hodnoty vlastnosti InvariantInfo . Vrácený NumberFormatInfo objekt je jen pro čtení.
Načtením hodnoty vlastnosti CultureInfo.NumberFormat z objektu CultureInfo vráceného CultureInfo.InvariantCulture vlastností . Vrácený NumberFormatInfo objekt je jen pro čtení.
Voláním konstruktoru NumberFormatInfo třídy bez parametrů. Vrácený NumberFormatInfo objekt je pro čtení a zápis.
Následující příklad používá každou z těchto metod k vytvoření instance NumberFormatInfo objektu, který představuje invariantní jazykovou verzi. Pak určuje, jestli je objekt jen pro čtení.
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
Vytvoření instance objektu NumberFormatInfo pro konkrétní jazykovou verzi
Konkrétní jazyková verze představuje jazyk, který je vyslovený v konkrétní zemi nebo oblasti. Například en-US je konkrétní jazyková verze, která představuje anglický jazyk mluvený v USA, a en-CA je konkrétní jazyková verze, která představuje anglický jazyk vyslovený v Kanadě. Instanci objektu, který představuje konvence formátování konkrétní jazykové verze, můžete vytvořit NumberFormatInfo následujícími způsoby:
Voláním CultureInfo.GetCultureInfo(String) metody a načtením hodnoty vlastnosti CultureInfo vráceného NumberFormat objektu. Vrácený NumberFormatInfo objekt je jen pro čtení.
Předáním CultureInfo objektu, který představuje jazykovou verzi, jejíž objekt NumberFormatInfo chcete načíst do statické GetInstance metody. Vrácený NumberFormatInfo objekt je pro čtení a zápis.
Voláním CultureInfo.CreateSpecificCulture metody a načtením hodnoty vlastnosti CultureInfo vráceného NumberFormat objektu. Vrácený NumberFormatInfo objekt je pro čtení a zápis.
Voláním jednoho CultureInfo.CultureInfo z konstruktorů třídy a načtením hodnoty vlastnosti CultureInfo vráceného NumberFormat objektu. Vrácený NumberFormatInfo objekt je pro čtení a zápis.
Následující příklad používá tyto čtyři způsoby k vytvoření objektu, který odráží konvence formátování indonéštiny NumberFormatInfo (Indonéština). Také určuje, jestli je každý objekt jen pro čtení.
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
Vytvoření instance objektu NumberFormatInfo pro neutrální jazykovou verzi.
Neutrální jazyková verze představuje jazyk nebo jazyk, který je nezávislý na zemi nebo oblasti. Obvykle je nadřazeným objektem jedné nebo více konkrétních jazykových verzí. Například fr je neutrální jazyková verze pro francouzštinu a nadřazená jazyková verze fr-FR. Vytvoříte objekt, který představuje konvence formátování neutrální jazykové verze stejným způsobem jako objekt, který představuje konvence formátování konkrétní NumberFormatInfo NumberFormatInfo jazykové verze.
Poznámka
Ve verzi .NET Framework 3.5 a starších verzích vyvolá pokus o načtení objektu, který odráží konvence formátování neutrální jazykové NumberFormatInfo NotSupportedException verze, výjimku.
Vzhledem k tomu, že je nezávislá na konkrétní zemi nebo oblasti, neutrální jazyková verze nemá informace o formátování specifické pro jazykovou verzi. Místo naplnění objektu obecnými hodnotami vrací .NET Framework objekt, který odráží konvence formátování konkrétní jazykové verze, která je podřízeným objektem NumberFormatInfo NumberFormatInfo neutrální jazykové verze. Například objekt pro neutrální jazykovou verzi en odráží konvence formátování jazykové verze en-US a objekt pro jazykovou verzi fr odráží konvence formátování jazykové verze NumberFormatInfo NumberFormatInfo fr-FR.
Pomocí kódu, jako je následující, můžete určit, které konkrétní konvence formátování jazykové verze každá neutrální jazyková verze představuje.
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 a dynamická data
Data specifická pro jazykovou verzi pro formátování číselných hodnot poskytovaných třídou jsou dynamická, stejně jako kulturní NumberFormatInfo data poskytovaná CultureInfo třídou . Neměli byste provádět žádné předpoklady o stabilitě hodnot pro NumberFormatInfo objekty, které jsou přidruženy ke konkrétním CultureInfo objektům. Stabilní jsou pouze data poskytnutá invariantní jazykovou verzí a NumberFormatInfo přidruženým objektem. Jiná data se mohou mezi relacemi aplikace nebo dokonce v rámci jedné relace měnit z následujících důvodů:
Aktualizace systému. Kulturní předvolby, jako je symbol měny nebo formáty měny, se v průběhu času mění. Když k tomu dojde, Windows Update zahrnuje změny NumberFormatInfo hodnoty vlastnosti pro konkrétní jazykovou verzi.
Nahrazování jazykových verzí. Třídu CultureAndRegionInfoBuilder lze použít k nahrazení dat existující jazykové verze.
Kaskádové změny hodnot vlastností Za běhu se může změnit řada vlastností souvisejících s jazykovou verzí, což zase způsobí změnu NumberFormatInfo dat. Aktuální jazykovou verzi lze například změnit programově nebo prostřednictvím akce uživatele. V takovém případě se NumberFormatInfo objekt vrácený CurrentInfo vlastností změní na objekt přidružený k aktuální jazykové verzi.
Předvolby uživatelů. Uživatelé vaší aplikace mohou přepsat některé hodnoty přidružené k aktuální jazykové verzi systému prostřednictvím oblasti a jazykových možností v Ovládací panely. Uživatelé mohou například zvolit jiný symbol měny nebo jiný oddělovač desetinných míst. Pokud je vlastnost nastavená na (výchozí hodnota), vlastnosti objektu se také načítá CultureInfo.UseUserOverride
true
z NumberFormatInfo uživatelského nastavení.
Počínaje .NET Framework 2.0 jsou při vytvoření objektu inicializovány všechny uživatelem NumberFormatInfo přepisovatelné vlastnosti objektu. Stále existuje možnost nekonzistence, protože vytvoření objektu ani proces přepsání uživatelem nejsou atomické a příslušné hodnoty se při vytváření objektu mohou změnit. Tyto nekonziference by však měly být extrémně vzácné.
Můžete řídit, jestli se přepsání uživatele projeví v objektech, které představují stejnou jazykovou NumberFormatInfo verzi jako aktuální jazyková verze. Následující tabulka uvádí způsoby, jakými lze objekt načíst, a určuje, zda výsledný objekt odráží NumberFormatInfo přepsání uživatele.
Zdroj objektu CultureInfo a NumberFormatInfo | Odráží přepsání uživatelů. |
---|---|
CultureInfo.CurrentCulture.NumberFormat majetek |
Yes |
NumberFormatInfo.CurrentInfo majetek | Yes |
Metoda CultureInfo.CreateSpecificCulture | Yes |
Metoda CultureInfo.GetCultureInfo | No |
CultureInfo(String) BeginRequestEventArgs | Yes |
CultureInfo.CultureInfo(String, Boolean) BeginRequestEventArgs | Závisí na hodnotě useUserOverride parametru |
Pokud neexistují přesvědčivé důvody v jiném smyslu, měli byste respektovat přepsání uživatelů při použití NumberFormatInfo objektu v klientských aplikacích k formátování a analýze vstupu uživatele nebo k zobrazení číselných dat. Pro serverové aplikace nebo bezobslužné aplikace byste neměli respektovat přepsání uživatelů. Nicméně pokud používáte NumberFormatInfo objekt explicitně nebo implicitně k zachování číselných dat ve formě řetězce, měli byste buď použít NumberFormatInfo objekt, který odráží konvence formátování invariantní jazykové verze, nebo byste měli zadat vlastní řetězec číselného formátu, který použijete bez ohledu na jazykovou verzi.
IFormatProvider, NumberFormatInfo a formátování čísel
NumberFormatInfoObjekt se implicitně nebo explicitně používá v rámci všech operací s číselným formátováním. Mezi ně patří volání následujících metod:
Všechny metody číselného formátování, jako jsou Int32.ToString , Double.ToString a Convert.ToString(Int32) .
Hlavní metoda složeného formátování, String.Format .
Další metody složeného formátování, jako jsou Console.WriteLine(String, Object[]) a StringBuilder.AppendFormat(String, Object[]) .
Všechny operace číselného formátování využívají IFormatProvider implementaci. IFormatProviderRozhraní obsahuje jedinou metodu, GetFormat(Type) . Toto je metoda zpětného volání, která je předána Type objektu, který představuje typ potřebný k zadání informací o formátování. Metoda zodpovídá za vrácení buď instance daného typu null
, nebo, pokud nemůže poskytnout instanci typu. .NET Framework poskytuje dvě IFormatProvider implementace pro formátování čísel:
CultureInfoTřída, která představuje konkrétní jazykovou verzi (nebo konkrétní jazyk v konkrétní zemi nebo oblasti). V operaci číselného formátování CultureInfo.GetFormat vrátí metoda NumberFormatInfo objekt přidružený k jeho CultureInfo.NumberFormat Vlastnosti.
NumberFormatInfoTřída, která poskytuje informace o konvencích formátování příslušné jazykové verze. NumberFormatInfo.GetFormatMetoda vrátí instanci sebe sama.
Pokud není IFormatProvider implementována metoda formátování explicitně, CultureInfo CultureInfo.CurrentCulture je použit objekt vrácený vlastností, která představuje aktuální jazykovou verzi.
Následující příklad znázorňuje vztah mezi IFormatProvider rozhraním a NumberFormatInfo třídou v rámci formátování operací definováním vlastní IFormatProvider implementace. Jeho GetFormat Metoda zobrazí název typu objektu požadovaného operací formátování. Pokud rozhraní požaduje NumberFormatInfo objekt, tato metoda poskytuje NumberFormatInfo objekt pro aktuální jazykovou verzi. Jak ukazuje výstup z příkladu, Decimal.ToString(IFormatProvider) metoda požaduje NumberFormatInfo objekt, který poskytuje informace o formátování, zatímco String.Format(IFormatProvider, String, Object[]) požadavky metody NumberFormatInfo a DateTimeFormatInfo objekty a také ICustomFormatter implementaci.
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
Pokud IFormatProvider není implementace explicitně k dispozici ve volání metody číselného formátování, metoda volá CultureInfo.CurrentCulture.GetFormat
metodu, která vrátí NumberFormatInfo objekt, který odpovídá aktuální jazykové verzi.
Formátování řetězců a vlastností NumberFormatInfo
Každá operace formátování používá buď standardní, nebo vlastní řetězec číselného formátu k vytvoření výsledného řetězce z čísla. V některých případech použití formátovacího řetězce k vytvoření výsledného řetězce je explicitní, jako v následujícím příkladu. Tento kód volá Decimal.ToString(IFormatProvider) metodu pro převod Decimal hodnoty na několik různých řetězcových reprezentací pomocí formátovacích úmluv jazykové verze 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
V jiných případech je použití formátovacího řetězce implicitní. Například v následující metodě volá metodu výchozí nebo bez parametrů Decimal.ToString() , hodnota Decimal instance je formátována pomocí specifikátoru obecného formátu ("G") a konvence aktuální jazykové verze, která je v tomto případě jazyková verze 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
Každý standardní číselný formátovací řetězec používá jednu nebo více NumberFormatInfo vlastností k určení vzoru nebo symbolů použitých ve výsledném řetězci. Podobně každý vlastní číselný specifikátor formátu s výjimkou "0" a "#" vloží symboly ve výsledném řetězci, které jsou definovány NumberFormatInfo vlastnostmi. V následující tabulce jsou uvedeny specifikátory standardního a vlastního číselného formátu a jejich přidružené NumberFormatInfo Vlastnosti. Chcete-li změnit vzhled výsledného řetězce pro konkrétní jazykovou verzi, přečtěte si část Úprava vlastností NumberFormatInfo . Podrobnosti o použití těchto specifikátorů formátu naleznete v tématu Standardní číselné formátovací řetězce a vlastní číselné formátovací řetězce.
Specifikátor formátu | Přidružené vlastnosti |
---|---|
"C" nebo "c" (specifikátor formátu měny) | CurrencyDecimalDigits, chcete-li definovat výchozí počet zlomkových číslic. CurrencyDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst. CurrencyGroupSeparatorpro definování oddělovače skupin nebo tisíců. CurrencyGroupSizespro definování velikosti integrálních skupin. CurrencyNegativePatternpro definování vzoru záporných hodnot měny. CurrencyPositivePatternpro definování vzoru hodnot kladné měny. CurrencySymbol, chcete-li definovat symbol měny. NegativeSign, chcete-li definovat symbol záporného znaménka. |
"D" nebo "d" (specifikátor desítkového formátu) | NegativeSign, chcete-li definovat symbol záporného znaménka. |
"E" nebo "e" (specifikátor exponenciálního nebo vědeckého formátu) | NegativeSign, chcete-li definovat symbol záporného znaménka v mantise a exponentu. NumberDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst. PositiveSign, chcete-li v exponentu definovat symbol kladného znaménka. |
"F" nebo "f" (specifikátor formátu s pevnou desetinnou čárkou) | NegativeSign, chcete-li definovat symbol záporného znaménka. NumberDecimalDigits, chcete-li definovat výchozí počet zlomkových číslic. NumberDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst. |
"G" nebo "g" (obecný specifikátor formátu) | NegativeSign, chcete-li definovat symbol záporného znaménka. NumberDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst. PositiveSign, chcete-li definovat symbol kladného znaménka pro výsledné řetězce v exponenciálním formátu. |
"N" nebo "n" (specifikátor číselného formátu) | NegativeSign, chcete-li definovat symbol záporného znaménka. NumberDecimalDigits, chcete-li definovat výchozí počet zlomkových číslic. NumberDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst. NumberGroupSeparator, chcete-li definovat symbol oddělovače skupin (tisíců). NumberGroupSizes, chcete-li definovat počet integrálních číslic ve skupině. NumberNegativePattern, chcete-li definovat formát záporných hodnot. |
"P" nebo "p" (specifikátor formátu procent) | NegativeSign, chcete-li definovat symbol záporného znaménka. PercentDecimalDigits, chcete-li definovat výchozí počet zlomkových číslic. PercentDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst. PercentGroupSeparator, chcete-li definovat symbol oddělovače skupiny. PercentGroupSizes, chcete-li definovat počet integrálních číslic ve skupině. PercentNegativePatternpro definování umístění symbolu procenta a záporného symbolu pro záporné hodnoty. PercentPositivePatternpro definování umístění symbolu procenta pro kladné hodnoty. PercentSymbol, chcete-li definovat symbol procenta. |
"R" nebo "r" (specifikátor formátu Round-Trip) | NegativeSign, chcete-li definovat symbol záporného znaménka. NumberDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst. PositiveSign, k definování symbol kladného znaménka v exponentu. |
"X" nebo "x" (specifikátor šestnáctkového formátu) | Žádné |
"." (specifikátor vlastního formátu desetinné čárky) | NumberDecimalSeparator, chcete-li definovat symbol oddělovače desetinných míst. |
"," (specifikátor vlastního formátu oddělovače skupin) | NumberGroupSeparator, chcete-li definovat symbol oddělovače skupiny (tisíc). |
"%" (specifikátor vlastního formátu procentního symbolu) | PercentSymbol, chcete-li definovat symbol procenta. |
"‰" (specifikátor vlastního formátu zástupného textu na promile) | PerMilleSymbol, k definování symbolu na promile. |
"E" (specifikátor vlastního formátu exponenciálního zápisu) | NegativeSign, chcete-li definovat symbol záporného znaménka v mantise a exponentu. PositiveSign, chcete-li v exponentu definovat symbol kladného znaménka. |
Všimněte si, že NumberFormatInfo Třída obsahuje NativeDigits vlastnost, která určuje základní 10 číslic používaných specifickou jazykovou verzí. Tato vlastnost se však nepoužívá při formátování operací. ve výsledném řetězci je použita pouze základní Latinská číslice 0 (U + 0030) až 9 (U + 0039). Kromě toho pro Single a Double hodnoty, a NaN
se PositiveInfinity
NegativeInfinity
výsledný řetězec skládá výhradně z symbolů definovaných NaNSymbol PositiveInfinitySymbol vlastnostmi, a v NegativeInfinitySymbol uvedeném pořadí.
Změna vlastností NumberFormatInfo
Můžete upravit vlastnosti NumberFormatInfo objektu pro přizpůsobení výsledného řetězce vytvořeného v rámci operace formátování čísel. Použijte následující postup:
Vytvořte kopii objektu pro čtení a zápis, NumberFormatInfo jejíž konvence formátování chcete upravit. Další informace naleznete v části vytvoření instance objektu NumberFormatInfo .
Upravte vlastnost nebo vlastnosti, které se používají k výrobě požadovaného výsledného řetězce. Informace o tom, jak metody formátování používají NumberFormatInfo Vlastnosti k definování výsledných řetězců, naleznete v části formátovací řetězce a vlastnosti NumberFormatInfo .
Použijte vlastní NumberFormatInfo objekt jako IFormatProvider argument v volání metody formátování.
Poznámka
Namísto dynamické úpravy hodnot vlastností jazykové verze pokaždé, když je aplikace spuštěná, můžete CultureAndRegionInfoBuilder třídu použít k definování vlastní jazykové verze (jazyková verze, která má jedinečný název a doplňuje stávající jazykové verze), nebo nahrazující jazykové verze (ta, která se používá místo konkrétní jazykové verze).
V následujících částech jsou uvedeny některé příklady.
Úpravy symbolu a vzorce měny
Následující příklad upravuje NumberFormatInfo objekt, který představuje konvence formátování jazykové verze en-US. Přiřadí k vlastnosti symbol měny ISO-4217 CurrencySymbol a definuje vzor pro hodnoty měny, který se skládá z symbolu měny následovaného mezerou a číselnou hodnotou.
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
Formátování národního identifikačního čísla
Mnoho národních identifikačních čísel se skládá výhradně z číslic, takže je lze snadno formátovat úpravou vlastností NumberFormatInfo objektu. Například číslo sociálního pojištění v USA sestává z 9 číslic seřazených takto: XXX-XX-XXXX
. Následující příklad předpokládá, že čísla sociálních zabezpečení jsou ukládána jako celočíselné hodnoty a odpovídajícím způsobem jejich formátování.
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
Analýza číselných řetězců
Analýza zahrnuje převod řetězcové reprezentace čísla na číslo. každý číselný typ v .NET Framework zahrnuje dvě přetížené metody analýzy: Parse
a TryParse
. Parse
Metoda převede řetězec na číslo a vyvolá výjimku, pokud se převod nezdařil. TryParse
Metoda převede řetězec na číslo, přiřadí číslo k out
argumentu a vrátí Boolean hodnotu, která označuje, zda byl převod úspěšný.
Metody analýzy implicitně nebo explicitně používají NumberStyles hodnotu výčtu k určení, jaké prvky stylu (například oddělovače skupin, oddělovač desetinných míst nebo symbol měny) mohou být k dispozici v řetězci, pokud je operace analýzy úspěšná. Pokud NumberStyles ve volání metody není zadána hodnota, je výchozí NumberStyles hodnota, která zahrnuje Float AllowThousands příznaky a, což určuje, že analyzovaný řetězec může zahrnovat skupinové symboly, oddělovač desetinných míst, záporné znaménko a prázdné znaky, nebo může být řetězcové vyjádření čísla v exponenciálním zápisu.
Metody analýzy také implicitně nebo explicitně používají NumberFormatInfo objekt, který definuje konkrétní symboly a vzory, které mohou nastat v řetězci, který má být analyzován. Pokud není NumberFormatInfo objekt zadán, výchozí hodnota je NumberFormatInfo pro aktuální jazykovou verzi. Další informace o analýze naleznete v tématu jednotlivé metody analýzy, jako například Int16.Parse(String) ,, Int32.Parse(String, NumberStyles) , Int64.Parse(String, IFormatProvider) Decimal.Parse(String, NumberStyles, IFormatProvider) , Double.TryParse(String, Double) a BigInteger.TryParse(String, NumberStyles, IFormatProvider, BigInteger) .
Následující příklad ukazuje povahu pro analýzu řetězců závislých na jazykové verzi. Pokusí se analyzovat řetězec, který obsahuje oddělovače tisíců, pomocí konvencí en-US, fr-FR a neutrálních kultur. Řetězec, který obsahuje čárku jako oddělovač skupiny a tečku jako oddělovač desetinných míst, se nedokáže analyzovat v jazykové verzi fr-FR a řetězec s prázdným znakem jako oddělovač skupin a čárka jako oddělovač desetinných míst se nedokáže analyzovat v EN-US a neutrální jazykové verzi.
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)
K analýze obvykle dochází ve dvou kontextech:
Jako operace, která je navržena pro převod vstupu uživatele na číselnou hodnotu.
Jako operace, která je určená k přenosu číselné hodnoty; To znamená, že k deserializaci číselné hodnoty, která byla dříve serializována jako řetězec.
Následující části podrobněji popisují tyto dvě operace.
Analýza uživatelských řetězců
Při analýze vstupu číselných řetězců uživatelem byste vždy měli vytvořit instanci NumberFormatInfo objektu, který odráží kulturní nastavení uživatele. Informace o tom, jak vytvořit instanci NumberFormatInfo objektu, který odráží uživatelské přizpůsobení, najdete v části NumberFormatInfo a dynamická data .
Následující příklad znázorňuje rozdíl mezi operací analýzy, která odráží nastavení kultury uživatele a druhý, který ne. V tomto případě je výchozí jazyková verze systému en-US, ale uživatel definoval "", "jako oddělovač skupiny v Ovládacích panelech, oblasti a jazyk". ". Obvykle jsou tyto symboly vráceny ve výchozí jazykové verzi en-US. Když uživatel zadá řetězec, který odráží uživatelská nastavení, a řetězec je analyzován pomocí NumberFormatInfo objektu, který také odráží uživatelská nastavení (přepsání), operace analýzy vrátí správný výsledek. Nicméně, pokud je řetězec analyzován pomocí NumberFormatInfo objektu, který odráží standardní kulturní nastavení en-US, vyhodnotí symbol čárky pro oddělovač skupin a vrátí nesprávný výsledek.
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
Serializace a deserializace číselných dat
Pokud jsou číselná data serializována ve formátu řetězce a později deserializovaná a analyzovaná, řetězce by se měly vygenerovat a analyzovat pomocí konvencí invariantní jazykové verze. Operace formátování a analýzy by nikdy neměly odrážet konvence konkrétní jazykové verze. Pokud se použije nastavení specifická pro jazykovou verzi, přenositelnost dat je striktně omezené; lze ji úspěšně deserializovat pouze v vlákně, jejíž nastavení specifické pro jazykovou verzi je identické s hodnotami vlákna, na kterých byla serializována. V některých případech to znamená, že data nelze dokonce úspěšně deserializovat ve stejném systému, na kterém byla serializována.
Následující příklad ukazuje, co se může stát, když je tento princip porušení. Hodnoty s plovoucí desetinnou čárkou v poli jsou převedeny na řetězce v případě, že aktuální vlákno používá nastavení kultury en-US specifické pro jazykovou verzi. Data se pak analyzují pomocí vlákna, které používá nastavení specifické pro jazykovou verzi pt-BR. V takovém případě, i když je každá operace analýzy úspěšná, se data nezdaří a dojde k poškození dat. V jiných případech může být operace analýzy neúspěšná a FormatException mohla by být vyvolána výjimka.
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
Konstruktory
NumberFormatInfo() |
Inicializuje novou zapisovatelnou instanci NumberFormatInfo třídy, která je nezávislé na jazykové verzi (invariantní). |
Vlastnosti
CurrencyDecimalDigits |
Získá nebo nastaví počet desetinných míst, která se mají použít v hodnotách měny. |
CurrencyDecimalSeparator |
Získá nebo nastaví řetězec, který má být použit jako oddělovač desetinných míst v hodnotách měny. |
CurrencyGroupSeparator |
Získá nebo nastaví řetězec, který odděluje skupiny číslic nalevo od desetinné čárky v hodnotách měny. |
CurrencyGroupSizes |
Získá nebo nastaví počet číslic v každé skupině vlevo od desetinné čárky v hodnotách měny. |
CurrencyNegativePattern |
Získá nebo nastaví vzor formátu pro záporné hodnoty měny. |
CurrencyPositivePattern |
Získá nebo nastaví vzor formátu pro kladné hodnoty měny. |
CurrencySymbol |
Získá nebo nastaví řetězec, který má být použit jako symbol měny. |
CurrentInfo |
Získá pouze pro čtení NumberFormatInfo , které formátuje hodnoty na základě aktuální jazykové verze. |
DigitSubstitution |
Získá nebo nastaví hodnotu, která určuje, jak grafické uživatelské rozhraní zobrazuje tvar číslice. |
InvariantInfo |
Získá objekt jen pro čtení, který je nezávislý na jazykové verzi NumberFormatInfo (invariantní). |
IsReadOnly |
Získá hodnotu, která určuje, zda je NumberFormatInfo tento objekt jen pro čtení. |
NaNSymbol |
Získá nebo nastaví řetězec, který představuje hodnotu IEEE NaN (nikoli číslo). |
NativeDigits |
Získá nebo nastaví pole řetězců nativních číslic odpovídající západním číslicám 0 až 9. |
NegativeInfinitySymbol |
Získá nebo nastaví řetězec, který představuje záporné nekonečno. |
NegativeSign |
Získá nebo nastaví řetězec, který označuje, že přidružené číslo je záporné. |
NumberDecimalDigits |
Získá nebo nastaví počet desetinných míst, která se budou používat v číselných hodnotách. |
NumberDecimalSeparator |
Získá nebo nastaví řetězec, který se použije jako oddělovač desetinných míst v číselných hodnotách. |
NumberGroupSeparator |
Získá nebo nastaví řetězec, který odděluje skupiny číslic nalevo od desetinné čárky v číselných hodnotách. |
NumberGroupSizes |
Získá nebo nastaví počet číslic v každé skupině nalevo od desetinné čárky v číselných hodnotách. |
NumberNegativePattern |
Získá nebo nastaví formátový vzor pro záporné číselné hodnoty. |
PercentDecimalDigits |
Získá nebo nastaví počet desetinných míst, která se budou používat v hodnotách procent. |
PercentDecimalSeparator |
Získá nebo nastaví řetězec, který se použije jako oddělovač desetinných míst v hodnotách procent. |
PercentGroupSeparator |
Získá nebo nastaví řetězec, který odděluje skupiny číslic nalevo od desetinné čárky v hodnotách procent. |
PercentGroupSizes |
Získá nebo nastaví počet číslic v každé skupině nalevo od desetinné čárky v hodnotách procent. |
PercentNegativePattern |
Získá nebo nastaví formátový vzor pro záporné procentuální hodnoty. |
PercentPositivePattern |
Získá nebo nastaví vzorek formátu pro kladné procentuální hodnoty. |
PercentSymbol |
Získá nebo nastaví řetězec, který má být použit jako symbol procenta. |
PerMilleSymbol |
Získá nebo nastaví řetězec, který má být použit jako symbol na promile. |
PositiveInfinitySymbol |
Získá nebo nastaví řetězec, který představuje kladné nekonečno. |
PositiveSign |
Získá nebo nastaví řetězec, který označuje, že přidružené číslo je kladné. |
Metody
Clone() |
Vytvoří kopii objektu bez podstruktury NumberFormatInfo . |
Equals(Object) |
Určí, zda se zadaný objekt rovná aktuálnímu objektu. (Zděděno od Object) |
GetFormat(Type) |
Získá objekt zadaného typu, který poskytuje službu formátování čísel. |
GetHashCode() |
Slouží jako výchozí funkce hash. (Zděděno od Object) |
GetInstance(IFormatProvider) |
Získá objekt NumberFormatInfo přidružený k zadanému parametru IFormatProvider . |
GetType() |
Type Získá aktuální instanci. (Zděděno od Object) |
MemberwiseClone() |
Vytvoří použádnou kopii aktuálního souboru Object. (Zděděno od Object) |
ReadOnly(NumberFormatInfo) |
Vrátí obálku určenou jen pro čtení NumberFormatInfo . |
ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |