Numerikus sztringek elemzése a .NET-ben
Minden numerikus típus két statikus elemzési módszerrel rendelkezik, Parse
és TryParse
a szám sztringképének numerikus típussá alakításához használható. Ezekkel a módszerekkel elemezheti a standard numerikus formátumú sztringekben és az egyéni numerikus formátumú sztringekben dokumentált formázási sztringekkel előállított sztringeket. A metódusok alapértelmezés TryParse
szerint Parse
csak egész számértékekké konvertálhatják az integrál tizedesjegyeket tartalmazó sztringeket. Sikeresen konvertálhatják az integrál és tört tizedesjegyeket, csoportelválasztókat és tizedesjeleket tartalmazó sztringeket lebegőpontos értékekké. A Parse
metódus kivételt ad, ha a művelet meghiúsul, míg a TryParse
metódus ad vissza false
.
Feljegyzés
A .NET 7-től kezdve a .NET numerikus típusai is implementálják az System.IParsable<TSelf> interfészt, amely meghatározza a metódusokat és IParsable<TSelf>.TryParse a IParsable<TSelf>.Parse metódusokat.
Szolgáltatók elemzése és formázása
A numerikus értékek sztring-ábrázolása általában kultúránként eltérő. A numerikus sztringek elemei, például a pénznemszimbólumok, a csoportelválasztók és a tizedeselválasztók kultúránként eltérőek. Az elemzési módszerek implicit módon vagy explicit módon olyan formátumszolgáltatót használnak, amely felismeri ezeket a kultúraspecifikus változatokat. Ha a metódus vagy metódus Parse
hívásában nincs megadva formátumszolgáltató, a rendszer az aktuális kultúrához (a NumberFormatInfo tulajdonság által visszaadott NumberFormatInfo.CurrentInfo objektumhoz) társított formátumszolgáltatót TryParse
használja.
A formátumszolgáltatót egy IFormatProvider implementáció képviseli. Ennek az interfésznek egyetlen tagja van, a GetFormat metódus, amelynek egyetlen paramétere egy Type olyan objektum, amely a formázandó típust jelöli. Ez a metódus a formázási információkat biztosító objektumot adja vissza. A .NET a következő két IFormatProvider implementációt támogatja numerikus sztringek elemzéséhez:
Olyan CultureInfo objektum, amelynek CultureInfo.GetFormat metódusa egy NumberFormatInfo olyan objektumot ad vissza, amely kultúraspecifikus formázási információkat biztosít.
Egy NumberFormatInfo objektum, amelynek NumberFormatInfo.GetFormat metódusa visszaadja magát.
Az alábbi példa egy tömb minden sztringjének értékét próbálja átalakítani Double . Először az angol (Egyesült Államok) kultúra konvencióinak megfelelő formátumszolgáltatóval próbálja elemezni a sztringet. Ha ez a művelet egy FormatException, akkor a francia (Franciaország) kultúra konvencióit tükröző formátumszolgáltatóval próbálja elemezni a sztringet.
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'.
Elemzési és NumberStyles-értékek
Az elemzési művelet által kezelhető stíluselemeket (például a szóközt, a csoportelválasztót és a tizedeselválasztót) enumerálási NumberStyles érték határozza meg. Alapértelmezés szerint az egész számértékeket ábrázoló sztringeket az érték alapján elemzi a NumberStyles.Integer rendszer, amely csak numerikus számjegyeket, kezdő és záró szóközöket, valamint egy kezdőjelet engedélyez. A lebegőpontos értékeket ábrázoló sztringek az értékek és NumberStyles.AllowThousands az NumberStyles.Float értékek kombinációjával vannak elemezve. Ez az összetett stílus lehetővé teszi a tizedesjegyek, valamint a kezdő és záró szóköz, a kezdőjel, a tizedeselválasztó, a csoportelválasztó és a kitevő használatát. A típusparamétert NumberStyles tartalmazó vagy TryParse
metódus túlterhelésének Parse
meghívásával és egy vagy több NumberStyles jelölő beállításával szabályozhatja az elemzési művelet sztringjében található stíluselemeket a sikeresség érdekében.
Egy csoportelválasztót tartalmazó sztring például nem konvertálható értékké Int32 a Int32.Parse(String) metódus használatával. Az átalakítás azonban sikeres lesz, ha a jelölőt NumberStyles.AllowThousands használja, ahogy az alábbi példa is mutatja.
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
Figyelmeztetés
Az elemzési művelet mindig egy adott kultúra formázási konvencióit használja. Ha nem ad meg egy kultúrát egy vagy NumberFormatInfo több CultureInfo objektum átadásával, a rendszer az aktuális szálhoz társított kultúrát használja.
Az alábbi táblázat felsorolja az NumberStyles enumerálás tagjait, és ismerteti az elemzési műveletre gyakorolt hatást.
NumberStyles érték | Az elemezni kívánt sztring effektusa |
---|---|
NumberStyles.None | Csak numerikus számjegyek engedélyezettek. |
NumberStyles.AllowDecimalPoint | A tizedesjelek és a törtjegyek megengedettek. Egész számértékek esetén csak a nullát lehet tört számjegyként engedélyezni. Az érvényes tizedesjeleket a NumberFormatInfo.NumberDecimalSeparatorNumberFormatInfo.CurrencyDecimalSeparator tulajdonság határozza meg. |
NumberStyles.AllowExponent | Az "e" vagy "E" karakter az exponenciális jelölés jelzésére használható. További információ: NumberStyles. |
NumberStyles.AllowLeadingWhite | A vezető szabad terület engedélyezett. |
NumberStyles.AllowTrailingWhite | A záró fehér terület engedélyezett. |
NumberStyles.AllowLeadingSign | A pozitív vagy negatív jel megelőzheti a numerikus számjegyeket. |
NumberStyles.AllowTrailingSign | A pozitív vagy negatív jelek numerikus számjegyeket követhetnek. |
NumberStyles.AllowParentheses | A zárójelek a negatív értékek jelzésére használhatók. |
NumberStyles.AllowThousands | A csoportelválasztó engedélyezett. A csoportelválasztó karaktert a NumberFormatInfo.NumberGroupSeparator tulajdonság határozza NumberFormatInfo.CurrencyGroupSeparator meg. |
NumberStyles.AllowCurrencySymbol | A pénznem szimbóluma engedélyezett. A pénznemszimbólumot a NumberFormatInfo.CurrencySymbol tulajdonság határozza meg. |
NumberStyles.AllowHexSpecifier | Az elemezni kívánt sztring hexadecimális számként van értelmezve. Tartalmazhat hexadecimális számjegyeket 0-9, A-F és a-f. Ez a jelző csak egész számértékek elemzésére használható. |
Emellett az enumerálás a NumberStyles következő összetett stílusokat biztosítja, amelyek több NumberStyles jelölőt is tartalmaznak.
Elemzés és Unicode-számjegyek
A Unicode szabvány kódpontokat határoz meg a különböző írási rendszerekben lévő számjegyekhez. Az U+0030 és az U+0039 közötti kódpontok például a 0 és 9 közötti alapvető latin számjegyeket, az U+09E6 és az U+09EF közötti kódpontokat a Bangla 0-tól 9-ig, az U+FF10-től az U+FF19-ig pedig a 0–9. teljeswidth számjegyeket jelölik. Az elemzési módszerekkel felismert numerikus számjegyek azonban csak az alapszintű latin számjegyek 0-9, az U+0030 és az U+0039 kódpontokkal. Ha egy numerikus elemzési metódus olyan sztringet ad át, amely bármilyen más számjegyet tartalmaz, a metódus egy FormatException.
Az alábbi példa a metódus használatával elemzi a Int32.Parse különböző írási rendszerekben lévő számjegyekből álló sztringeket. Ahogy a példa kimenete is mutatja, az alapszintű latin számjegyek elemzésére tett kísérlet sikeres, de a Fullwidth, arab-ind és Bangla számjegyek elemzése sikertelen.
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 '১২৩৪৫'.