Gewusst wie: Konvertieren numerischer Benutzereingaben in Websteuerelementen in Zahlen

Da eine Webseite auf der ganzen Welt angezeigt werden kann, können Benutzer numerische Daten unter Verwendung unbegrenzt vieler Formate in ein TextBox-Steuerelement eingeben. Folglich ist es sehr wichtig, das Gebietsschema und die Kultur des Webseitenbenutzers zu ermitteln. Wenn Sie eine Benutzereingabe analysieren, können Sie die Formatierungskonventionen übernehmen, die vom Gebietsschema und der Kultur des Benutzers vorgegeben werden.

So konvertieren Sie numerische Eingaben aus einem TextBox-Websteuerelement in eine Zahl

  1. Stellen Sie fest, ob das von der HttpRequest.UserLanguages-Eigenschaft zurückgegebene Zeichenfolgenarray Daten enthält. Falls nicht, fahren Sie mit Schritt 6 fort.

  2. Wenn das von der UserLanguages-Eigenschaft zurückgegebene Zeichenfolgenarray Daten enthält, rufen Sie dessen erstes Element ab. Das erste Element gibt die standardmäßige bzw. bevorzugte Sprache und Region des Benutzers an.

  3. Instanziieren Sie ein CultureInfo-Objekt, das die bevorzugte Kultur des Benutzers darstellt, indem Sie den CultureInfo.CultureInfo(String, Boolean)-Konstruktor aufrufen.

  4. Rufen Sie entweder die TryParse-Methode oder die Parse-Methode des numerischen Typs auf, in den die Benutzereingabe konvertiert werden soll. Verwenden Sie eine Überladung der TryParse-Methode oder der Parse-Methode mit einem provider-Parameter, und übergeben Sie eines der folgenden Objekte:

  5. Wenn die Konvertierung fehlschlägt, wiederholen Sie die Schritte 2 bis 4 für jedes verbleibende Element in dem durch die UserLanguages-Eigenschaft zurückgegebenen Zeichenfolgenarray.

  6. Wenn die Konvertierung weiterhin fehlschlägt oder das von der UserLanguages-Eigenschaft zurückgegebene Zeichenfolgenarray leer ist, analysieren Sie die Zeichenfolge unter Verwendung der invarianten Kultur, die von der CultureInfo.InvariantCulture-Eigenschaft zurückgegeben wird.

Beispiel

Das folgende Beispiel stellt eine vollständige Code-Behind-Seite für ein Web Form dar, in dem der Benutzer zur Eingabe eines numerischen Wertes in ein TextBox-Steuerelement aufgefordert und der Wert in eine Zahl konvertiert wird. Diese Zahl wird dann verdoppelt und unter Verwendung derselben wie für die Originaleingabe verwendeten Formatierungsregeln angezeigt.

Imports System.Globalization

Partial Class NumericUserInput
   Inherits System.Web.UI.Page

   Protected Sub OKButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles OKButton.Click
      Dim locale As String
      Dim culture As CultureInfo = Nothing
      Dim number As Double
      Dim result As Boolean

      ' Exit if input is absent.
      If String.IsNullOrEmpty(Me.NumericString.Text) Then Exit Sub

      ' Hide form elements.
      Me.NumericInput.Visible = False

      ' Get user culture/region
      If Not (Request.UserLanguages.Length = 0 OrElse String.IsNullOrEmpty(Request.UserLanguages(0))) Then
         Try
            locale = Request.UserLanguages(0)
            culture = New CultureInfo(locale, False)

            ' Parse input using user culture.
            result = Double.TryParse(Me.NumericString.Text, NumberStyles.Any, culture.NumberFormat, number)
         Catch
         End Try
         ' If parse fails, parse input using any additional languages.
         If Not result Then
            If Request.UserLanguages.Length > 1 Then
               For ctr As Integer = 1 To Request.UserLanguages.Length - 1
                  Try
                     locale = Request.UserLanguages(ctr)
                     ' Remove quality specifier, if present.
                     locale = Left(locale, InStr(locale, ";") - 1)
                     culture = New CultureInfo(Request.UserLanguages(ctr), False)
                     result = Double.TryParse(Me.NumericString.Text, NumberStyles.Any, culture.NumberFormat, number)
                     If result Then Exit For
                  Catch
                  End Try
               Next
            End If
         End If
      End If
      ' If parse operation fails, use invariant culture.
      If Not result Then
         result = Double.TryParse(Me.NumericString.Text, NumberStyles.Any, CultureInfo.InvariantCulture, number)
      End If
      ' Double result
      number *= 2

      ' Display result to user.
      If result Then
         Response.Write("<P />")
         Response.Write(Server.HtmlEncode(Me.NumericString.Text) + " * 2 = " + number.ToString("N", culture) + "<BR />")
      Else
         ' Unhide form.
         Me.NumericInput.Visible = True

         Response.Write("<P />")
         Response.Write("Unable to recognize " + Server.HtmlEncode(Me.NumericString.Text))
      End If
   End Sub   
End Class
using System;
using System.Globalization;

partial class NumericUserInput : System.Web.UI.Page
{
   protected void OKButton_Click(object sender, EventArgs e)
   {
      string locale;
      CultureInfo culture = null;
      double number = 0;
      bool result = false;

      // Exit if input is absent.
      if (String.IsNullOrEmpty(this.NumericString.Text)) return;

      // Hide form elements.
      this.NumericInput.Visible = false;

      // Get user culture/region
      if (!(Request.UserLanguages.Length == 0 || String.IsNullOrEmpty(Request.UserLanguages[0])))
      {
         try
         {
            locale = Request.UserLanguages[0];
            culture = new CultureInfo(locale, false);

            // Parse input using user culture.
            result = Double.TryParse(this.NumericString.Text, NumberStyles.Any,
                                     culture.NumberFormat, out number);
         }
         catch { }
         // If parse fails, parse input using any additional languages.
         if (!result)
         {
            if (Request.UserLanguages.Length > 1)
            {
               for (int ctr = 1; ctr <= Request.UserLanguages.Length - 1; ctr++)
               {
                  try
                  {
                     locale = Request.UserLanguages[ctr];
                     // Remove quality specifier, if present.
                     locale = locale.Substring(1, locale.IndexOf(';') - 1);
                     culture = new CultureInfo(Request.UserLanguages[ctr], false);
                     result = Double.TryParse(this.NumericString.Text, NumberStyles.Any, culture.NumberFormat, out number);
                     if (result) break;
                  }
                  catch { }
               }
            }
         }
      }
      // If parse operation fails, use invariant culture.
      if (!result)
         result = Double.TryParse(this.NumericString.Text, NumberStyles.Any, CultureInfo.InvariantCulture, out number);

      // Double result.
      number *= 2;

      // Display result to user.
      if (result)
      {
         Response.Write("<P />");
         Response.Write(Server.HtmlEncode(this.NumericString.Text) + " * 2 = " + number.ToString("N", culture) + "<BR />");
      }
      else
      {
         // Unhide form.
         this.NumericInput.Visible = true;

         Response.Write("<P />");
         Response.Write("Unable to recognize " + Server.HtmlEncode(this.NumericString.Text));
      }
   }
}

Die HttpRequest.UserLanguages-Eigenschaft wird unter Verwendung der Kulturnamen aufgefüllt, die in Accept-Language-Headern innerhalb einer HTTP-Anforderung enthalten sind. Allerdings schließen nicht alle Browser Accept-Language-Header in ihre Anforderungen ein, und die Header können vom Benutzer auch vollständig unterdrückt werden. Daher ist es wichtig, bei der Analyse der Benutzereingabe über eine Fallbackkultur zu verfügen. Die Fallbackkultur ist in der Regel die von der CultureInfo.InvariantCulture-Eigenschaft zurückgegebene invariante Kultur. Benutzer können auch Kulturnamen für Internet Explorer bereitstellen, die sie in ein Textfeld eingeben. Dabei ist es möglich, dass die Kulturnamen nicht gültig sind. Aus diesem Grund sollte beim Instanziieren eines CultureInfo-Objekts unbedingt eine Ausnahmebehandlung verwendet werden.

Wenn das HttpRequest.UserLanguages-Array durch eine von Internet Explorer gesendeten HTTP-Anforderung abgerufen wird, wird es in der Reihenfolge der Benutzereinstellungen aufgefüllt. Das erste Element im Array enthält den Namen der primären Kultur/Region des Benutzers. Wenn das Array zusätzliche Elemente enthält, weist Ihnen Internet Explorer beliebig einen Qualitätsbezeichner zu, der durch ein Semikolon vom Kulturnamen getrennt ist. Beispielsweise könnte ein Eintrag für die Kultur fr-FR wie folgt aussehen: fr-FR;q=0.7.

Im Beispiel wird der CultureInfo-Konstruktor, dessen useUserOverride-Parameter auf false festgelegt ist, aufgerufen, um ein neues CultureInfo-Objekt zu erstellen. So wird sichergestellt, dass, wenn der Kulturname dem standardmäßigen Kulturnamen auf dem Server entspricht, das neue, vom Klassenkonstruktor erstellte CultureInfo-Objekt die Standardkultureinstellungen beinhaltet und keine Einstellungen widerspiegelt, die durch die Anwendung Regions- und Sprachoptionen des Servers überschrieben wurden. Es ist unwahrscheinlich, dass die Werte von auf dem Server überschriebenen Einstellungen auf dem Benutzersystem vorhanden sind oder in der Benutzereingabe wiedergegeben werden.

Durch Ihren Code kann entweder die Parse-Methode oder die TryParse-Methode des numerischen Typs aufgerufen werden, in den die Benutzereingabe konvertiert wird. Für einen einzelnen Analysevorgang muss eine Analysemethode möglicherweise wiederholt aufgerufen werden. Folglich ist die TryParse-Methode besser geeignet, da sie false zurückgibt, falls ein Analysevorgang fehlschlägt. Die Behandlung wiederholter Ausnahmen, die von der Parse-Methode ausgelöst werden können, kann sich in einer Webanwendung hingegen als kostenintensives Unterfangen herausstellen.

Kompilieren des Codes

Um den Code zu kompilieren, kopieren Sie ihn in eine ASP.NET-Code-Behind-Seite, um den gesamten vorhandenen Code zu ersetzen. Die ASP.NET-Webseite sollte die folgenden Steuerelemente enthalten:

  • Ein Label-Steuerelement, auf das im Code nicht verwiesen wird. Legen Sie die zugehörige Text-Eigenschaft auf "Enter a Number:" fest.

  • Ein TextBox-Steuerelement mit dem Namen NumericString.

  • Ein Button-Steuerelement mit dem Namen OKButton. Legen Sie die entsprechende Text-Eigenschaft auf "OK" fest.

Ändern Sie den Namen der Klasse von NumericUserInput in den durch das Inherits-Attribut der Page-Direktive der ASP.NET-Seite definierten Klassennamen. Ändern Sie den Namen des NumericInput-Objektverweises in den Namen, der vom id-Attribut des form-Tags der ASP.NET-Seite definiert wird.

Sicherheit

Um zu verhindern, dass ein Benutzer Skriptcode in den HTML-Stream einfügt, sollte die Benutzereingabe in der Serverantwort nie direkt wiedergegeben werden. Stattdessen sollte sie mithilfe der HttpServerUtility.HtmlEncode-Methode codiert werden.

Siehe auch

Konzepte

Durchführen von Formatierungsvorgängen

Verarbeiten numerischer Zeichenfolgen