如何将字符串转换为十进制?

我有这个接受数字,逗号和句号的文本框。

假设此文本框包含输入14,500.00

我尝试使用Convert.ToDecimal(textbox.text)将此数字转换为十进制,但它不起作用。 Convert.ToDecimal()到包含格式为XXXX.DD输入的文本框将转换为十进制但输入格式为X,XXX.DD或任何带有千位分隔符的输入会导致错误:

Input string was not in correct format

在这种情况下, Convert.ToDecimal()合适?

附加信息:

在此处输入图像描述

这是表格。 如果单击“添加”,则“价格”和“数量”的乘积应在数据网格视图中显示为“金额”。

“添加”按钮中的语法包括:

 DataRow dr; dr = dsDetail.Tables["SalesOrderDetails"].NewRow(); dr["Amount"] = Convert.ToDecimal(txtSellingPrice.Text) * Convert.ToDecimal(txtQuantity.Text); 

SalesOrderDetails表中的Amount字段的数据类型为decimal(18,2)

您可以强制文化并使用decimal.Parse

 decimal d = decimal.Parse("14,500.00", CultureInfo.InvariantCulture); // 14500 

在这种情况下,Convert.ToDecimal()是否合适?

是的,如果需要,您还可以继续使用Convert.ToDecimal

 d = Convert.ToDecimal("14,500.00", CultureInfo.InvariantCulture); 

我会给decimal.TryParse一个去

 decimal d; if(decimal.TryParse(textbox.Text, out d)) { //do something } 

我怀疑你正在使用一种定义的文化. 作为千位分隔符,作为小数分隔符。 如果你想强迫,. 作为千位和小数分隔符,分别使用:

 decimal value = Convert.ToDecimal(textbox.text,CultureInfo.InvariantCulture); 

在这种情况下,Convert.ToDecimal()是否合适?

这很好 – 主要的区别是它支持的更多类型比decimal.Parse ,它只支持string s。

我同意@matt_lethargic,但提供更完整的解决方案。 用XUnit测试:)

 [Theory] [InlineData("en-US","44.00")] [InlineData("es-PE", "44,00")] [InlineData("es-PE", "44.00")] [InlineData("es-PE", "0.01E-15")] [InlineData("es-PE", "0,01E-15")] public void ParsesDeciaml(string culture, string dec) { CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo(culture); decimal d; if (!decimal.TryParse(dec, out d) && !decimal.TryParse( dec, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.CurrentCulture, out d ) && !decimal.TryParse( dec, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out d ) ) Assert.False(true, dec); } 

这样,您就可以使用指数格式捕获值。