我正在开发一个使用asp.net core和MySql作为数据库的网络应用程序,该应用程序的目的是充当数字存储。该应用程序能够添加、删除、更新产品。我遇到的问题是当我通过网络应用程序将产品添加到数据库表时。例如,我想添加一个重量为 4,21 的产品,当将其存储在数据库中时,它显示为 421,00。数据库中的权重列设置为 Decimal(18,2)。我正在使用 cPanel 来托管我的网络应用程序。
我使用以下代码在本地解决了该问题:
public async Task<bool> AddProduct(string articleNumber, decimal purchasePrice, decimal sellingPrice, decimal weight, decimal dimension, string material, int quantity)
{
try
{
var exist = await ArticleNumberExists(articleNumber);
if (exist)
{
_logger.LogInformation("article number already exists");
return false;
}
var formattedPurchasePrice = purchasePrice.ToString(CultureInfo.InvariantCulture);
var formattedSellingPrice = sellingPrice.ToString(CultureInfo.InvariantCulture);
var formattedWeight = weight.ToString(CultureInfo.InvariantCulture);
var formattedDimension = dimension.ToString(CultureInfo.InvariantCulture);
var product = new Product()
{
ArticleNumber = articleNumber,
PurchasePrice = purchasePrice,
SellingPrice = sellingPrice,
Weight = weight,
Dimension = dimension,
PurchasePrice = decimal.Parse(formattedPurchasePrice, CultureInfo.InvariantCulture),
SellingPrice = decimal.Parse(formattedSellingPrice, CultureInfo.InvariantCulture),
Weight = decimal.Parse(formattedWeight, CultureInfo.InvariantCulture),
Dimension = decimal.Parse(formattedDimension, CultureInfo.InvariantCulture),
Material = material,
Quantity = quantity
};
await _context.Products.AddAsync(product);
await _context.SaveChangesAsync();
return true;
}
catch (Exception)
{
_logger.LogError("failed to add product");
return false;
}
}
这会将值正确存储在数据库中,值 4,21 在数据库中存储为 4,21,但仅在本地运行时有效。
部署网络应用程序时,这似乎不再起作用,我不明白为什么。
这可能与数据库无关,而与您的网络主机上运行的默认文化 asp.net 有关。
在本地,您似乎正在运行一种非英语文化,它使用
,
作为小数点分隔符。
在实时服务器上,它不会理解这一点,并且可能会对待。
,
作为千位分隔符(因此,基本上会被忽略)。
将
"4,21"
作为字符串提交,它将通过默认区域性转换为十进制,因此 weight
将作为 421
出现。将其转换为字符串并返回小数没有区别。
一种解决方案:将参数更改为字符串,并在您想要的任何文化中自行进行解析。您还可以更改默认文化:
var culture = new CultureInfo("fr-CA");
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;