.net 在GitHub操作中运行时,C#百分比格式说明符给出不同的结果并使Assert失败

cngwdvgl  于 2022-12-30  发布在  .NET
关注(0)|答案(1)|浏览(101)

我有一个报告record,其中TaxPercentagestring属性。

public record SaleReportDto
{
    public string TaxPercentage { get; set; } = string.Empty;
}

我使用C# Percentage Format Specifier设置税收百分比。

var report = new SaleReportDto()
{
    TaxPercentage = $"{0.18:P2}")
};

我是asserting上面的值在我的测试如下,

report.TaxPercentage.Should().Be($"{0.18:P2});

测试在我的windows机器上通过。当我在我的GitHub Actions上运行相同的测试时,我得到了不同的结果,测试assertion失败,并显示以下错误消息,
预期报表。TaxPercentage应为“18.00%”,长度为7,但“18.00%”的长度为6,在“%”附近不同(索引5)
为了暂时通过测试,我对assertion进行了如下更改

report.TaxPercentage.Contains("18");

为什么同一台机器中的assignmentassertion的值不同?我使用$"{0.18:P2}"assignassert。那么这应该在两种情况下生成相同的值。但事实并非如此。
有没有提示为什么会发生这种情况?我最初认为这可能是因为Culture,但是在assigningasserting中我没有使用任何特定的Culture。所以这两个地方应该返回相同的值。但是不确定为什么在GitHub Actions中不这样做。

nfs0ujit

nfs0ujit1#

我没有使用任何特定的文化。所以这两个地方应该返回相同的值。
这是不正确的。字符串插值默认使用"当前"区域性进行格式化,这取决于您运行程序的环境。因此,在不同的计算机上,它完全可能返回不同的结果。例如,在我的计算机上,您的字符串返回第三个变量:18,00 %.
如果您希望在所有可以运行此代码的计算机上获得相同的结果,请使用如下所示的任一固定区域性:

TaxPercentage = FormattableString.Invariant($"{0.18:P2}")

或者,如果这不是您想要的,则确定要使用哪种区域性来获得所需结果,然后显式使用它来进行格式设置,而不必依赖于它是否为当前区域性。

相关问题