NumberFormatInfo sınıfı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

sınıfı, NumberFormatInfo sayısal değerleri biçimlendirip ayrıştırdığınızda kullanılan kültüre özgü bilgiler içerir. Bu bilgiler para birimi simgesini, ondalık simgesini, grup ayırıcı simgesini ve pozitif ve negatif işaretlerin simgelerini içerir.

NumberFormatInfo nesnesinin örneğini oluşturma

Geçerli kültürün, sabit kültürün, belirli bir NumberFormatInfo kültürün veya nötr kültürün biçimlendirme kurallarını temsil eden bir nesne örneği oluşturabilirsiniz.

Geçerli kültür için NumberFormatInfo nesnesi örneği oluşturma

Geçerli kültür için aşağıdaki yollardan herhangi biriyle bir NumberFormatInfo nesne örneği oluşturabilirsiniz. Her durumda, döndürülen NumberFormatInfo nesne salt okunurdur.

Aşağıdaki örnek, geçerli kültürün biçimlendirme kurallarını temsil eden nesneler oluşturmak NumberFormatInfo için bu üç yolu kullanır. Ayrıca her nesnenin IsReadOnly salt okunur olduğunu göstermek için özelliğinin değerini alır.

using System;
using System.Globalization;

public class InstantiateEx1
{
    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

Geçerli kültürün kurallarını temsil eden yazılabilir NumberFormatInfo bir nesne oluşturmak için aşağıdaki yollardan herhangi birini kullanabilirsiniz:

Aşağıdaki örnek, bir NumberFormatInfo nesnenin örneğini oluşturmanın bu iki yolunu gösterir ve nesnenin IsReadOnly salt okunur olmadığını göstermek için özelliğinin değerini görüntüler.

using System;
using System.Globalization;

public class InstantiateEx2
{
    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

Windows işletim sisteminin, kullanıcının sayısal biçimlendirme ve ayrıştırma işlemlerinde kullanılan bazı NumberFormatInfo özellik değerlerini Denetim Masası Bölge ve Dil öğesi aracılığıyla geçersiz kılmasına izin verdiğine dikkat edin. Örneğin, kültürü İngilizce (Birleşik Devletler) olan bir kullanıcı, para birimi değerlerini varsayılan 1,1 ABD doları yerine 1,1 ABD Doları olarak görüntülemeyi seçebilir. Daha NumberFormatInfo önce açıklanan yollarla alınan nesnelerin tümü bu kullanıcı geçersiz kılmalarını yansıtır. Bu istenmeyen bir NumberFormatInfo durumsa, oluşturucuyu çağırarak CultureInfo.CultureInfo(String, Boolean) ve bağımsız değişken için useUserOverride değerini sağlayarak kullanıcı geçersiz kılmalarını yansıtmayan (ve salt okunur değil aynı zamanda okuma/yazma) bir false nesne oluşturabilirsiniz. Aşağıdaki örnek, geçerli kültürü İngilizce (Birleşik Devletler) olan ve para birimi simgesi varsayılan $ olan ABD doları olarak değiştirilmiş bir sistem için bir çizim sağlar.

using System;
using System.Globalization;

public class InstantiateEx3
{
    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: $

CultureInfo.UseUserOverride özelliği olarak ayarlanırsatrue, CultureInfo.NumberFormat, ve CultureInfo.TextInfo özellikleri CultureInfo.DateTimeFormatde kullanıcı ayarlarından alınır. Kullanıcı ayarları nesneyle ilişkili kültürle CultureInfo uyumsuzsa (örneğin, seçilen takvim özelliği tarafından OptionalCalendars listelenen takvimlerden biri değilse), yöntemlerin sonuçları ve özelliklerin değerleri tanımsız olur.

Sabit kültür için NumberFormatInfo nesnesi örneği oluşturma

Sabit kültür, kültüre duyarlı olmayan bir kültürü temsil eder. İngilizce dilini temel alır, ancak belirli bir İngilizce konuşulan ülkeye/bölgeye dayalı değildir. Belirli kültürlerin verileri dinamik olabilir ve yeni kültürel kuralları veya kullanıcı tercihlerini yansıtacak şekilde değişebilir, ancak sabit kültürün verileri değişmez. Sabit kültürün biçimlendirme kurallarını temsil eden bir NumberFormatInfo nesne, sonuç dizelerinin kültüre göre değişmemesi gereken biçimlendirme işlemleri için kullanılabilir.

Sabit kültürün biçimlendirme kurallarını temsil eden bir NumberFormatInfo nesnenin örneğini aşağıdaki yollarla oluşturabilirsiniz:

Aşağıdaki örnek, sabit kültürü temsil eden bir NumberFormatInfo nesne örneği oluşturmak için bu yöntemlerin her birini kullanır. Ardından nesnenin salt okunur olup olmadığını gösterir,

using System;
using System.Globalization;

public class InstantiateEx4
{
    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

Belirli bir kültür için NumberFormatInfo nesnesi örneği oluşturma

Belirli bir kültür, belirli bir ülkede/bölgede konuşulan bir dili temsil eder. Örneğin en-US, Birleşik Devletler konuşulan İngilizce dilini temsil eden belirli bir kültürdür ve en-CA, Kanada'da konuşulan İngilizce dilini temsil eden belirli bir kültürdür. Belirli bir NumberFormatInfo kültürün biçimlendirme kurallarını temsil eden bir nesnenin örneğini aşağıdaki yollarla oluşturabilirsiniz:

Aşağıdaki örnek, Endonezya (Endonezya) kültürünün biçimlendirme kurallarını yansıtan bir NumberFormatInfo nesne oluşturmak için bu dört yolu kullanır. Ayrıca her nesnenin salt okunur olup olmadığını gösterir.

using System;
using System.Globalization;

public class InstantiateEx5
{
    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

Nötr bir kültür için NumberFormatInfo nesnesinin örneğini oluşturma

Tarafsız bir kültür, bir ülkeden/bölgeden bağımsız bir kültürü veya dili temsil eder. Genellikle bir veya daha fazla belirli kültürün üst öğesidir. Örneğin fr, Fransızca dili ve fr-FR kültürünün üst öğesi için nötr bir kültürdür. Nötr kültürün biçimlendirme kurallarını temsil eden bir NumberFormatInfo nesneyi, belirli bir kültürün biçimlendirme kurallarını temsil eden bir NumberFormatInfo nesne oluşturduğunuz gibi oluşturursunuz.

Ancak, belirli bir ülkeden/bölgeden bağımsız olduğundan, tarafsız bir kültür kültüre özgü biçimlendirme bilgilerinden yoksundur. .NET, nesneyi genel değerlerle doldurmak NumberFormatInfo yerine, nötr kültürün alt öğesi olan belirli bir kültürün biçimlendirme kurallarını yansıtan bir nesne döndürür NumberFormatInfo . Örneğin, NumberFormatInfo nötr en kültür nesnesi en-US kültürünün biçimlendirme kurallarını yansıtır ve NumberFormatInfo fr kültürüne yönelik nesne fr-FR kültürünün biçimlendirme kurallarını yansıtır.

Her nötr kültürün temsil ettiği belirli kültürün biçimlendirme kurallarını belirlemek için aşağıdaki gibi bir kod kullanabilirsiniz.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;

public class InstantiateEx6
{
    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();
    }
}

Dinamik veriler

Sınıf tarafından sağlanan sayısal değerleri biçimlendirmek için kültüre NumberFormatInfo özgü veriler, sınıfın CultureInfo sağladığı kültürel veriler gibi dinamiktir. Belirli CultureInfo nesnelerle ilişkili nesneler için NumberFormatInfo değerlerin kararlılığı hakkında hiçbir varsayımda bulunmamalısınız. Yalnızca sabit kültür ve ilişkili NumberFormatInfo nesnesi tarafından sağlanan veriler kararlıdır. Diğer veriler, aşağıdaki nedenlerle uygulama oturumları arasında veya tek bir oturumda bile değişebilir:

  • Sistem güncelleştirmeleri. Para birimi simgesi veya para birimi biçimleri gibi kültürel tercihler zaman içinde değişir. Bu durumda, Windows Update belirli bir kültür için NumberFormatInfo özellik değerinde değişiklikler içerir.

  • Değişim kültürleri. sınıfı, CultureAndRegionInfoBuilder mevcut bir kültürün verilerini değiştirmek için kullanılabilir.

  • Özellik değerlerinde basamaklı değişiklikler. Kültürle ilgili bir dizi özellik çalışma zamanında değişebilir ve bu da verilerin değişmesine neden olur NumberFormatInfo . Örneğin, geçerli kültür program aracılığıyla veya kullanıcı eylemi aracılığıyla değiştirilebilir. Bu durumda, NumberFormatInfo özelliği tarafından CurrentInfo döndürülen nesne geçerli kültürle ilişkilendirilmiş bir nesneye dönüşür.

  • Kullanıcı tercihleri. Uygulamanızın kullanıcıları, Denetim Masası bölge ve dil seçenekleri aracılığıyla geçerli sistem kültürüyle ilişkili bazı değerleri geçersiz kabilir. Örneğin, kullanıcılar farklı bir para birimi simgesi veya farklı bir ondalık ayırıcı simgesi seçebilir. CultureInfo.UseUserOverride Özelliği (varsayılan değeri) olarak ayarlanırsa true , nesnenin NumberFormatInfo özellikleri de kullanıcı ayarlarından alınır.

Nesne oluşturulduğunda, bir NumberFormatInfo nesnenin tüm kullanıcı tarafından geçersiz kılınabilir özellikleri başlatılır. Nesne oluşturma veya kullanıcı geçersiz kılma işlemi atomik olmadığından ve nesne oluşturma sırasında ilgili değerler değişebileceğinden tutarsızlık olasılığı hala vardır. Ancak, bu tutarsızlıklar son derece nadir olmalıdır.

Kullanıcı geçersiz kılmalarının geçerli kültürle aynı kültürü temsil eden nesnelere NumberFormatInfo yansıtılıp yansıtılmayacağını denetleyebilirsiniz. Aşağıdaki tabloda, bir NumberFormatInfo nesnenin alınabileceği yollar listelenir ve sonuçta elde edilen nesnenin kullanıcı geçersiz kılmalarını yansıtıp yansıtmadığı gösterilir.

CultureInfo ve NumberFormatInfo nesnesinin kaynağı Düşünceler kullanıcı geçersiz kılmaları
CultureInfo.CurrentCulture.NumberFormat Özellik Yes
NumberFormatInfo.CurrentInfo Özellik Yes
CultureInfo.CreateSpecificCulture Yöntem Yes
CultureInfo.GetCultureInfo Yöntem Hayır
CultureInfo(String) Oluşturucu Yes
CultureInfo.CultureInfo(String, Boolean) Oluşturucu Parametrenin useUserOverride değerine bağlıdır

Aksini yapmak için zorlayıcı bir neden yoksa, kullanıcı girişini biçimlendirmek ve ayrıştırmak veya sayısal verileri görüntülemek için istemci uygulamalarında nesnesini kullanırken NumberFormatInfo kullanıcı geçersiz kılmalarına dikkat etmelisiniz. Sunucu uygulamaları veya katılımsız uygulamalar için kullanıcı geçersiz kılmalarına dikkat etmemelisiniz. Ancak, dize biçiminde sayısal verileri kalıcı hale getirmek için nesneyi açık veya örtük olarak kullanıyorsanız NumberFormatInfo , sabit kültürün biçimlendirme kurallarını yansıtan bir NumberFormatInfo nesne kullanmanız veya kültürden bağımsız olarak kullanacağınız özel bir sayısal biçim dizesi belirtmeniz gerekir.

IFormatProvider, NumberFormatInfo ve sayısal biçimlendirme

Nesne NumberFormatInfo , tüm sayısal biçimlendirme işlemlerinde örtük veya açıkça kullanılır. Bunlar aşağıdaki yöntemlere yapılan çağrıları içerir:

Tüm sayısal biçimlendirme işlemleri bir IFormatProvider uygulamayı kullanır. Arabirimi tek IFormatProvider bir yöntem içerir: GetFormat(Type). Bu, biçimlendirme bilgileri sağlamak için gereken türü temsil eden bir nesne geçirilen bir Type geri çağırma yöntemidir. yöntemi, türün bir örneğini sağlayamıyorsa, bu türün nullveya örneğini döndürmekten sorumludur. .NET sayıları biçimlendirmek için iki IFormatProvider uygulama sağlar:

Bir biçimlendirme yöntemine açıkça bir IFormatProvider uygulama sağlanmazsa, geçerli kültürü temsil eden özelliği tarafından CultureInfo.CurrentCulture döndürülen bir CultureInfo nesne kullanılır.

Aşağıdaki örnek, özel IFormatProvider bir uygulama tanımlayarak biçimlendirme işlemlerinde arabirim ile sınıf arasındaki IFormatProvider ilişkiyi NumberFormatInfo gösterir. yöntemi GetFormat , biçimlendirme işlemi tarafından istenen nesnenin tür adını görüntüler. Arabirim bir NumberFormatInfo nesne istiyorsa, bu yöntem geçerli kültür için nesnesini sağlar NumberFormatInfo . Örnekteki çıktıda gösterildiği gibi, Decimal.ToString(IFormatProvider) yöntem biçimlendirme bilgileri sağlamak için bir NumberFormatInfo nesnesine istekte bulunurkenString.Format(IFormatProvider, String, Object[]), yöntem hem nesne hem DateTimeFormatInfo de uygulama ICustomFormatter isteğinde bulunurNumberFormatInfo.

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 FormatProviderEx
{
    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

Bir IFormatProvider uygulama, sayısal biçimlendirme yöntemi çağrısında açıkça sağlanmadıysa, yöntem geçerli kültüre karşılık gelen nesneyi döndüren NumberFormatInfo yöntemini çağırırCultureInfo.CurrentCulture.GetFormat.

Biçim dizeleri ve NumberFormatInfo özellikleri

Her biçimlendirme işlemi, bir sayıdan sonuç dizesi üretmek için standart veya özel bir sayısal biçim dizesi kullanır. Bazı durumlarda, aşağıdaki örnekte olduğu gibi bir sonuç dizesi oluşturmak için biçim dizesinin kullanımı açıktır. Bu kod, en-US kültürünün Decimal.ToString(IFormatProvider) biçimlendirme kurallarını kullanarak bir Decimal değeri bir dizi farklı dize gösterimine dönüştürmek için yöntemini çağırır.

using System;
using System.Globalization;

public class PropertiesEx1
{
    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

Diğer durumlarda, bir biçim dizesinin kullanımı örtükdür. Örneğin, aşağıdaki yöntemde varsayılan veya parametresiz Decimal.ToString() yönteme çağrılar, örneğin değeri Decimal genel ("G") biçim belirticisi ve geçerli kültürün kuralları kullanılarak biçimlendirilir ve bu durumda en-US kültürüdür.

using System;

public class PropertiesEx2
{
    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

Her standart sayısal biçim dizesi, sonuç dizesinde kullanılan deseni veya simgeleri belirlemek için bir veya daha fazla NumberFormatInfo özellik kullanır. Benzer şekilde, "0" ve "#" dışındaki her özel sayısal biçim tanımlayıcısı, sonuç dizesine özellikler tarafından NumberFormatInfo tanımlanan simgeler ekler. Aşağıdaki tabloda, standart ve özel sayısal biçim tanımlayıcıları ve bunların ilişkili NumberFormatInfo özellikleri listelenir. Belirli bir kültür için sonuç dizesinin görünümünü değiştirmek için NumberFormatInfo özelliklerini değiştirme bölümüne bakın. Bu biçim tanımlayıcılarının kullanımıyla ilgili ayrıntılar için bkz . Standart Sayısal Biçim Dizeleri ve Özel Sayısal Biçim Dizeleri.

Biçim belirteci İlişkili özellikler
"C" veya "c" (para birimi biçimi belirtici) CurrencyDecimalDigits, varsayılan kesirli basamak sayısını tanımlamak için.

CurrencyDecimalSeparator, ondalık ayırıcı simgesini tanımlamak için kullanılır.

CurrencyGroupSeparator, grup veya binlik ayırıcısını tanımlamak için.

CurrencyGroupSizes, integral gruplarının boyutlarını tanımlamak için.

CurrencyNegativePattern, negatif para birimi değerlerinin desenini tanımlamak için.

CurrencyPositivePattern, pozitif para birimi değerlerinin desenini tanımlamak için.

CurrencySymbol, para birimi simgesini tanımlamak için.

NegativeSign, negatif işaret simgesini tanımlamak için.
"D" veya "d" (ondalık biçim tanımlayıcısı) NegativeSign, negatif işaret simgesini tanımlamak için.
"E" veya "e" (üstel veya bilimsel biçim tanımlayıcısı) NegativeSign, mantis ve üs içinde negatif işaret simgesini tanımlamak için.

NumberDecimalSeparator, ondalık ayırıcı simgesini tanımlamak için kullanılır.

PositiveSign, üssünde pozitif işareti simgesini tanımlamak için.
"F" veya "f" (sabit nokta biçim belirtici) NegativeSign, negatif işaret simgesini tanımlamak için.

NumberDecimalDigits, varsayılan kesirli basamak sayısını tanımlamak için.

NumberDecimalSeparator, ondalık ayırıcı simgesini tanımlamak için kullanılır.
"G" veya "g" (genel biçim belirtici) NegativeSign, negatif işaret simgesini tanımlamak için.

NumberDecimalSeparator, ondalık ayırıcı simgesini tanımlamak için kullanılır.

PositiveSign, sonuç dizeleri için pozitif işaret simgesini üstel biçimde tanımlamak için.
"N" veya "n" (sayı biçimi tanımlayıcısı) NegativeSign, negatif işaret simgesini tanımlamak için.

NumberDecimalDigits, varsayılan kesirli basamak sayısını tanımlamak için.

NumberDecimalSeparator, ondalık ayırıcı simgesini tanımlamak için kullanılır.

NumberGroupSeparator, grup ayırıcısı (binler) simgesini tanımlamak için.

NumberGroupSizes, bir gruptaki tam sayı basamak sayısını tanımlamak için.

NumberNegativePattern, negatif değerlerin biçimini tanımlamak için.
"P" veya "p" (yüzde biçimi belirticisi) NegativeSign, negatif işaret simgesini tanımlamak için.

PercentDecimalDigits, varsayılan kesirli basamak sayısını tanımlamak için.

PercentDecimalSeparator, ondalık ayırıcı simgesini tanımlamak için kullanılır.

PercentGroupSeparator, grup ayırıcı simgesini tanımlamak için.

PercentGroupSizes, bir gruptaki tam sayı basamak sayısını tanımlamak için.

PercentNegativePattern, negatif değerler için yüzde simgesinin ve negatif simgesinin yerleşimini tanımlamak için.

PercentPositivePattern, pozitif değerler için yüzde simgesinin yerleşimini tanımlamak için.

PercentSymbol, yüzde simgesini tanımlamak için.
"R" veya "r" (gidiş dönüş biçim belirtici) NegativeSign, negatif işaret simgesini tanımlamak için.

NumberDecimalSeparator, ondalık ayırıcı simgesini tanımlamak için kullanılır.

PositiveSign, bir üs içinde pozitif işareti simgesini tanımlamak için.
"X" veya "x" (onaltılık biçim tanımlayıcısı) Yok.
"." (ondalık nokta özel biçim tanımlayıcısı) NumberDecimalSeparator, ondalık ayırıcı simgesini tanımlamak için kullanılır.
"," (grup ayırıcısı özel biçim tanımlayıcısı) NumberGroupSeparator, grup (binler) ayırıcı simgesini tanımlamak için.
"%" (yüzde yer tutucusu özel biçim tanımlayıcısı) PercentSymbol, yüzde simgesini tanımlamak için.
"‰" (değirmen başına yer tutucu özel biçim tanımlayıcısı) PerMilleSymbol, değirmen başına simgesini tanımlamak için.
"E" (üstel gösterim özel biçim tanımlayıcısı) NegativeSign, mantis ve üs içinde negatif işaret simgesini tanımlamak için.

PositiveSign, üssünde pozitif işareti simgesini tanımlamak için.

sınıfı, NumberFormatInfo belirli bir NativeDigits kültür tarafından kullanılan temel 10 basamak belirten bir özellik içerdiğini unutmayın. Ancak, özelliği biçimlendirme işlemlerinde kullanılmaz; sonuç dizesinde yalnızca 0 (U+0030) ile 9 (U+0039) arasında Temel Latin basamakları kullanılır. Buna ek olarak , ve DoubleNegativeInfinitydeğerleri NaNPositiveInfinityiçin Single sonuç dizesi yalnızca sırasıyla , PositiveInfinitySymbolve NegativeInfinitySymbol özellikleri tarafından NaNSymboltanımlanan simgelerden oluşur.

NumberFormatInfo özelliklerini değiştirme

Sayısal biçimlendirme işleminde üretilen sonuç dizesini özelleştirmek için bir nesnenin özelliklerini NumberFormatInfo değiştirebilirsiniz. Bunu yapmak için:

  1. Biçimlendirme kurallarını değiştirmek istediğiniz bir NumberFormatInfo nesnenin okuma/yazma kopyasını oluşturun. Daha fazla bilgi için NumberFormatInfo nesnesi örneği oluşturma bölümüne bakın.

  2. İstenen sonuç dizesini üretmek için kullanılan özelliği veya özellikleri değiştirin. Biçimlendirme yöntemlerinin sonuç dizelerini tanımlamak için özellikleri nasıl kullandığı NumberFormatInfo hakkında bilgi için, Dizeleri biçimlendirme ve NumberFormatInfo özellikleri bölümüne bakın.

  3. Biçimlendirme yöntemleri çağrılarında IFormatProvider bağımsız değişken olarak özel NumberFormatInfo nesneyi kullanın.

Not

Bir uygulama her başlatıldığında bir kültürün özellik değerlerini dinamik olarak değiştirmek yerine, sınıfını kullanarak CultureAndRegionInfoBuilder özel bir kültür (benzersiz bir ada sahip olan ve var olan kültürleri destekleyen bir kültür) veya bir değiştirme kültürü (belirli bir kültür yerine kullanılan kültür) tanımlayabilirsiniz.

Aşağıdaki bölümlerde bazı örnekler verilmiştir.

Para birimi simgesini ve desenini değiştirme

Aşağıdaki örnek, en-US kültürünün biçimlendirme kurallarını temsil eden bir NumberFormatInfo nesneyi değiştirir. Özelliğine ISO-4217 para birimi simgesini CurrencySymbol atar ve para birimi simgesinden ve ardından bir boşluk ve sayısal değerden oluşan para birimi değerleri için bir desen tanımlar.

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

Ulusal kimlik numarasını biçimlendirme

Birçok ulusal kimlik numarası yalnızca basamaklardan oluşur ve bu nedenle nesnenin NumberFormatInfo özellikleri değiştirilerek kolayca biçimlendirilebilir. Örneğin, Birleşik Devletler bir sosyal güvenlik numarası aşağıdaki gibi düzenlenmiş 9 rakamdan oluşur: XXX-XX-XXXX. Aşağıdaki örnekte sosyal güvenlik numaralarının tamsayı değerleri olarak depolandığı ve bunları uygun şekilde biçimlendirdiği varsayılır.

using System;
using System.Globalization;

public class CustomizeSSNEx
{
    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

Sayısal dizeleri ayrıştırma

Ayrıştırma, bir sayının dize gösterimini sayıya dönüştürmeyi içerir. .NET'teki her sayısal tür iki aşırı yüklenmiş ayrıştırma yöntemi içerir: Parse ve TryParse. Parse yöntemi bir dizeyi sayıya dönüştürür ve dönüştürme başarısız olursa bir özel durum oluşturur. TryParse yöntemi bir dizeyi sayıya dönüştürür, sayıyı bir out bağımsız değişkene atar ve dönüştürmenin başarılı olup olmadığını gösteren bir Boolean değer döndürür.

Ayrıştırma yöntemleri, ayrıştırma işleminin başarılı olması durumunda dizede hangi stil öğelerinin (grup ayırıcıları, ondalık ayırıcı veya para birimi simgesi gibi) bulunabileceğini belirlemek için bir numaralandırma değerini örtük olarak veya açıkça kullanır NumberStyles . Yöntem çağrısında bir NumberStyles değer sağlanmazsa, varsayılan değer ve AllowThousands bayraklarını içeren Float bir NumberStyles değerdir ve ayrıştırılan dizenin grup simgelerini, ondalık ayırıcısını, negatif işareti ve boşluk karakterlerini içerebileceğini veya üstel gösterimdeki bir sayının dize gösterimi olabileceğini belirtir.

Ayrıştırma yöntemleri ayrıca ayrıştırılacak dizede gerçekleşebilecek belirli simgeleri ve desenleri tanımlayan bir NumberFormatInfo nesneyi örtük olarak veya açıkça kullanır. Bir NumberFormatInfo nesne sağlanmazsa, geçerli kültür için varsayılan değerdir NumberFormatInfo . Ayrıştırma hakkında daha fazla bilgi için , , Int32.Parse(String, NumberStyles), Int64.Parse(String, IFormatProvider)Decimal.Parse(String, NumberStyles, IFormatProvider), Double.TryParse(String, Double)ve BigInteger.TryParse(String, NumberStyles, IFormatProvider, BigInteger)gibi Int16.Parse(String)ayrıştırma yöntemlerine bakın.

Aşağıdaki örnekte dizeleri ayrıştırma kültüre duyarlı yapısı gösterilmektedir. En-US, fr-FR ve sabit kültürlerin kurallarını kullanarak binlik ayırıcılar içeren bir dizeyi ayrıştırmaya çalışır. Grup ayırıcısı olarak virgül ve ondalık ayırıcı olarak nokta içeren bir dize fr-FR kültüründe ayrıştırılamaz ve grup ayırıcısı olarak boşluk ve ondalık ayırıcı olarak virgül içeren bir dize en-US ve sabit kültürlerde ayrıştırılamaz.

using System;
using System.Globalization;

public class ParseEx1
{
    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)

Ayrıştırma genellikle iki bağlamda gerçekleşir:

  • Kullanıcı girişini sayısal bir değere dönüştürmek için tasarlanmış bir işlem olarak.

  • Sayısal bir değere gidiş dönüş yapmak için tasarlanmış bir işlem olarak; başka bir ifadeyle, daha önce dize olarak seri hale getirilmiş bir sayısal değeri seri durumdan çıkarmak için.

Aşağıdaki bölümlerde bu iki işlem daha ayrıntılı olarak açıklanmıştır.

Kullanıcı dizelerini ayrıştırma

Kullanıcı tarafından sayısal dize girişi ayrıştırırken, her zaman kullanıcının kültürel ayarlarını yansıtan bir NumberFormatInfo nesne örneği oluşturmanız gerekir. Kullanıcı özelleştirmelerini yansıtan bir NumberFormatInfo nesnenin örneğini oluşturma hakkında bilgi için Dinamik veriler bölümüne bakın.

Aşağıdaki örnekte, kullanıcı kültürel ayarlarını yansıtan bir ayrıştırma işlemi ile olmayan bir ayrıştırma işlemi arasındaki fark gösterilmektedir. Bu durumda, varsayılan sistem kültürü en-US'dir, ancak kullanıcı ondalık simgesi olarak "," ve Denetim Masası, Bölge ve Dil'de grup ayırıcısı olarak "." tanımlamıştır. Normalde, bu simgeler varsayılan en-US kültüründe tersine çevrilir. Kullanıcı kullanıcı ayarlarını yansıtan bir dize girdiğinde ve dize kullanıcı ayarlarını da yansıtan bir NumberFormatInfo nesne tarafından ayrıştırıldığında (geçersiz kılmalar), ayrıştırma işlemi doğru bir sonuç döndürür. Ancak, dize standart en-US kültürel ayarlarını yansıtan bir NumberFormatInfo nesne tarafından ayrıştırıldığında, grup ayırıcısı için virgül simgesini yanlış kullanır ve yanlış bir sonuç döndürür.

using System;
using System.Globalization;

public class ParseUserEx
{
    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

Sayısal verileri seri hale getirme ve seri durumdan çıkarma

Sayısal veriler dize biçiminde seri hale getirildiğinde ve daha sonra seri durumdan çıkarılıp ayrıştırıldığında, dizeler sabit kültürün kuralları kullanılarak oluşturulup ayrıştırılmalıdır. Biçimlendirme ve ayrıştırma işlemleri hiçbir zaman belirli bir kültürün kurallarını yansıtmamalıdır. Kültüre özgü ayarlar kullanılırsa, verilerin taşınabilirliği kesinlikle sınırlıdır; yalnızca kültüre özgü ayarları seri hale getirildiği iş parçacığının ayarlarıyla aynı olan bir iş parçacığında başarıyla seri durumdan çıkarılabilir. Bazı durumlarda bu, verilerin seri hale getirildiği sistemde başarıyla seri durumdan çıkarılamayacağı anlamına gelir.

Aşağıdaki örnekte, bu ilke ihlal edildiğinde neler olabileceği gösterilmektedir. Geçerli iş parçacığı en-US kültürünün kültüre özgü ayarlarını kullandığında bir dizideki kayan nokta değerleri dizelere dönüştürülür. Ardından veriler pt-BR kültürünün kültüre özgü ayarlarını kullanan bir iş parçacığı tarafından ayrıştırılır. Bu durumda, her ayrıştırma işlemi başarılı olsa da, veriler başarıyla gidiş dönüş yapmaz ve veri bozulması oluşur. Diğer durumlarda ayrıştırma işlemi başarısız olabilir ve özel durum FormatException oluşturulabilir.

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Threading;

public class ParsePersistedEx
{
    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