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

C# 如何将字符串转换为十进制?,c#,C#,我有一个接受数字、逗号和句点的文本框 假设此文本框包含输入14500.00 我试图用convert.ToDecimal(textbox.text)将这个数字转换成十进制,但它不起作用Convert.ToDecimal()到包含格式为XXXX.DD的输入的文本框将转换为十进制,但使用格式为X,XXX.DD的输入或任何带有1000个分隔符的输入将导致错误: 输入字符串的格式不正确 Convert.ToDecimal()在这种情况下合适吗 其他信息: 这是表格。如果单击“添加”,则“价格”和“数量”

我有一个接受数字、逗号和句点的文本框

假设此文本框包含输入
14500.00

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

输入字符串的格式不正确

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

其他信息:

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

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

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

my
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 value = Convert.ToDecimal(textbox.text,CultureInfo.InvariantCulture);
Convert.ToDecimal()在这种情况下合适吗


这很好-主要区别在于它支持的类型比只支持字符串的decimal.TryParse更多。

我想试试decimal.TryParse

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

我同意@matt_lathargic,但提供了一个更完整的解决方案。使用XUnit进行测试:)


通过这种方式,您可以以指数格式捕获值。

您的文化是什么?@SonerGönül如何确定文化?您可以使用
CultureInfo.CurrentCulture
属性确定您正在使用的文化。此属性在windows计算机中使用您的区域和语言选项。我对此区域性内容有点缺乏经验,很抱歉问这个问题,但是我在哪里可以找到CultureInfo.CurrentCulture?这是我在项目中的某个地方编写的代码吗?还是我可以在项目的属性窗口中找到它@索尼格尔。。谢谢你的帮助,如果你不想回答这个问题,我会理解的,但如果你愿意,我会非常感激。@LeonardCupat你有没有在调试器中仔细检查过代码,看看在解析时txt值是什么?您是否尝试过使用
CultureInfo.InvariantCulture
?它不起作用。我尝试了decimal.Parse和Convert.ToDecimal。我已经按照你的建议做了所有的事情,但仍然会产生同样的错误。问题是否可能来自文本框本身?或者我正在使用的数据库中的某些数据类型不匹配?
[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);

}