小数及其在 .NET 中的表示方式的问题

Issue with decimals and how they're represented in .NET

提问人:thux 提问时间:11/16/2023 最后编辑:thux 更新时间:11/17/2023 访问量:94

问:

我正在尝试将价格列添加到我的 ASP.NET Crud,它有效。 我遇到的唯一问题是它采用了错误的输入。 我是初学者,所以我一定忽略了一些东西,但无论如何,我插入一个像 15.50 这样的值,它变成了 1.550

在此处输入图像描述 在此处输入图像描述

这里有一些代码片段,我不知道我在这里搞砸了什么。 命名空间 CRUDNet.Models

{
    [Table("Produtos")]
    public class Produto
    {
        [Column("ID")]
        [Display(Name = "ID")]
        public int ID { get; set; }
        [Column("Nome")]
        [Display(Name = "Nome")]
        public string Nome { get; set; }
        [Column("Valor")]
        [Display(Name = "Valor")]
        [DisplayFormat(DataFormatString = "{0:C}")]
        public decimal Valor { get; set; }
    }
}

我期望当我插入像 15.50 这样的值时,我得到的是 15.50 而不是 1.550

C# asp.net .NET PostgreSQL 数学

评论

0赞 jdweng 11/16/2023
您有一个数字格式 {0:C} 请参阅:learn.microsoft.com/en-us/dotnet/standard/base-types/... 和 learn.microsoft.com/en-us/dotnet/standard/base-types/...

答:

1赞 Priya Maheshwari 11/16/2023 #1

格式: {0:D} 以十进制格式显示整数值。您可以指定位数。(尽管该类型称为“十进制”,但数字的格式为整数。

对于 2 个地方,使用它就像 DataFormatString = {0:n2}

0赞 Ali Hemmati 11/16/2023 #2

似乎在应用程序中将 15.50 变成 1.550 的问题与 Produto 类中的 Valor 字段的格式设置以及应用程序的区域性设置如何解释十进制数有关。

在代码中,将 [DisplayFormat(DataFormatString = “{0:C}”)] 设置为将 Valor 格式化为货币,这可能因应用程序的区域性设置而异。如果应用程序使用逗号为小数分隔符的区域性,则它可以将 15.50 显示为 1.550。

1-检查文化: 1-1 设置所需区域性:可以在应用程序的启动代码或控制器操作中执行此操作。 前任:

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en-US");

2- 更改格式字符串: 尝试将 DataFormatString 更改为“{0:0.00}”之类的内容以获得更一致的格式。 3- 查看如何处理输入:确保在代码中将输入 15.50 正确解析为小数点。

4- 调试提示:尝试暂时删除 [DisplayFormat] 属性以查看 Valor 的原始值,帮助您确定问题出在存储还是显示值上。

评论

0赞 Ali Hemmati 11/18/2023
@thux 你能把结果发给我吗?
2赞 phuzi 11/16/2023 #3

看起来您的本地小数点和组分隔符不是您认为的那样,其中分组分隔符是一个句点 () 并且被忽略,因为它与解析数字无关。.

    var s = "15.50";

    // en-gb uses a period/full stop as the decimal separator.
    var periodCulture = CultureInfo.CreateSpecificCulture("en-gb");
    Console.WriteLine($"{Decimal.Parse(s, periodCulture):N}");
    // 15.50

    // Using de-de as it use a comma as the decimal separator.
    var commaCulture = CultureInfo.CreateSpecificCulture("de-de");
    Console.WriteLine($"{ Decimal.Parse(s, commaCulture):N}");
    // 1,550.00

我当前的文化是 en-gb,它使用句点作为小数点分隔符,使用逗号作为分组分隔符。