NumberFormatInfo Kelas

Definisi

Menyediakan informasi khusus budaya untuk memformat dan mengurai nilai numerik.

public ref class NumberFormatInfo sealed : IFormatProvider
public ref class NumberFormatInfo sealed : ICloneable, IFormatProvider
public sealed class NumberFormatInfo : IFormatProvider
public sealed class NumberFormatInfo : ICloneable, IFormatProvider
[System.Serializable]
public sealed class NumberFormatInfo : ICloneable, IFormatProvider
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public sealed class NumberFormatInfo : ICloneable, IFormatProvider
type NumberFormatInfo = class
    interface IFormatProvider
type NumberFormatInfo = class
    interface ICloneable
    interface IFormatProvider
[<System.Serializable>]
type NumberFormatInfo = class
    interface ICloneable
    interface IFormatProvider
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type NumberFormatInfo = class
    interface ICloneable
    interface IFormatProvider
Public NotInheritable Class NumberFormatInfo
Implements IFormatProvider
Public NotInheritable Class NumberFormatInfo
Implements ICloneable, IFormatProvider
Warisan
NumberFormatInfo
Atribut
Penerapan

Keterangan

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

Menginstansiasi 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 menginstansiasi objek NumberFormatInfo untuk budaya yang saat ini berlaku dengan salah satu cara berikut. Dalam setiap kasus, objek yang dikembalikan NumberFormatInfo bersifat hanya dapat dibaca.

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

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 menginisialisasi objek NumberFormatInfo, dan menampilkan nilai properti IsReadOnly-nya 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) mungkin memilih untuk menampilkan nilai mata uang sebagai 1,1 USD, bukan default $1,1. Objek NumberFormatInfo yang diambil dengan cara yang telah dibahas sebelumnya akan mencerminkan semua penyesuaian pengguna ini. Jika ini tidak diinginkan, Anda dapat membuat NumberFormatInfo objek yang tidak mencerminkan penimpaan pengguna CultureInfo.CultureInfo(String, Boolean) (dan yang dapat dibaca dan ditulis, bukan hanya dibaca saja) dengan pihak pemanggil konstruktor false dan menyediakan nilai untuk argumen useUserOverride. 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:    {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: $

Jika properti CultureInfo.UseUserOverride diatur ke true, properti CultureInfo.DateTimeFormat, CultureInfo.NumberFormat, dan 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 instance objek NumberFormatInfo 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 di 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 tiap objek bersifat hanya baca.

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

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-US, 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 '{name}' matches '{ci.Name}'");
                hasOneMatch = true;
            }
        }
        if (!hasOneMatch)
            Console.WriteLine($"NumberFormatInfo object for '{name}' --> No Match");

        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 nilai properti pada NumberFormatInfo untuk budaya tertentu.

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

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

  • Preferensi pengguna. Pengguna aplikasi Anda mungkin mengambil alih beberapa nilai yang terkait dengan budaya sistem saat ini melalui wilayah dan opsi bahasa di 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 NumberFormatInfo yang dapat diubah oleh pengguna diinisialisasi saat objek dibuat. Masih ada kemungkinan ketidakonsistenan, karena baik pembuatan objek maupun proses penimpaan pengguna tidak bersifat atomik, dan nilai yang relevan dapat berubah selama pembuatan objek. Namun, inkonsistensi ini harus sangat jarang terjadi.

Anda dapat mengontrol apakah pengubahan pengguna tercermin dalam NumberFormatInfo objek yang berrepresentasi budaya yang sama dengan budaya saat ini. Tabel berikut mencantumkan cara pengambilan objek NumberFormatInfo dan mengindikasikan apakah objek yang dihasilkan mencerminkan penimpaan pengguna.

Sumber objek CultureInfo dan NumberFormatInfo Mencerminkan penimpaan pengguna
properti CultureInfo.CurrentCulture.NumberFormat Yes
properti NumberFormatInfo.CurrentInfo Yes
metode CultureInfo.CreateSpecificCulture Yes
metode CultureInfo.GetCultureInfo No
CultureInfo(String) pembangun Yes
CultureInfo.CultureInfo(String, Boolean) pembangun 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 yang berjalan tanpa pengawasan, tidak perlu mengikuti pengaturan 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.

IFormatProvider, NumberFormatInfo, dan pemformatan numerik

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

Semua operasi pemformatan numerik menggunakan IFormatProvider implementasi. Antarmuka IFormatProvider mencakup satu metode, GetFormat(Type). Ini adalah metode panggilan balik yang menerima 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:

Jika implementasi IFormatProvider tidak secara eksplisit diberikan ke metode pemformatan, objek CultureInfo yang dikembalikan oleh properti CultureInfo.CurrentCulture yang mewakili budaya saat ini akan 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, metode Decimal.ToString(IFormatProvider) meminta objek NumberFormatInfo untuk memberikan informasi pemformatan, sedangkan metode String.Format(IFormatProvider, String, Object[]) meminta objek NumberFormatInfo dan DateTimeFormatInfo serta implementasi ICustomFormatter.

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

Jika sebuah implementasi tidak secara eksplisit disediakan dalam pemanggilan metode pemformatan numerik, maka metode tersebut akan memanggil metode IFormatProvider, yang mengembalikan objek CultureInfo.CurrentCulture.GetFormat 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 pemanggilan metode berikut ke metode Decimal.ToString() default atau tanpa parameter, nilai instance Decimal diformat menggunakan penentu format umum ("G") serta 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 "0" dan "#" menyisipkan simbol dalam string hasil yang ditentukan oleh properti NumberFormatInfo. 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.

Spesifikator 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, guna menentukan simbol tanda negatif pada 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" (spesifikator 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) None.
"." (penentu format kustom titik desimal) NumberDecimalSeparator, untuk menentukan simbol pemisah desimal.
"," (spesifikasi 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" (spesifikator format kustom notasi eksponensial) NegativeSign, guna menentukan simbol tanda negatif pada 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 nilai Single, Double, dan NaN, PositiveInfinity, dan NegativeInfinity, string hasil masing-masing terdiri dari simbol yang ditentukan oleh properti NaNSymbol, PositiveInfinitySymbol, dan NegativeInfinitySymbol.

Mengubah properti NumberFormatInfo

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

  1. Buat salinan baca/tulis dari objek NumberFormatInfo yang 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 argumen IFormatProvider dalam panggilan metode pemformatan.

Note

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 di 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

Memparsing melibatkan konversi representasi teks dari angka menjadi bilangan. 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. Jika nilai NumberStyles tidak disediakan dalam panggilan metode, maka nilai defaultnya adalah NumberStyles yang menyertakan flag Float dan AllowThousands. Ini berarti string yang diurai dapat menyertakan simbol grup, pemisah desimal, tanda negatif, dan karakter spasi putih, atau bisa 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. Jika objek NumberFormatInfo tidak disediakan, defaultnya adalah NumberFormatInfo untuk budaya yang digunakan 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 pemrosesan string yang peka terhadap budaya. Ini mencoba mengurai string yang mencakup ribuan pemisah dengan menggunakan konvensi budaya en-US, 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 ruang putih sebagai pemisah grup dan koma sebagai pemisah desimal gagal diurai dalam budaya en-US 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($"'{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)

Penguraian umumnya terjadi dalam dua konteks:

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

  • Operasi ini dirancang untuk mengonversi kembali nilai numerik; yaitu, mendeserialisasi nilai numerik yang sebelumnya diserialisasikan sebagai string.

Bagian berikut membahas kedua operasi ini secara lebih rinci.

Mengurai string pengguna

Ketika mengurai input string numerik yang dimasukkan oleh pengguna, Anda harus selalu membuat instans objek NumberFormatInfo yang mencerminkan pengaturan budaya pengguna. Untuk menghasilkan objek NumberFormatInfo yang mencerminkan kustomisasi pengguna, silakan merujuk ke bagian Data Dinamis.

Contoh berikut mengilustrasikan perbedaan antara operasi penguraian yang mencerminkan pengaturan budaya pengguna dan yang tidak. Dalam hal ini, budaya sistem default 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 default en-US. Saat pengguna memasukkan string yang mencerminkan pengaturan pengguna, dan string tersebut diurai oleh objek NumberFormatInfo yang juga mencerminkan pengaturan pengguna (penggantian), operasi penguraian akan menghasilkan hasil yang benar. Namun, ketika string diurai oleh objek NumberFormatInfo yang mencerminkan pengaturan budaya en-US standar, objek tersebut salah mengira simbol koma sebagai pemisah kelompok 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($"{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

Serialisasi dan deserialisasi data numerik

Ketika data numerik diserialisasikan dalam format string dan kemudian dideserialisasi dan diurai, string harus dihasilkan dan diurai dengan menggunakan konvensi budaya baku. Operasi pemformatan dan penguraian tidak boleh mencerminkan konvensi budaya tertentu. Jika pengaturan spesifik budaya digunakan, portabilitas data sangat terbatas; data tersebut dapat berhasil dideserialisasi hanya pada utas yang pengaturan spesifik budayanya identik dengan utas di mana data itu diserialisasikan. 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 thread saat ini menggunakan pengaturan khusus dari budaya en-US. Data kemudian diurai oleh utas yang menggunakan pengaturan khusus budaya dari budaya pt-BR. Dalam kasus ini, meskipun setiap operasi penguraian berhasil, data tidak berhasil diproses bolak-balik dan terjadi kerusakan data. Dalam kasus lain, operasi penguraian dapat gagal dan dapat melemparkan pengecualian FormatException.

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

Example

  The following example shows how to retrieve a <xref:System.Globalization.NumberFormatInfo> object for a corresponding <xref:System.Globalization.CultureInfo> object, and use the retrieved object to query number formatting information for the particular culture.

  :::code language="csharp" source="~/snippets/csharp/System.Globalization/NumberFormatInfo/Overview/NumberFormatInfo.cs" id="Snippet1":::
  :::code language="vb" source="~/snippets/visualbasic/System.Globalization/NumberFormatInfo/Overview/numberformatinfo.vb" id="Snippet1":::

Konstruktor

Nama Deskripsi
NumberFormatInfo()

Menginisialisasi instans baru yang dapat ditulis dari NumberFormatInfo kelas yang independen budaya (invarian).

Properti

Nama Deskripsi
CurrencyDecimalDigits

Mendapatkan atau mengatur jumlah tempat desimal yang akan digunakan dalam nilai mata uang.

CurrencyDecimalSeparator

Mendapatkan atau mengatur string yang akan digunakan sebagai pemisah desimal dalam nilai mata uang.

CurrencyGroupSeparator

Mendapatkan atau mengatur string yang memisahkan grup digit di sebelah kiri desimal dalam nilai mata uang.

CurrencyGroupSizes

Mendapatkan atau mengatur jumlah digit di setiap grup di sebelah kiri desimal dalam nilai mata uang.

CurrencyNegativePattern

Mendapatkan atau mengatur pola format untuk nilai mata uang negatif.

CurrencyPositivePattern

Mendapatkan atau mengatur pola format untuk nilai mata uang positif.

CurrencySymbol

Mendapatkan atau mengatur string yang akan digunakan sebagai simbol mata uang.

CurrentInfo

Mendapatkan baca-saja NumberFormatInfo yang memformat nilai berdasarkan budaya saat ini.

DigitSubstitution

Mendapatkan atau mengatur nilai yang menentukan bagaimana antarmuka pengguna grafis menampilkan bentuk digit.

InvariantInfo

Mendapatkan objek baca-saja NumberFormatInfo yang independen budaya (invarian).

IsReadOnly

Mendapatkan nilai yang menunjukkan apakah objek ini NumberFormatInfo bersifat baca-saja.

NaNSymbol

Mendapatkan atau mengatur string yang mewakili nilai IEEE NaN (bukan angka).

NativeDigits

Mendapatkan atau mengatur array string digit asli yang setara dengan digit Barat 0 hingga 9.

NegativeInfinitySymbol

Mendapatkan atau mengatur string yang mewakili tak terbatas negatif.

NegativeSign

Mendapatkan atau mengatur string yang menunjukkan bahwa angka terkait negatif.

NumberDecimalDigits

Mendapatkan atau mengatur jumlah tempat desimal yang akan digunakan dalam nilai numerik.

NumberDecimalSeparator

Mendapatkan atau mengatur string yang akan digunakan sebagai pemisah desimal dalam nilai numerik.

NumberGroupSeparator

Mendapatkan atau mengatur string yang memisahkan grup digit di sebelah kiri desimal dalam nilai numerik.

NumberGroupSizes

Mendapatkan atau mengatur jumlah digit di setiap grup di sebelah kiri desimal dalam nilai numerik.

NumberNegativePattern

Mendapatkan atau mengatur pola format untuk nilai numerik negatif.

PercentDecimalDigits

Mendapatkan atau mengatur jumlah tempat desimal yang akan digunakan dalam nilai persen.

PercentDecimalSeparator

Mendapatkan atau mengatur string yang akan digunakan sebagai pemisah desimal dalam nilai persen.

PercentGroupSeparator

Mendapatkan atau mengatur string yang memisahkan grup digit di sebelah kiri desimal dalam nilai persen.

PercentGroupSizes

Mendapatkan atau mengatur jumlah digit di setiap grup di sebelah kiri desimal dalam nilai persen.

PercentNegativePattern

Mendapatkan atau mengatur pola format untuk nilai persentase negatif.

PercentPositivePattern

Mendapatkan atau mengatur pola format untuk nilai persentase positif.

PercentSymbol

Mendapatkan atau mengatur string yang akan digunakan sebagai simbol persen.

PerMilleSymbol

Mendapatkan atau mengatur string yang akan digunakan sebagai simbol per mille.

PositiveInfinitySymbol

Mendapatkan atau mengatur string yang mewakili tak terbatas positif.

PositiveSign

Mendapatkan atau mengatur string yang menunjukkan bahwa angka terkait positif.

Metode

Nama Deskripsi
Clone()

Membuat salinan objek yang NumberFormatInfo dangkal.

Equals(Object)

Menentukan apakah objek yang ditentukan sama dengan objek saat ini.

(Diperoleh dari Object)
GetFormat(Type)

Mendapatkan objek dari jenis yang ditentukan yang menyediakan layanan pemformatan angka.

GetHashCode()

Berfungsi sebagai fungsi hash default.

(Diperoleh dari Object)
GetInstance(IFormatProvider)

Mendapatkan yang NumberFormatInfo terkait dengan yang ditentukan IFormatProvider.

GetType()

Mendapatkan Type instans saat ini.

(Diperoleh dari Object)
MemberwiseClone()

Membuat salinan dangkal dari Objectsaat ini.

(Diperoleh dari Object)
ReadOnly(NumberFormatInfo)

Mengembalikan pembungkus NumberFormatInfo baca-saja.

ToString()

Mengembalikan string yang mewakili objek saat ini.

(Diperoleh dari Object)

Berlaku untuk

Lihat juga