带有文化信息的十进制文本框
Texbox to decimal with culture info
我的 texbox 值到小数位时遇到问题。
在比利时,小数点字符是“,”。它在 UI 上运行良好,但是一旦我将这些值传递给我的方法,它就不再读取“,”了。
我试过使用文化信息,但没有成功。
这里它仍然以逗号作为分隔符为我提供了正确的值。因此,例如这里它仍然是正确的值“85,00”
if (rdoNew.Checked)
{
productPresenter.addProduct(
txtProductCode.Text, txtProductName.Text, txtProductDescription.Text,
Convert.ToDecimal(txtPriceExVat.Text, CultureInfo.InvariantCulture), Convert.ToDecimal(txtPriceIncVat.Text, CultureInfo.InvariantCulture),
txtProductSerial.Text, Convert.ToBoolean(checkboxIsService.Checked)
);
}
else
{
productPresenter.updateProduct(Convert.ToInt32(cbProducts.SelectedValue), txtProductCode.Text, txtProductName.Text, txtProductDescription.Text,
Convert.ToDecimal(txtPriceExVat.Text, CultureInfo.InvariantCulture), Convert.ToDecimal(txtPriceIncVat.Text, CultureInfo.InvariantCulture),
txtProductSerial.Text, Convert.ToBoolean(checkboxIsService.Checked));
}
但是这里的价格 priceExVat 和 priceIncVat,例如现在是“8500”
public void addProduct(string productCode, string productName, string productDescription, decimal priceExVat, decimal priceIncVat, string serialNumber, bool isService)
{
tbl_products product = new tbl_products();
product.ProductCode = productCode;
product.ProductName = productName;
product.ProductDescription = productDescription;
product.ProductPriceExVat = priceExVat;
product.ProductPriceInclVat = priceIncVat;
product.ProductSerialNumber = serialNumber;
product.IsService = isService;
我是怎么理解的,当我使用 CultureInfo.InvariantCulture 时,字符串会转换为正确的区域性信息。但我认为我错了。
因为你从不使用你当前的文化或特定的文化(可以是fr-BE
或nl-BE
,因为你没有指定)代码。
由于 InvariantCulture
使用 ,
作为 NumberGroupSeparator
,您的代码认为此分隔符是千位分隔符而不是小数点分隔符。
这就是为什么你的结果会是8500
而不是85,00
(我假设你把你的85000
写错了)
如果你在代码中使用那种特定的文化,我认为应该没问题。
decimal.Parse("85,00", CultureInfo.GetCultureInfo("fr-BE"));
// 85,00
decimal.Parse("85,00", CultureInfo.GetCultureInfo("nl-BE"));
// 85,00
我的 texbox 值到小数位时遇到问题。 在比利时,小数点字符是“,”。它在 UI 上运行良好,但是一旦我将这些值传递给我的方法,它就不再读取“,”了。
我试过使用文化信息,但没有成功。
这里它仍然以逗号作为分隔符为我提供了正确的值。因此,例如这里它仍然是正确的值“85,00”
if (rdoNew.Checked)
{
productPresenter.addProduct(
txtProductCode.Text, txtProductName.Text, txtProductDescription.Text,
Convert.ToDecimal(txtPriceExVat.Text, CultureInfo.InvariantCulture), Convert.ToDecimal(txtPriceIncVat.Text, CultureInfo.InvariantCulture),
txtProductSerial.Text, Convert.ToBoolean(checkboxIsService.Checked)
);
}
else
{
productPresenter.updateProduct(Convert.ToInt32(cbProducts.SelectedValue), txtProductCode.Text, txtProductName.Text, txtProductDescription.Text,
Convert.ToDecimal(txtPriceExVat.Text, CultureInfo.InvariantCulture), Convert.ToDecimal(txtPriceIncVat.Text, CultureInfo.InvariantCulture),
txtProductSerial.Text, Convert.ToBoolean(checkboxIsService.Checked));
}
但是这里的价格 priceExVat 和 priceIncVat,例如现在是“8500”
public void addProduct(string productCode, string productName, string productDescription, decimal priceExVat, decimal priceIncVat, string serialNumber, bool isService)
{
tbl_products product = new tbl_products();
product.ProductCode = productCode;
product.ProductName = productName;
product.ProductDescription = productDescription;
product.ProductPriceExVat = priceExVat;
product.ProductPriceInclVat = priceIncVat;
product.ProductSerialNumber = serialNumber;
product.IsService = isService;
我是怎么理解的,当我使用 CultureInfo.InvariantCulture 时,字符串会转换为正确的区域性信息。但我认为我错了。
因为你从不使用你当前的文化或特定的文化(可以是fr-BE
或nl-BE
,因为你没有指定)代码。
由于 InvariantCulture
使用 ,
作为 NumberGroupSeparator
,您的代码认为此分隔符是千位分隔符而不是小数点分隔符。
这就是为什么你的结果会是8500
而不是85,00
(我假设你把你的85000
写错了)
如果你在代码中使用那种特定的文化,我认为应该没问题。
decimal.Parse("85,00", CultureInfo.GetCultureInfo("fr-BE"));
// 85,00
decimal.Parse("85,00", CultureInfo.GetCultureInfo("nl-BE"));
// 85,00