我有这个接受数字,逗号和句号的文本框。
假设此文本框包含输入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);
Amount
表中的SalesOrderDetails
字段的数据类型为decimal(18,2)
答案 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);
}
这样,您可以捕获指数格式的值。