Menguraikan string numerik di .NET
Semua jenis numerik memiliki dua metode penguraian statis, Parse
dan TryParse
, yang dapat Anda gunakan untuk mengonversi representasi string dari angka menjadi jenis numerik. Metode ini memungkinkan Anda mengurai string yang dihasilkan dengan menggunakan string format yang didokumentasikan dalam String Format Numerik Standar dan String Format Numerik Kustom. Secara default, metode Parse
dan TryParse
dapat berhasil mengonversi string yang berisi digit desimal integral hanya ke nilai bilangan bulat. Mereka dapat berhasil mengonversi string yang berisi digit desimal integral dan pecahan, pemisah grup, dan pemisah desimal menjadi nilai floating-point. Metode Parse
melempar pengecualian jika operasi gagal, sedangkan metode TryParse
mengembalikan false
.
Catatan
Mulai dari .NET 7, jenis numerik di .NET juga mengimplementasikan System.IParsable<TSelf> antarmuka, yang menentukan IParsable<TSelf>.Parse metode dan IParsable<TSelf>.TryParse .
Mengurai dan memformat penyedia
Biasanya, representasi string dari nilai numerik berbeda menurut kultur. Elemen string numerik, seperti simbol mata uang, pemisah grup (atau ribuan), dan pemisah desimal, semuanya bervariasi menurut kultur. Metode penguraian baik secara implisit atau eksplisit menggunakan penyedia format yang mengenali variasi spesifik kultur ini. Jika tidak ada penyedia format yang ditentukan dalam panggilan ke metode Parse
atau TryParse
, penyedia format yang terkait dengan kultur saat ini (objek NumberFormatInfo yang dikembalikan oleh properti NumberFormatInfo.CurrentInfo) digunakan.
Penyedia format diwakili oleh implementasi IFormatProvider. Antarmuka ini memiliki satu anggota, metode GetFormat, yang parameter tunggalnya adalah objek Type yang mewakili jenis yang akan diformat. Metode ini mengembalikan objek yang menyediakan informasi pemformatan. .NET mendukung dua implementasi IFormatProvider berikut untuk mengurai string numerik:
Objek CultureInfo yang metodenya CultureInfo.GetFormat mengembalikan objek NumberFormatInfo yang menyediakan informasi pemformatan khusus kultur.
Objek NumberFormatInfo yang metodenya NumberFormatInfo.GetFormat mengembalikan dirinya sendiri.
Contoh berikut mencoba mengonversi setiap string dalam larik menjadi nilai Double. Pertama-tama itu mencoba mengurai string dengan menggunakan penyedia format yang mencerminkan konvensi kultur bahasa Inggris (Amerika Serikat). Jika operasi ini melempar FormatException, operasi ini mencoba mengurai string dengan menggunakan penyedia format yang mencerminkan konvensi kultur bahasa Prancis (Prancis).
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
string[] values = { "1,304.16", "$1,456.78", "1,094", "152",
"123,45 €", "1 304,16", "Ae9f" };
double number;
CultureInfo culture = null;
foreach (string value in values) {
try {
culture = CultureInfo.CreateSpecificCulture("en-US");
number = Double.Parse(value, culture);
Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number);
}
catch (FormatException) {
Console.WriteLine("{0}: Unable to parse '{1}'.",
culture.Name, value);
culture = CultureInfo.CreateSpecificCulture("fr-FR");
try {
number = Double.Parse(value, culture);
Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number);
}
catch (FormatException) {
Console.WriteLine("{0}: Unable to parse '{1}'.",
culture.Name, value);
}
}
Console.WriteLine();
}
}
}
// The example displays the following output:
// en-US: 1,304.16 --> 1304.16
//
// en-US: Unable to parse '$1,456.78'.
// fr-FR: Unable to parse '$1,456.78'.
//
// en-US: 1,094 --> 1094
//
// en-US: 152 --> 152
//
// en-US: Unable to parse '123,45 €'.
// fr-FR: Unable to parse '123,45 €'.
//
// en-US: Unable to parse '1 304,16'.
// fr-FR: 1 304,16 --> 1304.16
//
// en-US: Unable to parse 'Ae9f'.
// fr-FR: Unable to parse 'Ae9f'.
Imports System.Globalization
Module Example
Public Sub Main()
Dim values() As String = {"1,304.16", "$1,456.78", "1,094", "152",
"123,45 €", "1 304,16", "Ae9f"}
Dim number As Double
Dim culture As CultureInfo = Nothing
For Each value As String In values
Try
culture = CultureInfo.CreateSpecificCulture("en-US")
number = Double.Parse(value, culture)
Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number)
Catch e As FormatException
Console.WriteLine("{0}: Unable to parse '{1}'.",
culture.Name, value)
culture = CultureInfo.CreateSpecificCulture("fr-FR")
Try
number = Double.Parse(value, culture)
Console.WriteLine("{0}: {1} --> {2}", culture.Name, value, number)
Catch ex As FormatException
Console.WriteLine("{0}: Unable to parse '{1}'.",
culture.Name, value)
End Try
End Try
Console.WriteLine()
Next
End Sub
End Module
' The example displays the following output:
' en-US: 1,304.16 --> 1304.16
'
' en-US: Unable to parse '$1,456.78'.
' fr-FR: Unable to parse '$1,456.78'.
'
' en-US: 1,094 --> 1094
'
' en-US: 152 --> 152
'
' en-US: Unable to parse '123,45 €'.
' fr-FR: Unable to parse '123,45 €'.
'
' en-US: Unable to parse '1 304,16'.
' fr-FR: 1 304,16 --> 1304.16
'
' en-US: Unable to parse 'Ae9f'.
' fr-FR: Unable to parse 'Ae9f'.
Nilai Penguraian dan NumberStyles
Elemen gaya (seperti spasi kosong, pemisah grup, dan pemisah desimal) yang dapat ditangani operasi penguraian ditentukan oleh nilai enumerasi NumberStyles. Secara default, string yang mewakili nilai bilangan bulat diurai dengan menggunakan nilai NumberStyles.Integer, yang hanya mengizinkan digit numerik, spasi kosong di depan dan di belakang, dan tanda di depan. String yang mewakili nilai floating-point diurai menggunakan kombinasi nilai NumberStyles.Float dan NumberStyles.AllowThousands; gaya komposit ini mengizinkan digit desimal bersama dengan spasi kosong di depan dan di belakang, tanda di depan, pemisah desimal, pemisah grup, dan eksponen. Dengan memanggil kelebihan beban metode Parse
atau TryParse
yang menyertakan parameter jenis NumberStyles dan mengatur satu atau beberapa bendera NumberStyles, Anda dapat mengontrol elemen gaya yang dapat ada dalam string agar operasi penguraian berhasil.
Misalnya, string yang berisi pemisah grup tidak dapat dikonversi ke Int32 nilai dengan menggunakan Int32.Parse(String) metode . Namun, konversi berhasil jika Anda menggunakan bendera NumberStyles.AllowThousands, seperti yang diilustrasikan contoh berikut.
using System;
using System.Globalization;
public class Example
{
public static void Main()
{
string value = "1,304";
int number;
IFormatProvider provider = CultureInfo.CreateSpecificCulture("en-US");
if (Int32.TryParse(value, out number))
Console.WriteLine("{0} --> {1}", value, number);
else
Console.WriteLine("Unable to convert '{0}'", value);
if (Int32.TryParse(value, NumberStyles.Integer | NumberStyles.AllowThousands,
provider, out number))
Console.WriteLine("{0} --> {1}", value, number);
else
Console.WriteLine("Unable to convert '{0}'", value);
}
}
// The example displays the following output:
// Unable to convert '1,304'
// 1,304 --> 1304
Imports System.Globalization
Module Example
Public Sub Main()
Dim value As String = "1,304"
Dim number As Integer
Dim provider As IFormatProvider = CultureInfo.CreateSpecificCulture("en-US")
If Int32.TryParse(value, number) Then
Console.WriteLine("{0} --> {1}", value, number)
Else
Console.WriteLine("Unable to convert '{0}'", value)
End If
If Int32.TryParse(value, NumberStyles.Integer Or NumberStyles.AllowThousands,
provider, number) Then
Console.WriteLine("{0} --> {1}", value, number)
Else
Console.WriteLine("Unable to convert '{0}'", value)
End If
End Sub
End Module
' The example displays the following output:
' Unable to convert '1,304'
' 1,304 --> 1304
Peringatan
Operasi penguraian selalu menggunakan konvensi pemformatan kultur tertentu. Jika Anda tidak menentukan kultur dengan melewatkan objek CultureInfo atau NumberFormatInfo, kultur yang terkait dengan utas saat ini akan digunakan.
Tabel berikut mencantumkan anggota enumerasi NumberStyles dan menjelaskan efek yang mereka miliki pada operasi penguraian.
Nilai NumberStyles | Efek pada string yang akan diurai |
---|---|
NumberStyles.None | Hanya digit numerik yang diizinkan. |
NumberStyles.AllowDecimalPoint | Pemisah desimal dan digit pecahan diizinkan. Untuk nilai bilangan bulat, hanya nol yang diizinkan sebagai digit pecahan. Pemisah desimal yang valid ditentukan oleh properti NumberFormatInfo.NumberDecimalSeparator atau NumberFormatInfo.CurrencyDecimalSeparator. |
NumberStyles.AllowExponent | Karakter "e" atau "E" dapat digunakan untuk mengindikasikan notasi eksponensial. Untuk informasi selengkapnya, lihat NumberStyles . |
NumberStyles.AllowLeadingWhite | Spasi kosong di depan diizinkan. |
NumberStyles.AllowTrailingWhite | Spasi kosong di belakang diizinkan. |
NumberStyles.AllowLeadingSign | Tanda positif atau negatif dapat mendahului digit numerik. |
NumberStyles.AllowTrailingSign | Tanda positif atau negatif dapat mengikuti digit numerik. |
NumberStyles.AllowParentheses | Tanda kurung dapat digunakan untuk menunjukkan nilai negatif. |
NumberStyles.AllowThousands | Pemisah grup diizinkan. Karakter pemisah grup ditentukan oleh properti NumberFormatInfo.NumberGroupSeparator atau NumberFormatInfo.CurrencyGroupSeparator. |
NumberStyles.AllowCurrencySymbol | Simbol mata uang diizinkan. Simbol mata uang ditentukan oleh properti NumberFormatInfo.CurrencySymbol. |
NumberStyles.AllowHexSpecifier | String yang akan diurai ditafsirkan sebagai bilangan heksadesimal. Ini dapat mencakup digit heksadesimal 0-9, A-F, dan a-f. Bendera ini hanya dapat digunakan untuk mengurai nilai bilangan bulat. |
Selain itu, enumerasi NumberStyles menyediakan gaya komposit berikut, yang mencakup beberapa bendera NumberStyles.
Penguraian dan Digit Unicode
Standar Unicode mendefinisikan titik kode untuk digit dalam berbagai sistem penulisan. Misalnya, poin kode dari U +0030 hingga U+0039 mewakili digit Latin dasar 0 hingga 9, poin kode dari U+09E6 hingga U+09EF mewakili angka Bangla 0 hingga 9, dan poin kode dari U+FF10 hingga U+FF19 mewakili digit Fullwidth 0 hingga 9. Namun, satu-satunya digit numerik yang dikenali oleh metode penguraian adalah digit Latin dasar 0-9 dengan poin kode dari U +0030 hingga U+0039. Jika metode penguraian numerik diteruskan string yang berisi digit lain, metode akan melempar FormatException.
Contoh berikut menggunakan metode Int32.Parse untuk mengurai string yang terdiri dari digit dalam sistem penulisan yang berbeda. Seperti yang ditunjukkan oleh output dari contoh, upaya untuk mengurai digit Latin dasar berhasil, tetapi upaya untuk mengurai digit Fullwidth, Arab-Indic, dan Bangla gagal.
using System;
public class Example
{
public static void Main()
{
string value;
// Define a string of basic Latin digits 1-5.
value = "\u0031\u0032\u0033\u0034\u0035";
ParseDigits(value);
// Define a string of Fullwidth digits 1-5.
value = "\uFF11\uFF12\uFF13\uFF14\uFF15";
ParseDigits(value);
// Define a string of Arabic-Indic digits 1-5.
value = "\u0661\u0662\u0663\u0664\u0665";
ParseDigits(value);
// Define a string of Bangla digits 1-5.
value = "\u09e7\u09e8\u09e9\u09ea\u09eb";
ParseDigits(value);
}
static void ParseDigits(string value)
{
try {
int number = Int32.Parse(value);
Console.WriteLine("'{0}' --> {1}", value, number);
}
catch (FormatException) {
Console.WriteLine("Unable to parse '{0}'.", value);
}
}
}
// The example displays the following output:
// '12345' --> 12345
// Unable to parse '12345'.
// Unable to parse '١٢٣٤٥'.
// Unable to parse '১২৩৪৫'.
Module Example
Public Sub Main()
Dim value As String
' Define a string of basic Latin digits 1-5.
value = ChrW(&h31) + ChrW(&h32) + ChrW(&h33) + ChrW(&h34) + ChrW(&h35)
ParseDigits(value)
' Define a string of Fullwidth digits 1-5.
value = ChrW(&hff11) + ChrW(&hff12) + ChrW(&hff13) + ChrW(&hff14) + ChrW(&hff15)
ParseDigits(value)
' Define a string of Arabic-Indic digits 1-5.
value = ChrW(&h661) + ChrW(&h662) + ChrW(&h663) + ChrW(&h664) + ChrW(&h665)
ParseDigits(value)
' Define a string of Bangla digits 1-5.
value = ChrW(&h09e7) + ChrW(&h09e8) + ChrW(&h09e9) + ChrW(&h09ea) + ChrW(&h09eb)
ParseDigits(value)
End Sub
Sub ParseDigits(value As String)
Try
Dim number As Integer = Int32.Parse(value)
Console.WriteLine("'{0}' --> {1}", value, number)
Catch e As FormatException
Console.WriteLine("Unable to parse '{0}'.", value)
End Try
End Sub
End Module
' The example displays the following output:
' '12345' --> 12345
' Unable to parse '12345'.
' Unable to parse '١٢٣٤٥'.
' Unable to parse '১২৩৪৫'.