NumberFormatInfo kelas

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Kelas berisi NumberFormatInfo informasi khusus budaya yang digunakan saat Anda memformat dan mengurai nilai numerik. Informasi ini mencakup simbol mata uang, simbol desimal, simbol pemisah grup, dan simbol untuk tanda positif dan negatif.

Membuat instans objek NumberFormatInfo

Anda dapat membuat instans NumberFormatInfo objek yang mewakili konvensi pemformatan budaya saat ini, budaya invarian, budaya tertentu, atau budaya netral.

Membuat instans objek NumberFormatInfo untuk budaya saat ini

Anda dapat membuat NumberFormatInfo instans objek untuk budaya saat ini dengan salah satu cara berikut. Dalam setiap kasus, objek yang dikembalikan NumberFormatInfo bersifat baca-saja.

Contoh berikut menggunakan tiga cara ini untuk membuat NumberFormatInfo objek yang mewakili konvensi pemformatan budaya saat ini. Ini juga mengambil nilai IsReadOnly properti untuk menggambarkan bahwa setiap objek bersifat baca-saja.

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

Anda dapat membuat objek bisa-tulis NumberFormatInfo yang mewakili konvensi budaya saat ini dengan salah satu cara berikut:

Contoh berikut mengilustrasikan kedua cara ini untuk membuat NumberFormatInfo instans objek, dan menampilkan nilai propertinya IsReadOnly untuk menggambarkan bahwa objek tidak bersifat baca-saja.

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

Perhatikan bahwa sistem operasi Windows memungkinkan pengguna untuk mengambil alih beberapa NumberFormatInfo nilai properti yang digunakan dalam pemformatan numerik dan operasi penguraian melalui item Wilayah dan Bahasa di Panel Kontrol. Misalnya, pengguna yang budayanya adalah bahasa Inggris (Amerika Serikat) dapat memilih untuk menampilkan nilai mata uang sebagai 1,1 USD, bukan default $1,1. Objek NumberFormatInfo yang diambil dengan cara yang dibahas sebelumnya semuanya mencerminkan penimpaan pengguna ini. Jika ini tidak diinginkan, Anda dapat membuat NumberFormatInfo objek yang tidak mencerminkan penimpaan false pengguna (dan itu juga baca/tulis daripada baca-saja) dengan memanggil CultureInfo.CultureInfo(String, Boolean) konstruktor dan menyediakan nilai untuk useUserOverride argumen. Contoh berikut memberikan ilustrasi untuk sistem yang budayanya saat ini adalah Bahasa Inggris (Amerika Serikat) dan yang simbol mata uangnya telah diubah dari default $ menjadi USD.

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 Jika properti diatur ke true, properti CultureInfo.DateTimeFormat, , CultureInfo.NumberFormatdan CultureInfo.TextInfo juga diambil dari pengaturan pengguna. Jika pengaturan pengguna tidak kompatibel dengan budaya yang terkait dengan CultureInfo objek (misalnya, jika kalender yang dipilih bukan salah satu kalender yang tercantum oleh OptionalCalendars properti), hasil metode dan nilai properti tidak ditentukan.

Membuat instans objek NumberFormatInfo untuk budaya invariant

Budaya invarian mewakili budaya yang tidak peka budaya. Ini didasarkan pada bahasa Inggris tetapi tidak pada negara/wilayah berbahasa Inggris tertentu. Meskipun data budaya tertentu dapat dinamis dan dapat berubah untuk mencerminkan konvensi budaya baru atau preferensi pengguna, data budaya invarian tidak berubah. Objek NumberFormatInfo yang mewakili konvensi pemformatan budaya invarian dapat digunakan untuk operasi pemformatan di mana string hasil tidak boleh bervariasi menurut budaya.

Anda dapat membuat NumberFormatInfo instans objek yang mewakili konvensi pemformatan budaya invarian dengan cara berikut:

Contoh berikut menggunakan masing-masing metode ini untuk membuat instans NumberFormatInfo objek yang mewakili budaya invarian. Kemudian menunjukkan apakah objek bersifat baca-saja,

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

Membuat instans objek NumberFormatInfo untuk budaya tertentu

Budaya tertentu mewakili bahasa yang diucapkan di negara/wilayah tertentu. Misalnya, en-US adalah budaya tertentu yang mewakili bahasa Inggris yang digunakan dalam Amerika Serikat, dan en-CA adalah budaya tertentu yang mewakili bahasa Inggris yang digunakan di Kanada. Anda dapat membuat NumberFormatInfo instans objek yang mewakili konvensi pemformatan budaya tertentu dengan cara berikut:

Contoh berikut menggunakan empat cara ini untuk membuat NumberFormatInfo objek yang mencerminkan konvensi pemformatan budaya Indonesia (Indonesia). Ini juga menunjukkan apakah setiap objek bersifat baca-saja.

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

Membuat instans objek NumberFormatInfo untuk budaya netral

Budaya netral mewakili budaya atau bahasa yang independen dari suatu negara/wilayah. Biasanya induk dari satu atau beberapa budaya tertentu. Misalnya, fr adalah budaya netral untuk bahasa Prancis dan induk budaya fr-FR. Anda membuat NumberFormatInfo objek yang mewakili konvensi pemformatan budaya netral dengan cara yang sama seperti Anda membuat NumberFormatInfo objek yang mewakili konvensi pemformatan budaya tertentu.

Namun, karena independen dari negara/wilayah tertentu, budaya netral tidak memiliki informasi pemformatan khusus budaya. Daripada mengisi NumberFormatInfo objek dengan nilai generik, .NET mengembalikan NumberFormatInfo objek yang mencerminkan konvensi pemformatan dari budaya tertentu yang merupakan anak dari budaya netral. Misalnya, NumberFormatInfo objek untuk budaya en netral mencerminkan konvensi pemformatan budaya en-AS, dan NumberFormatInfo objek untuk budaya fr mencerminkan konvensi pemformatan budaya fr-FR.

Anda dapat menggunakan kode seperti berikut untuk menentukan konvensi pemformatan budaya tertentu mana yang diwakili oleh setiap budaya netral.

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();
    }
}

Data dinamis

Data khusus budaya untuk memformat nilai numerik yang disediakan oleh NumberFormatInfo kelas bersifat dinamis, sama seperti data budaya yang disediakan oleh CultureInfo kelas. Anda tidak boleh membuat asumsi tentang stabilitas nilai untuk NumberFormatInfo objek yang terkait dengan objek tertentu CultureInfo . Hanya data yang disediakan oleh budaya invarian dan objek terkait NumberFormatInfo yang stabil. Data lain dapat berubah di antara sesi aplikasi, atau bahkan dalam satu sesi, karena alasan berikut:

  • Pembaruan sistem. Preferensi budaya seperti simbol mata uang atau format mata uang berubah dari waktu ke waktu. Ketika ini terjadi, Windows Update menyertakan perubahan pada NumberFormatInfo nilai properti untuk budaya tertentu.

  • Kultur penggantian. Kelas CultureAndRegionInfoBuilder dapat digunakan untuk menggantikan data budaya yang ada.

  • Berskala perubahan pada nilai properti. Sejumlah properti terkait budaya dapat berubah pada waktu proses, yang, pada gilirannya, menyebabkan NumberFormatInfo data berubah. Misalnya, budaya saat ini dapat diubah baik secara terprogram atau melalui tindakan pengguna. Ketika ini terjadi, objek yang NumberFormatInfo dikembalikan oleh CurrentInfo properti berubah menjadi objek yang terkait dengan budaya saat ini.

  • Preferensi pengguna. Pengguna aplikasi Anda mungkin mengambil alih beberapa nilai yang terkait dengan budaya sistem saat ini melalui wilayah dan opsi bahasa dalam Panel Kontrol. Misalnya, pengguna dapat memilih simbol mata uang yang berbeda atau simbol pemisah desimal yang berbeda. CultureInfo.UseUserOverride Jika properti diatur ke true (nilai defaultnya), properti NumberFormatInfo objek juga diambil dari pengaturan pengguna.

Semua properti objek yang NumberFormatInfo dapat diganti pengguna diinisialisasi saat objek dibuat. Masih ada kemungkinan ketidakkonsistensian, karena tidak ada pembuatan objek atau proses penimpaan pengguna yang atomik, dan nilai yang relevan dapat berubah selama pembuatan objek. Namun, inkonsistensi ini harus sangat jarang terjadi.

Anda dapat mengontrol apakah penimpaan pengguna tercermin dalam NumberFormatInfo objek yang mewakili budaya yang sama dengan budaya saat ini. Tabel berikut mencantumkan cara NumberFormatInfo objek dapat diambil dan menunjukkan apakah objek yang dihasilkan mencerminkan penimpaan pengguna.

Sumber objek CultureInfo dan NumberFormatInfo Mencerminkan penimpaan pengguna
Properti CultureInfo.CurrentCulture.NumberFormat Ya
Properti NumberFormatInfo.CurrentInfo Ya
metode CultureInfo.CreateSpecificCulture Ya
metode CultureInfo.GetCultureInfo No
Konstruktor CultureInfo(String) Ya
Konstruktor CultureInfo.CultureInfo(String, Boolean) Bergantung pada nilai useUserOverride parameter

Kecuali ada alasan kuat untuk melakukan sebaliknya, Anda harus menghormati penimpaan pengguna ketika Anda menggunakan NumberFormatInfo objek dalam aplikasi klien untuk memformat dan mengurai input pengguna atau untuk menampilkan data numerik. Untuk aplikasi server atau aplikasi tanpa pengawas, Anda tidak boleh menghormati penimpaan pengguna. Namun, jika Anda menggunakan NumberFormatInfo objek baik secara eksplisit atau implisit untuk mempertahankan data numerik dalam bentuk string, Anda harus menggunakan NumberFormatInfo objek yang mencerminkan konvensi pemformatan budaya invarian, atau Anda harus menentukan string format numerik kustom yang Anda gunakan terlepas dari budaya.

Pemformatan IFormatProvider, NumberFormatInfo, dan numerik

Objek NumberFormatInfo digunakan secara implisit atau eksplisit dalam semua operasi pemformatan numerik. Ini termasuk panggilan ke metode berikut:

Semua operasi pemformatan numerik menggunakan IFormatProvider implementasi. Antarmuka IFormatProvider mencakup satu metode, GetFormat(Type). Ini adalah metode panggilan balik yang diteruskan objek Type yang mewakili jenis yang diperlukan untuk memberikan informasi pemformatan. Metode ini bertanggung jawab untuk mengembalikan instans jenis tersebut atau null, jika tidak dapat memberikan instans jenis. .NET menyediakan dua IFormatProvider implementasi untuk memformat angka:

IFormatProvider Jika implementasi tidak diberikan ke metode pemformatan secara eksplisit, objek yang CultureInfo dikembalikan oleh CultureInfo.CurrentCulture properti yang mewakili budaya saat ini digunakan.

Contoh berikut mengilustrasikan hubungan antara IFormatProvider antarmuka dan NumberFormatInfo kelas dalam operasi pemformatan dengan menentukan implementasi kustom IFormatProvider . Metodenya GetFormat menampilkan nama jenis objek yang diminta oleh operasi pemformatan. Jika antarmuka meminta NumberFormatInfo objek, metode ini menyediakan NumberFormatInfo objek untuk budaya saat ini. Seperti yang ditunjukkan oleh output dari contoh, Decimal.ToString(IFormatProvider) metode meminta NumberFormatInfo objek untuk memberikan informasi pemformatan, sedangkan String.Format(IFormatProvider, String, Object[]) permintaan NumberFormatInfo metode dan DateTimeFormatInfo objek serta ICustomFormatter implementasi.

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

IFormatProvider Jika implementasi tidak secara eksplisit disediakan dalam panggilan metode pemformatan numerik, metode memanggil CultureInfo.CurrentCulture.GetFormat metode , yang mengembalikan NumberFormatInfo objek yang sesuai dengan budaya saat ini.

Format string dan properti NumberFormatInfo

Setiap operasi pemformatan menggunakan string format numerik standar atau kustom untuk menghasilkan string hasil dari angka. Dalam beberapa kasus, penggunaan string format untuk menghasilkan string hasil bersifat eksplisit, seperti dalam contoh berikut. Kode ini memanggil Decimal.ToString(IFormatProvider) metode untuk mengonversi Decimal nilai ke sejumlah representasi string yang berbeda dengan menggunakan konvensi pemformatan budaya en-US.

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

Dalam kasus lain, penggunaan string format bersifat implisit. Misalnya, dalam metode berikut memanggil ke metode default atau tanpa Decimal.ToString() parameter, nilai Decimal instans diformat dengan menggunakan penentu format umum ("G") dan konvensi budaya saat ini, yang dalam hal ini adalah budaya en-US.

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

Setiap string format numerik standar menggunakan satu atau beberapa NumberFormatInfo properti untuk menentukan pola atau simbol yang digunakan dalam string hasil. Demikian pula, setiap penentu format numerik kustom kecuali simbol sisipan "0" dan "#" dalam string hasil yang ditentukan oleh NumberFormatInfo properti. Tabel berikut mencantumkan penentu format numerik standar dan kustom dan properti terkaitnya NumberFormatInfo . Untuk mengubah tampilan string hasil untuk budaya tertentu, lihat bagian Mengubah properti NumberFormatInfo. Untuk detail tentang penggunaan penentu format ini, lihat String Format Numerik Standar dan String Format Numerik Kustom.

Penentu format Properti terkait
"C" atau "c" (penentu format mata uang) CurrencyDecimalDigits, untuk menentukan jumlah default digit pecahan.

CurrencyDecimalSeparator, untuk menentukan simbol pemisah desimal.

CurrencyGroupSeparator, untuk menentukan pemisah grup atau ribuan.

CurrencyGroupSizes, untuk menentukan ukuran grup integral.

CurrencyNegativePattern, untuk menentukan pola nilai mata uang negatif.

CurrencyPositivePattern, untuk menentukan pola nilai mata uang positif.

CurrencySymbol, untuk menentukan simbol mata uang.

NegativeSign, untuk menentukan simbol tanda negatif.
"D" atau "d" (penentu format desimal) NegativeSign, untuk menentukan simbol tanda negatif.
"E" atau "e" (penentu format eksponensial atau ilmiah) NegativeSign, untuk menentukan simbol tanda negatif di mantissa dan eksponen.

NumberDecimalSeparator, untuk menentukan simbol pemisah desimal.

PositiveSign, untuk menentukan simbol tanda positif dalam eksponen.
"F" atau "f" (penentu format titik tetap) NegativeSign, untuk menentukan simbol tanda negatif.

NumberDecimalDigits, untuk menentukan jumlah default digit pecahan.

NumberDecimalSeparator, untuk menentukan simbol pemisah desimal.
"G" atau "g" (penentu format umum) NegativeSign, untuk menentukan simbol tanda negatif.

NumberDecimalSeparator, untuk menentukan simbol pemisah desimal.

PositiveSign, untuk menentukan simbol tanda positif untuk string hasil dalam format eksponensial.
"N" atau "n" (penentu format angka) NegativeSign, untuk menentukan simbol tanda negatif.

NumberDecimalDigits, untuk menentukan jumlah default digit pecahan.

NumberDecimalSeparator, untuk menentukan simbol pemisah desimal.

NumberGroupSeparator, untuk menentukan simbol pemisah grup (ribuan).

NumberGroupSizes, untuk menentukan jumlah digit integral dalam grup.

NumberNegativePattern, untuk menentukan format nilai negatif.
"P" atau "p" (penentu format persen) NegativeSign, untuk menentukan simbol tanda negatif.

PercentDecimalDigits, untuk menentukan jumlah default digit pecahan.

PercentDecimalSeparator, untuk menentukan simbol pemisah desimal.

PercentGroupSeparator, untuk menentukan simbol pemisah grup.

PercentGroupSizes, untuk menentukan jumlah digit integral dalam grup.

PercentNegativePattern, untuk menentukan penempatan simbol persen dan simbol negatif untuk nilai negatif.

PercentPositivePattern, untuk menentukan penempatan simbol persen untuk nilai positif.

PercentSymbol, untuk menentukan simbol persen.
"R" atau "r" (penentu format pulang-pergi) NegativeSign, untuk menentukan simbol tanda negatif.

NumberDecimalSeparator, untuk menentukan simbol pemisah desimal.

PositiveSign, untuk menentukan simbol tanda positif dalam eksponen.
"X" atau "x" (penentu format heksadesimal) Tidak ada.
"." (penentu format kustom titik desimal) NumberDecimalSeparator, untuk menentukan simbol pemisah desimal.
"," (penentu format kustom pemisah grup) NumberGroupSeparator, untuk menentukan simbol pemisah grup (ribuan).
"%" (penentu format kustom tempat penampung persentase) PercentSymbol, untuk menentukan simbol persen.
"‰" (penentu format kustom tempat penampung per mil) PerMilleSymbol, untuk menentukan simbol per mille.
"E" (penentu format kustom notasi eksponensial) NegativeSign, untuk menentukan simbol tanda negatif di mantissa dan eksponen.

PositiveSign, untuk menentukan simbol tanda positif dalam eksponen.

Perhatikan bahwa NumberFormatInfo kelas menyertakan NativeDigits properti yang menentukan basis 10 digit yang digunakan oleh budaya tertentu. Namun, properti tidak digunakan dalam operasi pemformatan; hanya digit Latin Dasar 0 (U+0030) hingga 9 (U+0039) yang digunakan dalam string hasil. Selain itu, untuk Single dan Double nilai NaN, , PositiveInfinitydan NegativeInfinity, string hasil masing-masing terdiri dari simbol yang ditentukan oleh NaNSymbolproperti , , PositiveInfinitySymboldan NegativeInfinitySymbol .

Mengubah properti NumberFormatInfo

Anda dapat mengubah properti NumberFormatInfo objek untuk menyesuaikan string hasil yang dihasilkan dalam operasi pemformatan numerik. Cara melakukan:

  1. Buat salinan baca/tulis objek yang NumberFormatInfo konvensi pemformatannya ingin Anda ubah. Untuk informasi selengkapnya, lihat bagian Membuat instans objek NumberFormatInfo.

  2. Ubah properti atau properti yang digunakan untuk menghasilkan string hasil yang diinginkan. Untuk informasi tentang cara metode pemformatan menggunakan NumberFormatInfo properti untuk menentukan string hasil, lihat bagian Properti format string dan NumberFormatInfo.

  3. Gunakan objek kustom NumberFormatInfo sebagai IFormatProvider argumen dalam panggilan ke metode pemformatan.

Catatan

Alih-alih memodifikasi nilai properti budaya secara dinamis setiap kali aplikasi dimulai, Anda dapat menggunakan CultureAndRegionInfoBuilder kelas untuk menentukan budaya kustom (budaya yang memiliki nama unik dan yang melengkapi budaya yang ada) atau budaya pengganti (yang digunakan alih-alih budaya tertentu).

Bagian berikut memberikan beberapa contoh.

Mengubah simbol dan pola mata uang

Contoh berikut memodifikasi NumberFormatInfo objek yang mewakili konvensi pemformatan budaya en-US. Ini menetapkan simbol mata uang ISO-4217 ke CurrencySymbol properti dan mendefinisikan pola untuk nilai mata uang yang terdiri dari simbol mata uang diikuti oleh spasi dan nilai numerik.

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

Memformat nomor identifikasi nasional

Banyak nomor identifikasi nasional yang terdiri dari digit secara eksklusif sehingga dapat dengan mudah diformat dengan memodifikasi properti NumberFormatInfo objek. Misalnya, nomor jaminan sosial dalam Amerika Serikat terdiri dari 9 digit yang diatur sebagai berikut: XXX-XX-XXXX. Contoh berikut mengasumsikan bahwa nomor jaminan sosial disimpan sebagai nilai bilangan bulat dan memformatnya dengan tepat.

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

Mengurai string numerik

Penguraian melibatkan konversi representasi string dari angka menjadi angka. Setiap jenis numerik di .NET mencakup dua metode penguraian yang kelebihan beban: Parse dan TryParse. Metode mengonversi Parse string menjadi angka dan melempar pengecualian jika konversi gagal. Metode mengonversi TryParse string menjadi angka, menetapkan angka ke out argumen, dan mengembalikan Boolean nilai yang menunjukkan apakah konversi berhasil.

Metode penguraian secara implisit atau eksplisit menggunakan NumberStyles nilai enumerasi untuk menentukan elemen gaya apa (seperti pemisah grup, pemisah desimal, atau simbol mata uang) dapat hadir dalam string jika operasi penguraian berhasil. NumberStyles Jika nilai tidak disediakan dalam panggilan metode, defaultnya adalah NumberStyles nilai yang menyertakan Float bendera dan AllowThousands , yang menentukan bahwa string yang diurai dapat menyertakan simbol grup, pemisah desimal, tanda negatif, dan karakter spasi putih, atau dapat menjadi representasi string dari angka dalam notasi eksponensial.

Metode penguraian juga secara implisit atau eksplisit menggunakan NumberFormatInfo objek yang menentukan simbol dan pola tertentu yang dapat terjadi dalam string yang akan diurai. NumberFormatInfo Jika objek tidak disediakan, defaultnya NumberFormatInfo adalah untuk budaya saat ini. Untuk informasi selengkapnya tentang penguraian, lihat metode penguraian individual, seperti Int16.Parse(String), , Int32.Parse(String, NumberStyles), Int64.Parse(String, IFormatProvider)Decimal.Parse(String, NumberStyles, IFormatProvider), Double.TryParse(String, Double), dan BigInteger.TryParse(String, NumberStyles, IFormatProvider, BigInteger).

Contoh berikut menggambarkan sifat string penguraian yang sensitif terhadap budaya. Ini mencoba mengurai string yang mencakup ribuan pemisah dengan menggunakan konvensi budaya en-AS, fr-FR, dan invarian. String yang mencakup koma sebagai pemisah grup dan periode sebagai pemisah desimal gagal diurai dalam budaya fr-FR, dan string dengan spasi putih sebagai pemisah grup dan koma sebagai pemisah desimal gagal mengurai budaya en-AS dan invarian.

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)

Penguraian umumnya terjadi dalam dua konteks:

  • Sebagai operasi yang dirancang untuk mengonversi input pengguna menjadi nilai numerik.

  • Sebagai operasi yang dirancang untuk pulang pergi nilai numerik; yaitu, untuk mendeserialisasi nilai numerik yang sebelumnya diserialisasikan sebagai string.

Bagian berikut membahas kedua operasi ini secara lebih rinci.

Mengurai string pengguna

Saat Mengurai input string numerik oleh pengguna, Anda harus selalu membuat NumberFormatInfo instans objek yang mencerminkan pengaturan budaya pengguna. Untuk informasi tentang cara membuat NumberFormatInfo instans objek yang mencerminkan kustomisasi pengguna, lihat bagian Data dinamis.

Contoh berikut mengilustrasikan perbedaan antara operasi penguraian yang mencerminkan pengaturan budaya pengguna dan yang tidak. Dalam hal ini, budaya sistem default adalah en-US, tetapi pengguna telah mendefinisikan "," sebagai simbol desimal dan "." sebagai pemisah grup di Panel Kontrol, Wilayah dan Bahasa. Biasanya, simbol-simbol ini dibalik dalam budaya en-AS default. Saat pengguna memasukkan string yang mencerminkan pengaturan pengguna, dan string diurai oleh NumberFormatInfo objek yang juga mencerminkan pengaturan pengguna (penimpaan), operasi penguraian mengembalikan hasil yang benar. Namun, ketika string diurai oleh NumberFormatInfo objek yang mencerminkan pengaturan budaya en-AS standar, string tersebut salah simbol koma untuk pemisah grup dan mengembalikan hasil yang salah.

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

Menserialisasikan dan mendeserialisasi data numerik

Ketika data numerik diserialisasikan dalam format string dan kemudian dideserialisasi dan diurai, string harus dihasilkan dan diurai dengan menggunakan konvensi budaya invariant. Operasi pemformatan dan penguraian tidak boleh mencerminkan konvensi budaya tertentu. Jika pengaturan khusus budaya digunakan, portabilitas data sangat terbatas; itu dapat berhasil dideserialisasi hanya pada utas yang pengaturan khusus budayanya identik dengan utas yang diserialisasikannya. Dalam beberapa kasus, ini berarti bahwa data bahkan tidak dapat berhasil dideserialisasi pada sistem yang sama tempat data tersebut diserialisasikan.

Contoh berikut menggambarkan apa yang dapat terjadi ketika prinsip ini dilanggar. Nilai floating-point dalam array dikonversi menjadi string ketika utas saat ini menggunakan pengaturan khusus budaya dari budaya en-US. Data kemudian diurai oleh utas yang menggunakan pengaturan khusus budaya dari budaya pt-BR. Dalam hal ini, meskipun setiap operasi penguraian berhasil, data tidak berhasil pulang pergi dan kerusakan data terjadi. Dalam kasus lain, operasi penguraian dapat gagal dan FormatException pengecualian dapat dilemparkan.

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