Compartilhar via


Como: Converter a entrada numérica do usuário nos controles da Web em números

Dado que uma página da Web pode ser exibida em qualquer lugar no mundo, os usuários podem entrar com dados numéricos em um controle TextBox em um número quase ilimitado de formatos. Como resultado, é muito importante determinar o local e cultura do usuário da página da Web. Quando você analisa entradas de usuário, você pode em seguida aplicar as convenções de formatação definidas pela localidade e pela cultura do usuário.

Para converter a entrada numérica de um controle TextBox da Web para um número

  1. Determine se a matriz de sequências de caracteres retornada pela propriedade HttpRequest.UserLanguages está preenchida. Se não estiver, vá para a etapa 6.

  2. Se a matriz de sequências de caracteres retornada pela propriedade UserLanguages estiver preenchida, recupere o primeiro elemento. O primeiro elemento indica a região ou idioma preferencial ou padrão do usuário.

  3. Instanciar um CultureInfo o objeto que representa o usuário preferencial cultura chamando o CultureInfo.CultureInfo(String, Boolean) construtor.

  4. Chame o método TryParse ou Parse do tipo numérico para o qual você deseja converter a entrada do usuário. Use uma sobrecarga do método TryParse ou Parse com um parâmetro provider, e passe a ele um dos seguintes:

  5. Se a conversão falhar, repita as etapas de 2 a 4 para cada elemento restante na matriz de sequências de caracteres retornada pela propriedade UserLanguages.

  6. Se a conversão ainda falhar ou se o matriz de sequências de caracteres retornada pela propriedade UserLanguages estiver vazia, analise a sequência de caracteres usando a cultura invariável, que é retornada pela propriedade CultureInfo.InvariantCulture.

Exemplo

O exemplo a seguir é a página code-behind completa para um formulário da Web que pede ao usuário para inserir um valor numérico em um controle TextBox e o converte para um número. Esse número é então dobrado e exibido usando as mesmas regras de formatação da entrada original.

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));
      }
   }
}

A propriedade HttpRequest.UserLanguages é preenchida com os nomes de cultura que estão contidos em cabeçalhos Accept-Language incluídos em uma solicitação HTTP. No entanto, nem todos os navegadores incluem cabeçalhos Accept-Language em suas solicitações, e os usuários também podem suprimir os cabeçalhos totalmente. Isso torna importante ter uma cultura de fallback ao analisar entradas do usuário. Normalmente, a cultura de fallback é a cultura invariável retornada por CultureInfo.InvariantCulture. Os usuários também podem fornecer ao Internet Explorer nomes de cultura que eles inserem em um caixa de texto, o que cria a possibilidade dos nomes cultura não serem válidos. Isso torna importante usar tratamento de exceções ao instanciar um objeto CultureInfo.

Quando recuperada de um solicitação HTTP enviada pelo Internet Explorer, a matriz HttpRequest.UserLanguages é preenchida por ordem de preferência do usuário. O primeiro elemento na matriz contém o nome da cultura/região primária do usuário. Se a matriz contém quaisquer itens adicionais, o Internet Explorer arbitrariamente atribui a eles um especificador de qualidade, que é delimitado do nome da cultura por um ponto-e-vírgula. Por exemplo, uma entrada para a cultura fr-FR pode tomar a forma fr-FR;q=0.7.

As chamadas de exemplo do CultureInfo construtor com sua useUserOverride parâmetro definido como false para criar um novo CultureInfo objeto. Isso garante que, se o nome de cultura é o nome da cultura padrão no servidor, o novo CultureInfo contém as configurações padrão de uma cultura de objeto criado pelo construtor da classe e não reflete qualquer configuração substituída usando o servidor regionais e idioma aplicativo. Os valores de qualquer configuração substituída no servidor provavelmente existe no sistema do usuário ou ser refletido na entrada do usuário.

Seu código pode chamar tanto o método Parse quanto o TryParse do tipo numérico para o qual a entrada do usuário será convertida. Chamadas repetidas para um método de análise podem ser necessárias para uma única operação de análise. Como resultado, o método TryParse é melhor, porque ele retorna false se uma operação de análise falhar. Por outro lado, manipular as exceções repetidas que podem ser lançadas pelo método Parse pode ser uma proposta muito cara em um aplicativo da Web.

Compilando o código

Para compilar o código, copiá-lo em um ASP.NET página code-behind, para que ele substitui todo o código existente. O ASP.NET página da Web deve conter os seguintes controles:

  • Um controle Label, não mencionado no código. Defina sua propriedade Text como "Digite um número:".

  • Um controle TextBox chamado NumericString.

  • Um controle Button chamado OKButton. Defina sua propriedade Text como "OK".

Alterar o nome da classe de NumericUserInput para o nome da classe que é definido pelo Inherits atributo da ASP.NET da página Page diretiva. Alterar o nome da NumericInput object reference do nome definido pelo id atributo da ASP.NET da página form marca.

Segurança

Para evitar que um usuário insira script no fluxo HTML, a entrada do usuário nunca deve ser ecoada diretamente de volta na resposta do servidor. Em vez disso, ela deve ser codificada usando o método HttpServerUtility.HtmlEncode.

Consulte também

Conceitos

Executar operações de formatação

Analisando sequências de caracteres numéricas