返回介绍

如何:将用户在 Web 控件中输入的数值转换为数字

发布于 2025-02-23 23:15:41 字数 7161 浏览 0 评论 0 收藏 0

因为可以在世界任何地方显示网页,用户可以输入数字数据插入 TextBox 几乎无限数量的格式中的控件。 因此,它是用户的非常重要,以确定的区域设置和区域性,网页。 当分析用户输入时,你可以随后可应用定义的用户的区域设置和区域性的格式设置约定。

若要从 Web 文本框控件的数字输入转换数字

  1. 确定返回的字符串数组 HttpRequest.UserLanguages 填充属性。 如果不是,继续步骤 6。
  2. 如果通过返回的字符串数组 UserLanguages 填充属性,检索其第一个元素。 用户的默认值或首选的语言和区域,该值指示第一个元素。
  3. 实例化 CultureInfo 表示用户的对象的首选区域性,通过调用 CultureInfo.CultureInfo(String, Boolean) 构造函数。
  4. 调用 TryParseParse 你想要转换的用户的数值类型的方法的输入转换为。 使用的重载 TryParseParse 方法替换 provider 参数,并将其传递下列操作之一:
    • CultureInfo 步骤 3 中创建的对象。
    • NumberFormatInfo 返回的对象 NumberFormat 属性 CultureInfo 步骤 3 中创建的对象。
  5. 如果转换失败,重复步骤 2 至 4 的每个剩余元素的字符串数组中返回 UserLanguages 属性。
  6. 如果转换仍失败,或通过返回的字符串数组 UserLanguages 属性为空,返回通过使用固定区域性,分析字符串 CultureInfo.InvariantCulture 属性。

示例

下面的示例是要求用户输入中的数值的 Web 窗体的完整的代码隐藏页 TextBox 控制并将其转换为数字。 然后,该数字是加倍,然后通过使用相同的格式设置规则作为原始输入显示。

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

HttpRequest.UserLanguages 中包含的区域性名称填充属性 Accept-Language 标头包含在 HTTP 请求中。 但是,并非所有浏览器包括 Accept-Language 其请求和用户中的标头还可以取消标头完全。 这使得重要有回退区域性,当用户输入内容分析。 通常,回退区域性是由固定区域性 CultureInfo.InvariantCulture 。 用户还可以提供 Internet Explorer 并且了区域性名称它们输入在文本框中,这将创建区域性名称可能不是有效的可能性。 因此,务必要在实例化时使用异常处理 CultureInfo 对象。

当从 Internet Explorer 中,通过提交 HTTP 请求检索 HttpRequest.UserLanguages 数组填充用户首选项的顺序。 数组中的第一个元素包含用户的主要的区域性区域的名称。 如果数组包含任何其他项,Internet Explorer 任意将其分配的质量说明符,它由分号分隔的区域性名称。 例如,FR-FR 区域性的条目可能采用的形式 fr-FR;q=0.7

该示例通过调用 CultureInfo 构造函数使用其 useUserOverride 参数设置为 false 创建新 CultureInfo 对象。 这样可确保,如果区域性名称是默认区域性名称在服务器上,新 CultureInfo 由类构造函数创建对象包含区域性的默认设置,而不反映使用服务器的重写任何设置 区域和语言选项 应用程序。 从服务器上的任何重写设置的值不太可能存在于用户的系统上或才会反映在用户的输入。

你的代码可以调用 ParseTryParse 的用户的输入的数值类型的方法将转换为。 一次分析操作可能需要重复的调用分析方法。 因此, TryParse 方法是更好,因为它返回 false 如果分析操作失败。 与此相反,处理重复可能会引发的异常: Parse 方法可以是 Web 应用程序中一种代价很高的做法。

编译代码

若要编译代码,将其复制到 ASP.NET 代码隐藏页中,以便它将替换现有的所有代码。 ASP.NET Web 页面应包含以下控件:

  • A Label 控件,这不在代码中引用。 设置其 Text 属性设置为"输入一个数字:"。
  • 名为 NumericString 的 TextBox 控件。
  • 名为 OKButton 的 Button 控件。 设置其 Text 属性设置为"确定"。

更改中的类名称 NumericUserInput 到由定义的类名称 Inherits 属性 ASP.NET 页面的 Page 指令。 更改的名称 NumericInput 对象引用为通过定义的名称 id 属性 ASP.NET 页面的 form 标记。

.NET Framework 安全性

若要防止用户脚本注入 HTML 流,可在服务器响应直接回送用户输入。 相反,它进行编码后应通过使用 HttpServerUtility.HtmlEncode 方法。

另请参阅

执行格式设置操作
分析数值字符串

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文