Formatieren von numerischen Daten für eine bestimmte Kultur
Die NumberFormatInfo-Klasse legt fest, wie Währungen, Dezimaltrennzeichen und andere numerische Symbole basierend auf der Kultur formatiert und angezeigt werden. Die Dezimalzahl 10000,50 wird beispielsweise für die Kultur "en-US" (Englisch (USA)) als 10,000.50 und für die Kultur "de-DE" (Deutsch (Deutschland)) als 10.000,50 angezeigt.
Ein NumberFormatInfo-Objekt kann nicht für eine neutrale Kultur, sondern nur für eine bestimmte Kultur bzw. die invariante Kultur erstellt werden. Eine neutrale Kultur stellt nicht genügend Informationen zur Verfügung, damit das richtige numerische Format angezeigt werden kann. Wenn die Anwendung versucht, mit einer neutralen Kultur ein NumberFormatInfo-Objekt zu erstellen, wird eine Ausnahme ausgelöst.
Im folgenden Codebeispiel wird eine Ganzzahl angezeigt, indem das standardmäßige NumberFormatInfo-Währungsformat ("c") für die aktuelle Kultur verwendet wird.
Imports System
Imports System.Globalization
Public Class TestClass
Public Shared Sub Main()
Dim i As Integer = 100
' Creates a CultureInfo for English in Belize.
Dim bz As New CultureInfo("en-BZ")
' Displays i formatted as currency for the bz.
Console.WriteLine(i.ToString("c", bz))
' Creates a CultureInfo for English in the U.S.
Dim us As New CultureInfo("en-US")
' Displays i formatted as currency for us.
Console.WriteLine(i.ToString("c", us))
' Creates a CultureInfo for Danish in Denmark.
Dim dk As New CultureInfo("da-DK")
' Displays i formatted as currency for dk.
Console.WriteLine(i.ToString("c", dk))
End Sub
End Class
using System;
using System.Globalization;
public class TestClass
{
public static void Main()
{
int i = 100;
// Creates a CultureInfo for English in Belize.
CultureInfo bz = new CultureInfo("en-BZ");
// Displays i formatted as currency for the bz.
Console.WriteLine(i.ToString("c", bz));
// Creates a CultureInfo for English in the U.S.
CultureInfo us = new CultureInfo("en-US");
// Display i formatted as currency for us.
Console.WriteLine(i.ToString("c", us));
// Creates a CultureInfo for Danish in Denmark.
CultureInfo dk = new CultureInfo("da-DK");
// Displays i formatted as currency for dk.
Console.WriteLine(i.ToString("c", dk));
}
}
Dieser Code erzeugt die folgende Ausgabe:
BZ$100.00
$100.00
kr100,00
Währungsformatierung für Euroländer
Sowohl die CultureInfo-Klasse als auch die RegionInfo-Klasse enthalten Informationen zu Währungen. Für jede Kultur wird nur eine Währung angegeben. Der Euro ist die offizielle Währung von Belgien, Deutschland, Spanien, Frankreich, Irland, Italien, Luxemburg, Niederlande, Österreich, Portugal, Finnland und Griechenland. Seit dem 1. Januar 2002 werden die Euroscheine und -münzen in diesen Ländern verwendet. Aus diesem Grund wurde in .NET Framework und Microsoft Windows XP für diese zwölf Länder das Eurosymbol als Standardwährungssymbol festgelegt. In älteren Windows-Versionen wird das Standardwährungssymbol noch auf die lokale Währung des jeweiligen Lands festgelegt.
Die Betriebssystemunterschiede bezüglich der Standardwährungssymbole dürfen nicht außer Acht gelassen werden. Unter Windows können Benutzer über die Regions- und Sprachoptionen in der Systemsteuerung einige Werte überschreiben, die der Standardkultur des Betriebssystems zugeordnet sind. Beispielsweise kann die Währung mit einem anderen Symbol als dem Standardsymbol für die Kultur angezeigt werden. In Windows Forms- und Konsolenanwendungen wird das Standardwährungssymbol verwendet, das für das Betriebssystem des Benutzers angegeben wurde. Wenn ein Benutzer in einem Land bzw. einer Region, in dem der Euro die offizielle Währung ist, mit einer alten Version von Windows arbeitet, in der die Währungseinstellung nicht über die Regions- und Sprachoptionen in der Systemsteuerung auf den Euro aktualisiert wurde, stimmt die Standardwährungseinstellung nicht. ASP.NET-Anwendungen und in ASP.NET erstellte XML-Webdienstanwendungen werden als Systemdienste und nicht für bestimmte Benutzer ausgeführt. Daher können sich die Standardergebnisse von den Ergebnissen unterscheiden, die von Windows Forms- und Konsolenanwendungen zurückgegeben werden.
Sie sollten daher Code schreiben, der die Standardwährungseinstellungen von .NET Framework für eine Kultur verwendet, um Unterschiede zwischen der Anwendung und dem Betriebssystem zu vermeiden und eine einheitliche Währungsformatierung zu gewährleisten. Die Anwendung sollte ein CultureInfo-Objekt mit einer der Konstruktorüberladungen erstellen, die einen useUserOverride-Parameter akzeptieren, und diesen Parameter auf false festlegen. Diese Einstellung bewirkt, dass die Standardwährungseinstellungen für das Betriebssystem des Benutzers durch die richtigen .NET Framework-Standardeinstellungen überschrieben werden.
Im folgenden XML-Webdienstcode legt die UserLocalSetting-XML-Webdienstmethode die CurrentCulture-Eigenschaft auf "fr-FR" (Französisch (Frankreich)) fest und ruft eine als Währung formatierte Ganzzahl ab. Aufgrund der Unterschiede im Betriebssystem ist nicht sicher, ob das Eurosymbol oder das Symbol "F" verwendet wird. Die OverrideUserSetting-XML-Webdienstmethode legt die CurrentCulture-Eigenschaft auf "fr-FR" fest, indem der CultureInfo-Konstruktor verwendet wird, der einen useUserOverride-Parameter mit der Einstellung false akzeptiert. Diese Methode ruft eine als Währung formatierte Ganzzahl ab. In diesem Fall wird gewährleistet, dass das Eurosymbol verwendet wird, da dies die .NET Framework-Standardeinstellung ist.
<%@ WebService Language="VB" Class="userOverrideSample" %>
Imports System
Imports System.Web.Services
Imports System.Globalization
Imports System.Threading
Public Class userOverrideSample
<WebMethod> _
Public Function UserLocalSetting() As String
Dim i As Integer = 100
' Sets the CurrentCulture to French in France.
Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR")
' Displays i formatted as currency for the CurrentCulture.
' Due to operating system differences, you cannot be sure what currency
' symbol will be used.
return (i.ToString("c"))
End Function
<WebMethod> _
Public Function OverrideUserSetting() As String
Dim i As Integer = 100
' Sets the CurrentCulture to French in France.
' Uses the CultureInfo constructor that takes a
' useUserOverride parameter.
' Sets the useUserOverride value to false.
Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR", _
false)
' Displays i formatted as currency for the CurrentCulture.
' This will override any user settings and display the euro symbol.
return (i.ToString("c"))
End Function
End Class
<%@ WebService Language="c#" Class="userOverrideSample" %>
using System;
using System.Web.Services;
using System.Globalization;
using System.Threading;
public class userOverrideSample
{
[WebMethod]
public String UserLocalSetting()
{
int i = 100;
// Sets the CurrentCulture to French in France.
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
// Displays i formatted as currency for the CurrentCulture.
// Due to operating system differences, you cannot be sure what currency
// symbol will be used.
return (i.ToString("c"));
}
[WebMethod]
public String OverrideUserSetting()
{
int i = 100;
// Sets the CurrentCulture to French in France.
// Uses the CultureInfo constructor that takes a
// useUserOverride parameter.
// Sets the useUserOverride value to false.
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR", _
false);
// Displays i formatted as currency for the CurrentCulture.
// This will override any user settings and display the euro symbol.
return (i.ToString("c"));
}
}
Windows Forms- und Konsolenanwendungen, die auf allen Versionen von Windows-Betriebssystemen ausgeführt werden, legen das Standardwährungssymbol anhand der Einstellungen des Computers des Benutzers fest. Wie bereits weiter oben erwähnt, könnte diese Einstellung falsch sein. Um sicherzustellen, dass die .NET Framework-Standardeinstellungen verwendet werden, muss die Anwendung ein CultureInfo-Objekt erstellen, indem ein useUserOverride-Parameter mit der Einstellung false übergeben wird.
Im folgenden Beispiel wird ein ähnlicher Code verwendet, wie im vorherigen Beispiel. Für die aktuelle Kultur wird "fr-FR" festgelegt und für die Konsole wird eine als Währung formatierte Ganzzahl angezeigt. Für das Format der Währung werden die lokalen Währungseinstellungen des Computers des Benutzers verwendet. Anschließend wird für die Kultur "fr-FR" festgelegt, indem der CultureInfo-Konstruktor verwendet wird, der den useUserOverride-Parameter mit der Einstellung false akzeptiert. Die Zahl wird dann unter Verwendung der .NET Framework-Standardeinstellungen formatiert, und das Eurowährungssymbol wird angezeigt.
Imports System
Imports System.Globalization
Imports System.Threading
Public Class EuroSymbolSample
Public Shared Sub Main()
Dim i As Integer = 100
' Sets the CurrentCulture to French in France.
Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR")
' Displays i formatted as currency for the CurrentCulture.
' On a version of Windows prior to Windows XP, where the user
' has not changed the default currency to euro through the
' Control Panel, this will default to "F".
Console.WriteLine(i.ToString("c"))
' Sets the CurrentCulture to French in France, using the
' CultureInfo constructor that takes a useUserOverride parameter.
' Sets the useUserOverride value to false.
Thread.CurrentThread.CurrentCulture = New CultureInfo("fr-FR", _
False)
' Displays i formatted as default currency for the CurrentCulture.
' On a version of Windows prior to Windows XP, this will override an
' incorrect default setting of "F" and display the euro symbol ().
Console.WriteLine(i.ToString("c"))
End Sub
End Class
using System;
using System.Globalization;
using System.Threading;
public class EuroSymbolSample
{
public static void Main()
{
int i = 100;
// Sets the CurrentCulture to French in France.
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
// Displays i formatted as default currency for the CurrentCulture.
// On a version of Windows prior to Windows XP, where the user
// has not changed the default currency to euro through the
// Control Panel, this will default to "F".
Console.WriteLine(i.ToString("c"));
// Sets the CurrentCulture to French in France, using the
// CultureInfo constructor that takes a useUserOverride parameter.
// Sets the useUserOverride value to false.
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR",
false);
// Displays i formatted as default currency for the CurrentCulture.
// On a version of Windows prior to Windows XP, this will override an
// incorrect default setting of "F" and display the euro symbol ().
Console.WriteLine(i.ToString("c"));
}
}
Die Konsolenumgebung unterstützt das Eurozeichen nicht. Wenn Sie diesen Code in einer Windows Forms-Anwendung ausführen, wird Folgendes ausgegeben:
100,00 F
100,00 €
In einer Reihe von europäischen Ländern bzw. Regionen werden momentan zwei Währungen verwendet: der Euro und die lokale Währung. Möglicherweise treten daher Situationen auf, in denen die Anzeige beider Währungen in einer Anwendung erforderlich ist. Im folgenden Codebeispiel wird ein CultureInfo-Objekt für die Kultur "fr-FR" erstellt, deren Standardwährung der Euro ist. Damit das Währungssymbol für die lokale Währung angezeigt wird, müssen Sie die NumberFormatInfo.Clone-Methode verwenden, um eine neue NumberFormatInfo für die CultureInfo zu klonen und das Standardwährungssymbol durch das lokale Währungssymbol zu ersetzen.
Imports System
Imports System.Globalization
Imports System.Threading
Public Class EuroLocalSample
Public Shared Sub Main()
' Creates a CultureInfo for French in France.
Dim FrCulture As New CultureInfo("fr-FR")
' Sets the CurrentCulture to fr-FR.
Thread.CurrentThread.CurrentCulture = FrCulture
' Clones the NumberFormatInfo and creates
' a new object for the local currency of France.
Dim LocalFormat As NumberFormatInfo =_
CType(NumberFormatInfo.CurrentInfo.Clone(), NumberFormatInfo)
' Replaces the default currency symbol
' with the local currency symbol.
LocalFormat.CurrencySymbol = "F"
Dim i As Integer = 100
' Displays i formatted as the local currency.
Console.WriteLine(i.ToString("c", LocalFormat))
' Displays i formatted as the default currency.
Console.WriteLine(i.ToString("c", NumberFormatInfo.CurrentInfo))
End Sub
End Class
using System;
using System.Globalization;
using System.Threading;
public class EuroLocalSample
{
public static void Main()
{
// Creates a CultureInfo for French in France.
CultureInfo FrCulture = new CultureInfo("fr-FR");
// Sets the CurrentCulture to fr-FR.
Thread.CurrentThread.CurrentCulture = FrCulture;
// Clones the NumberFormatInfo and creates
// a new object for the local currency of France.
NumberFormatInfo LocalFormat =
(NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
// Replaces the default currency symbol with the
// local currency symbol.
LocalFormat.CurrencySymbol = "F";
int i = 100;
// Displays i formatted as the local currency.
Console.WriteLine(i.ToString("c", LocalFormat));
// Displays i formatted as the default currency.
Console.WriteLine(i.ToString("c", NumberFormatInfo.CurrentInfo));
}
}
Ein ähnliches Beispiel ist das "MultiCurrency"-Beispiel im Schnellstart zu allgemeinen Aufgaben.