提问人:thux 提问时间:11/16/2023 最后编辑:thux 更新时间:11/17/2023 访问量:94
小数及其在 .NET 中的表示方式的问题
Issue with decimals and how they're represented in .NET
问:
我正在尝试将价格列添加到我的 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
答:
格式: {0:D} 以十进制格式显示整数值。您可以指定位数。(尽管该类型称为“十进制”,但数字的格式为整数。
对于 2 个地方,使用它就像 DataFormatString = {0:n2}
似乎在应用程序中将 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 的原始值,帮助您确定问题出在存储还是显示值上。
评论
看起来您的本地小数点和组分隔符不是您认为的那样,其中分组分隔符是一个句点 () 并且被忽略,因为它与解析数字无关。.
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,它使用句点作为小数点分隔符,使用逗号作为分组分隔符。
上一个:浮点数学坏了吗?
评论