为什么我的 asp.net core Web 应用程序中的十进制值被错误地存储在 MySql 表中

问题描述 投票:0回答:1

我正在开发一个使用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,但仅在本地运行时有效。

部署网络应用程序时,这似乎不再起作用,我不明白为什么。

c# mysql asp.net-core decimal
1个回答
0
投票

这可能与数据库无关,而与您的网络主机上运行的默认文化 asp.net 有关。

在本地,您似乎正在运行一种非英语文化,它使用

,
作为小数点分隔符。

在实时服务器上,它不会理解这一点,并且可能会对待。

,
作为千位分隔符(因此,基本上会被忽略)。

"4,21"
作为字符串提交,它将通过默认区域性转换为十进制,因此
weight
将作为
421
出现。将其转换为字符串并返回小数没有区别。

一种解决方案:将参数更改为字符串,并在您想要的任何文化中自行进行解析。您还可以更改默认文化:

var culture = new CultureInfo("fr-CA");
CultureInfo.DefaultThreadCurrentCulture = culture;
CultureInfo.DefaultThreadCurrentUICulture = culture;
© www.soinside.com 2019 - 2024. All rights reserved.