解析字符串中的小数位

解析字符串中的小数位

问题描述:

我有一个网页表单上有一个项目名称和与之相关的价格(用户不可见)的下拉列表。我正在使用selecteditem.Text和selectedvalue来捕获项目名称和价格。为了打击针对的SelectedValue重复条目我储存像这样解析字符串中的小数位

签名帽10.0
签名手套10.1
签名球衣10.2
蝙蝠刨花0.50
帽檐0.50

然后用下面的方法解析出来

String[] str = dropdownlist1.SelectedValue.ToString().Split('.'); 
String itemprice = str[0].Trim(); 

我的语法很好,除了十进制值!在蝙蝠屑和帽子边缘我需要保留十进制值!我应该改变什么,或者应该如何设置我的语法以允许重复的选定值或保留小数?我知道使用str [0]是什么导致我失去小数,但是我怎样才能解决它的2(可能更多在未来)的情况下,他们需要保持机智?

从您的帖子中很难告诉您如何获取您的数据,但是我会将数据从数据库加载到数据对象中,然后将该对象绑定到下拉列表。

这里是库存I类用于将数据从数据库中存储:

public class Inventory 
{ 
    public int ProductID { get; set; } 
    public string ProductDescription { get; set; } 
    public decimal ProductPrice { get; set; } 

    public Inventory(int ID, string Description, decimal Price) 
    { 
     this.ProductID = ID; 
     this.ProductDescription = Description; 
     this.ProductPrice = Price; 
    } 

    public string DDLValue 
    { 
     get 
     { 
      return string.Format("{0}|{1}|{2}", ProductID, ProductDescription, ProductPrice); 
     } 
    } 

    public string DDLText 
    { 
     get 
     { 
      return string.Format("{0} [{1}]", ProductDescription, ProductPrice.ToString("C")); 
     } 
    } 
} 

下面是如何配置的页面控制的示例:

<asp:DropDownList ID="ddlProducts" runat="server" DataValueField="DDLValue" DataTextField="DDLText" /> 

在后面的页面代码中,将数据加载到下拉列表中:

protected void LoadProductsFromDatabase() 
    { 
     System.Collections.Generic.List<Inventory> My_DDL_Datasource = new System.Collections.Generic.List<Inventory>(); 

     // write your code to pull database values 
     // populating list with sample data for * 
     // make sure to use a replace statement to remove any delimiter characters that may be in the description 
     My_DDL_Datasource.Add(new Inventory(1, "Product 1".Replace("|", ""), 0.50m)); 
     My_DDL_Datasource.Add(new Inventory(2, "Product 2".Replace("|", ""), 1.50m)); 
     My_DDL_Datasource.Add(new Inventory(3, "Product 3".Replace("|", ""), 0.50m)); 
     My_DDL_Datasource.Add(new Inventory(4, "Product 4".Replace("|", ""), 10.50m)); 

     ddlProducts.DataSource = My_DDL_Datasource; 
     ddlProducts.DataBind(); 
    } 

在页面后面的代码,创建一个方法,让您的下拉列表中选择值:

protected Inventory GetSelectedProduct() 
    { 
     try 
     { 
      if (ddlProducts.Items.Count == 0) 
      { 
       // do nothing, fall thru will return null 
      } 
      else 
      { 
       string[] DDLValue = ddlProducts.SelectedValue.Split('|'); 

       int ivalue = 0; 
       int.TryParse(DDLValue.GetValue(0).ToString(), out ivalue); 

       decimal dvalue = 0.00m; 
       decimal.TryParse(DDLValue.GetValue(2).ToString(), out dvalue); 

       // only return object if the productid and product price were successfully parsed. 
       // this logic assumes no products are free 
       if (ivalue > 0 && dvalue > 0.00m) 
       { 
        return new Inventory(ivalue, DDLValue.GetValue(1).ToString(), dvalue); 
       } 
      } 
     } 
     catch { } 
     return null; 
    } 

在后面的页面代码,做一些与你选择的值:

protected void DoSomethingWithValue() 
    { 
     Inventory MyInventoryItem = GetSelectedProduct(); 

     if (MyInventoryItem != null) 
     { 
      // selected item successfully parsed 
      // do something with it. 

      Response.Write(
       string.Format("Your selected product:<br />{0}<br />UniqueID: {1}<br />Price: {2}", 
       Server.HtmlEncode(MyInventoryItem.ProductDescription), 
       MyInventoryItem.ProductID, 
       MyInventoryItem.ProductPrice.ToString("C") 
      )); 
     } 
     else 
     { 
      // error parsing information stored in drop down list value 
     } 
    } 

您可以分割空间,并使用LINQ总是最后一个条目:不是项目名称和价格,你应该使用一个隐藏的项目Id为的SelectedValue

dropdownlist1.SelectedValue.ToString().Split(' ').Last(); 

注意,并使用查找表作者:

ItemId|Name|Price 
1|Hat|.50 
2|Bat Shavings|.50 
... 

当提交选定的标识,你可以更直接地查找名称和价格。而且,隐藏在表单中的价格并不妨碍用户操纵价格。

+0

实际查找来自SQL Server表。 Shoudl我仍然担心用户操纵价格?我也不希望总是从字符串中取得.Last(),我只想在.Last不是整数时在小数点左边。 –

+0

这与操纵价格的人有什么关系?在任何情况下,您都应该*从不*接受用户输入,而不根据数据库验证它(对于用户不应该选择的字段)。 – Rob

+0

@InformationRequested“我也不希望总是从字符串中取得.Last(),我只想在.Last不是整数时在小数点左边。”你总是想要拿最后一个。在空间之后是否有整数或小数,你想要的价格是正确的?它是否是整数有什么关系?它跟随空间。 – AaronLS

您需要从字符串中删除/替换所有字母字符并仅保留数字。

Regex rgx = new Regex("[^a-zA-Z]"); 
str = rgx.Replace(str, "").Trim(); 
decimal prc; 
Decimal.TryParse(str, out prc);