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

时间:2014-02-18 14:34:06

标签: c#

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

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

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

  

Input string was not in correct format

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

附加信息:

enter image description here

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

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

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

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

4 个答案:

答案 0 :(得分:7)

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

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

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

是的,如果您愿意,也可以继续使用Convert.ToDecimal

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

答案 1 :(得分:3)

我会给decimal.TryParse一个去

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

答案 2 :(得分:1)

我怀疑您使用的文化将.定义为千位分隔符,将,定义为十进制分隔符。如果您想分别强制,.作为千位和小数分隔符,请使用:

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

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

没关系 - 主要区别在于它支持的类型多于decimal.Parse,只支持string

答案 3 :(得分:0)

我同意@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);

}

这样,您可以捕获指数格式的值。