Aracılığıyla paylaş


NumberFormatInfo sınıfı

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

NumberFormatInfo sınıfı, sayısal değerleri biçimlendirip ayrıştırırken 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 kültürün veya nötr kültürün biçimlendirme kurallarını temsil eden bir NumberFormatInfo nesnesi örneği oluşturabilirsiniz.

Geçerli kültür için bir NumberFormatInfo nesnesi oluşturun

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

Aşağıdaki örnek, geçerli kültürün biçimlendirme kurallarını temsil eden NumberFormatInfo nesneleri oluşturmak için bu üç yolu kullanır. Ayrıca her nesnenin salt okunur olduğunu göstermek için IsReadOnly ö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 bir NumberFormatInfo nesnesi aşağıdaki yollardan herhangi birini kullanarak oluşturabilirsiniz:

Aşağıdaki örnek, bir NumberFormatInfo nesnesinin örneğini oluşturmanın bu iki yolunu gösterir ve nesnenin salt okunur olmadığını göstermek için IsReadOnly ö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 Denetim Masası'ndaki NumberFormatInfo öğesi aracılığıyla sayısal biçimlendirme ve ayrıştırma işlemlerinde kullanılan bazı özellik değerlerini geçersiz kılmasına izin verdiğine dikkat edin. Örneğin, kültürü İngilizce (ABD) 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 önce açıklanan yollarla alınan NumberFormatInfo nesnelerinin tümü, bu kullanıcı tarafından yapılan geçersiz kılmaları yansıtır. Eğer bu istenmeyen bir durumsa, NumberFormatInfo oluşturucuyu çağırarak ve CultureInfo.CultureInfo(String, Boolean) bağımsız değişkeni için false değerini girerek kullanıcı geçersiz kılmalarını yansıtmayan ve salt okunur olmayan, okuma/yazma yeteneğine sahip bir useUserOverride nesnesi oluşturabilirsiniz. Aşağıdaki örnek, geçerli kültürü İngilizce (ABD) olan ve para birimi simgesi varsayılan $'dan USD'ye değiştirilmiş bir sistem için bir örnek verir.

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:    {culture.Name}");
        Console.WriteLine($"User Overrides:  {culture.UseUserOverride}");
        Console.WriteLine($"Currency Symbol: {culture.NumberFormat.CurrencySymbol}\n");

        culture = new CultureInfo(CultureInfo.CurrentCulture.Name, false);
        Console.WriteLine($"Culture Name:    {culture.Name}");
        Console.WriteLine($"User Overrides:  {culture.UseUserOverride}");
        Console.WriteLine($"Currency Symbol: {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 trueolarak ayarlanırsa, CultureInfo.DateTimeFormat, CultureInfo.NumberFormatve CultureInfo.TextInfo özellikleri de kullanıcı ayarlarından alınır. Kullanıcı ayarları CultureInfo nesnesiyle ilişkili kültürle uyumsuzsa (örneğin, seçilen takvim OptionalCalendars özelliği tarafından listelenen takvimlerden biri değilse), yöntemlerin sonuçları ve özelliklerin değerleri tanımlanmamış olur.

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

Sabit kültür, kültüre duyarsız 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 nesnesi, 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 nesnesini şu yollarla oluşturabilirsiniz:

Aşağıdaki örnek, sabit kültürü temsil eden bir NumberFormatInfo nesnesi ö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 ABD'de 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 kültürün biçimlendirme kurallarını temsil eden bir NumberFormatInfo nesnesinin ö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 nesnesi 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: {nfi.IsReadOnly}");

        culture = new CultureInfo("id-ID");
        nfi = NumberFormatInfo.GetInstance(culture);
        Console.WriteLine($"Read-only: {nfi.IsReadOnly}");

        culture = CultureInfo.CreateSpecificCulture("id-ID");
        nfi = culture.NumberFormat;
        Console.WriteLine($"Read-only: {nfi.IsReadOnly}");

        culture = new CultureInfo("id-ID");
        nfi = culture.NumberFormat;
        Console.WriteLine($"Read-only: {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 ana unsurudur. Örneğin, fr hem Fransızca dili için nötr bir kültürdür hem de fr-FR kültürünün üst kültürüdür. Belirli bir kültürün biçimlendirme kurallarını temsil eden bir NumberFormatInfo nesnesi oluşturduğunuzda olduğu gibi nötr kültürün biçimlendirme kurallarını temsil eden bir NumberFormatInfo nesnesi 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, NumberFormatInfo nesnesini genel değerlerle doldurmak yerine, nötr kültürün alt öğesi olan belirli bir kültürün biçimlendirme kurallarını yansıtan bir NumberFormatInfo nesnesi döndürür. Örneğin, nötr en kültürünün NumberFormatInfo nesnesi en-US kültürün biçimlendirme kurallarını, fr kültürünün NumberFormatInfo nesnesi de fr-FR kültürü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 '{name}' matches '{ci.Name}'");
                hasOneMatch = true;
            }
        }
        if (!hasOneMatch)
            Console.WriteLine($"NumberFormatInfo object for '{name}' --> No Match");

        Console.WriteLine();
    }
}

Dinamik veriler

NumberFormatInfo sınıfı tarafından sağlanan sayısal değerleri biçimlendirmek için kültüre özgü veriler, CultureInfo sınıfı tarafından sağlanan kültürel veriler gibi dinamiktir. Belirli NumberFormatInfo nesnelerle ilişkili CultureInfo nesneler için 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.

  • Yerine geçme kültürleri. CultureAndRegionInfoBuilder sınıfı, 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 NumberFormatInfo verilerin değişmesine neden olur. Ö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 döndürülen CurrentInfo nesnesi geçerli kültürle ilişkili bir nesneye dönüşür.

  • Kullanıcı tercihleri. Uygulamanızın kullanıcıları, Denetim Masası'ndaki 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 true (varsayılan değeri) olarak ayarlanırsa, NumberFormatInfo nesnesinin özellikleri de kullanıcı ayarlarından alınır.

NumberFormatInfo nesnesinin tüm kullanıcı tarafından geçersiz kılınabilir özellikleri, nesne oluşturulduğunda 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, mevcut kültürle aynı kültürü temsil eden NumberFormatInfo nesnelerine yansıyıp yansımadığını kontrol edebilirsiniz. Aşağıdaki tabloda, bir NumberFormatInfo nesnesinin 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ğı Kullanıcı ayar değişikliklerini yansıtır
CultureInfo.CurrentCulture.NumberFormat özelliği Evet
NumberFormatInfo.CurrentInfo özelliği Evet
CultureInfo.CreateSpecificCulture yöntemi Evet
CultureInfo.GetCultureInfo yöntemi Hayı
CultureInfo(String) Oluşturucu Evet
CultureInfo.CultureInfo(String, Boolean) Oluşturucu useUserOverride parametresinin değerine bağlıdır

Başka türlü yapmanız 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 NumberFormatInfo nesnesini kullandığınızda kullanıcı geçersiz kılmalarına saygı göstermelisiniz. Sunucu uygulamaları veya katılımsız uygulamalar için kullanıcı geçersiz kılmalarını dikkate almamalısınız. Ancak, sayısal verileri dize biçiminde kalıcı hale getirmek için NumberFormatInfo nesnesini açık veya örtük olarak kullanıyorsanız, sabit kültürün biçimlendirme kurallarını yansıtan bir NumberFormatInfo nesnesi 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

NumberFormatInfo nesnesi, 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 uygulamasını kullanır. IFormatProvider arabirimi GetFormat(Type)tek bir yöntem içerir. Bu, biçimlendirme bilgileri sağlamak için gereken türü temsil eden bir Type nesnesinin aktarıldığı bir geri çağırma yöntemidir. Türün bir örneğini sağlamıyorsa, yöntem bu türün bir örneğini veya null'i döndürmekten sorumludur. .NET, sayıları biçimlendirmek için iki IFormatProvider uygulaması sağlar:

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

Aşağıdaki örnek, özel bir IFormatProvider uygulaması tanımlayarak biçimlendirme işlemlerinde NumberFormatInfo arabirimi ile IFormatProvider sınıfı arasındaki ilişkiyi gösterir. GetFormat yöntemi, biçimlendirme işlemi tarafından istenen nesnenin tür adını görüntüler. Arabirim bir NumberFormatInfo nesnesi istiyorsa, bu yöntem geçerli kültür için NumberFormatInfo nesnesi sağlar. Örnekteki çıktıda gösterildiği gibi, Decimal.ToString(IFormatProvider) yöntemi biçimlendirme bilgileri sağlamak için bir NumberFormatInfo nesnesi istediğinden, String.Format(IFormatProvider, String, Object[]) yöntemi NumberFormatInfo ve DateTimeFormatInfo nesnelerinin yanı sıra bir ICustomFormatter uygulaması da istemektedir.

using System;
using System.Globalization;

public class CurrentCultureFormatProvider : IFormatProvider
{
    public Object GetFormat(Type formatType)
    {
        Console.WriteLine($"Requesting an object of type {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 uygulaması 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 CultureInfo.CurrentCulture.GetFormat nesnesini döndüren NumberFormatInfo yöntemini çağırır.

Dizeleri ve NumberFormatInfo özelliklerini biçimlendirme

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 biçimlendirme kurallarını kullanarak bir Decimal.ToString(IFormatProvider) değerini bir dizi farklı dize gösterimine dönüştürmek için Decimal 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öntem çağrılarında, varsayılan veya parametresiz Decimal.ToString() yöntemi kullanılırken, Decimal örneğinin değeri genel ("G") biçim belirticisi ve mevcut kültürün kuralları ile, bu durumda en-US kültürü, formatlanı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 özelliği kullanır. Benzer şekilde, "0" ve "#" dışındaki her özel sayısal biçim tanımlayıcısı, sonuç dizesine NumberFormatInfo özellikleri tarafından tanımlanan simgeler ekler. Aşağıdaki tabloda standart ve özel sayısal biçim tanımlayıcıları ile ilişkili NumberFormatInfo özellikleri listeledik. Belirli bir kültürün 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 tanımlayıcısı İlişkili özellikler
"C" veya "c" (para birimi biçimi belirtici) CurrencyDecimalDigits, varsayılan kesirli basamak sayısını tanımlamak için.

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

CurrencyGroupSeparator, grup ya da binlik ayırıcıyı tanımlamak için.

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

Negatif para birimi değerlerinin desenini tanımlamak için CurrencyNegativePatternkullanın.

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

para birimi simgesini tanımlamak için CurrencySymbol.

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

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

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

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

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

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

PositiveSign, üstel formatta sonuç dizgeleri için pozitif işaret sembolünü tanımlamak üzere.
"N" veya "n" (sayı biçimi tanımlayıcısı) NegativeSign, negatif işareti simgesini tanımlamak için kullanılır.

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

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

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

Bir gruptaki tam sayı basamaklarının sayısını tanımlamak için NumberGroupSizes.

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

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

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

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

Bir gruptaki tam sayı basamaklarının sayısını tanımlamak için PercentGroupSizes.

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

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

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

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

bir kuvvet olarak pozitif işareti simgesini tanımlamak için PositiveSign.
"X" veya "x" (on-altılık biçim tanımlayıcısı) Yok.
"." (ondalık nokta özel biçim tanımlayıcısı) ondalık ayırıcı simgesini tanımlamak için NumberDecimalSeparator.
"," (grup ayırıcısı özel biçim tanımlayıcısı) grup (binler) ayırıcı simgesini tanımlamak için NumberGroupSeparator.
"%" (yüzde yer tutucusu özel biçim tanımlayıcısı) yüzde simgesini tanımlamak için PercentSymbol.
"‰" (binde yer tutucu özel biçim tanımlayıcısı) Binde simgesini tanımlamak için PerMilleSymbol.
"E" (üstel gösterim özel biçim tanımlayıcısı) NegativeSign, mantis ve üs içindeki negatif işaret simgesini tanımlamak için kullanılır.

üssündeki pozitif işaret simgesini tanımlamak için PositiveSign.

NumberFormatInfo sınıfının belirli bir kültür tarafından kullanılan temel 10 basamağı belirten bir NativeDigits özelliği 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. Ayrıca, Single, Doubleve NaNPositiveInfinity ve NegativeInfinity değerleri için sonuç dizesi yalnızca sırasıyla NaNSymbol, PositiveInfinitySymbolve NegativeInfinitySymbol özellikleri tarafından tanımlanan simgelerden oluşur.

NumberFormatInfo özelliklerini değiştirme

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

  1. Biçimlendirme kurallarını değiştirmek istediğiniz bir NumberFormatInfo nesnesinin okuma/yazma kopyasını oluşturun. Daha fazla bilgi için Bir 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 NumberFormatInfo özelliklerini nasıl kullandığı hakkında bilgi için Biçim dizeleri ve NumberFormatInfo özellikleri bölümüne bakın.

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

Uyarı

Bir uygulama her başlatıldığında bir kültürün özellik değerlerini dinamik olarak değiştirmek yerine, CultureAndRegionInfoBuilder sınıfını kullanarak ö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 nesnesini değiştirir. CurrencySymbol özelliğine ISO-4217 para birimi simgesini 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 NumberFormatInfo nesnesinin özellikleri değiştirilerek kolayca biçimlendirilebilir. Örneğin, Abd'deki bir sosyal güvenlik numarası şu şekilde düzenlenmiş 9 basamaktır: 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ı out bağımsız değişkenine atar ve dönüştürmenin başarılı olup olmadığını gösteren bir Boolean değeri 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 örtük olarak veya açıkça bir NumberStyles numaralandırma değeri kullanır. Yöntem çağrısında bir NumberStyles değeri sağlanmazsa, varsayılan değer NumberStyles ve Float bayraklarını içeren bir AllowThousands değeridir. Ayrıştırılan dizenin grup simgeleri, ondalık ayırıcı, negatif işaret ve boşluk karakterleri içerebileceğini veya üstel gösterimde bir sayının dize gösterimi olabileceğini belirtir.

Ayrıştırma yöntemleri ayrıca ayrıştırılacak dizede oluşabilen belirli simgeleri ve desenleri tanımlayan bir NumberFormatInfo nesnesini örtük olarak veya açıkça kullanır. bir NumberFormatInfo nesnesi sağlanmazsa, varsayılan değer geçerli kültür için NumberFormatInfo' dir. Ayrıştırma hakkında daha fazla bilgi için Int16.Parse(String), 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 ayrıştırma yöntemlerine bakın.

Aşağıdaki örnek, dizelerin ayrıştırılmasının kültürel duyarlılık gösteren doğasını açıklar. en-US, fr-FR ve sabit ve invariant 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 içeren 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($"'{value}' --> {amount} ({name})");
                }
                catch (FormatException)
                {
                    Console.WriteLine($"'{value}': FormatException ({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 nesnesi örneği oluşturmanız gerekir. Kullanıcı özelleştirmelerini yansıtan bir NumberFormatInfo nesnesinin örneğini oluşturma hakkında bilgi için dinamik veri 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'dır, ancak kullanıcı denetim masasında, Bölge ve Dil'nde ondalık simgesi olarak "," ve grup ayırıcı 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ı (geçersiz kılmaları) da yansıtan bir NumberFormatInfo nesnesi tarafından ayrıştırıldığında, ayrıştırma işlemi doğru bir sonuç döndürür. Ancak, dize standart en-US kültürel ayarları yansıtan bir NumberFormatInfo nesnesi 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($"{stdCulture.Name} culture reflects user overrides: {stdCulture.UseUserOverride}");
            Decimal amount = Decimal.Parse(value, stdCulture);
            Console.WriteLine($"'{value}' --> {amount.ToString(CultureInfo.InvariantCulture)}");
        }
        catch (FormatException)
        {
            Console.WriteLine($"Unable to parse '{value}'");
        }
        Console.WriteLine();

        try
        {
            Console.WriteLine($"{custCulture.Name} culture reflects user overrides: {custCulture.UseUserOverride}");
            Decimal amount = Decimal.Parse(value, custCulture);
            Console.WriteLine($"'{value}' --> {amount.ToString(CultureInfo.InvariantCulture)}");
        }
        catch (FormatException)
        {
            Console.WriteLine($"Unable to parse '{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 serileştirmek ve seriden çıkarmak

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 ciddi ölçüde 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. Bir dizideki kayan nokta değerleri, geçerli iş parçacığı en-US kültürüne özgü ayarları kullandığında dizelere dönüştürülür. Daha sonra 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 FormatException özel durumu 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