C# 十进制.ToString(“C”产生¤;Linux上的货币符号

C# 十进制.ToString(“C”产生¤;Linux上的货币符号,c#,asp.net-core,razor,.net-core,C#,Asp.net Core,Razor,.net Core,我有一个ASP.NETCore2.1项目,我正在通过一个RazorHTML页面呈现一些货币数字 查看模型 class MyModel { public decimal Money { get; set; } = 1.23 } 剃须刀页面 @model MyModel <p>@Model.Money.ToString("C")</p> @model-MyModel @模型.货币.ToString(“C”) 此项目已部署到Azure应用程序服务 在Windows

我有一个ASP.NETCore2.1项目,我正在通过一个RazorHTML页面呈现一些货币数字

查看模型

class MyModel
{
    public decimal Money { get; set; } = 1.23
}
剃须刀页面

@model MyModel
<p>@Model.Money.ToString("C")</p>
@model-MyModel
@模型.货币.ToString(“C”)

此项目已部署到Azure应用程序服务

在Windows应用程序服务计划(以及我的本地Windows 10计算机)上,这会产生预期的“$1.23”。但是,如果我将同一个项目部署到Linux应用程序服务计划中,它会显示“1.23”

据谷歌称:

货币符号(·)是用于表示未指定货币的字符


你知道这两个操作系统有什么不同吗?是否需要在Linux上显式设置区域性或其他内容?

您的代码运行的是什么区域性?我猜azure不了解当前的文化,正在向您展示一个通用的货币符号

我建议您使用此函数,其中提供程序是您的CultureInfo对象

public string ToString (string format, IFormatProvider provider);

这是因为linux没有配置区域设置

您可以在程序中设置线程区域性,如下所示:

public class Program
{
    public static void Main(string[] args)
    {
        CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en-US");
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}
公共类程序
{
公共静态void Main(字符串[]args)
{
CultureInfo.DefaultThreadCurrentCulture=新的CultureInfo(“en-US”);
CreateWebHostBuilder(args.Build().Run();
}
公共静态IWebHostBuilder CreateWebHostBuilder(字符串[]args)=>
WebHost.CreateDefaultBuilder(args)
.UseStartup();
}

据我所知,尚未设置区域性。我以前从未为应用程序设置过区域性,因为这在Windows上不是问题。我猜在这些Linux机器上明确需要区域性?在每次类型转换和ToString函数调用上设置区域性仍然是一种好的做法。您可以使用默认区域性运行程序,使用点“.”作为小数点分隔符,但客户将拥有一个区域性,分隔符为逗号“,”@Bestter不传递区域性,它默认为当前线程的区域性,它从
NumberFormatInfo.CurrentInfo
获取。没有必要在每次
ToString
调用中传递区域性。@艾米:在某种程度上你是对的,但这始终取决于你的上下文。您可以让客户自定义is语言,然后需要将区域性传递给每个ToString和Parse函数。或者你可以控制当前的线程区域性,就像你说的。它使用默认的不变区域性。这有帮助吗?