decimal.ToString("C") 在 Linux 上生成 ¤ 货币符号

Posted

技术标签:

【中文标题】decimal.ToString("C") 在 Linux 上生成 ¤ 货币符号【英文标题】:decimal.ToString("C") produces ¤ currency symbol on Linux 【发布时间】:2019-11-21 10:22:27 【问题描述】:

我有一个 ASP.NET Core 2.1 项目,我在其中通过 Razor html 页面呈现一些货币数字。

查看模型

class MyModel

    public decimal Money  get; set;  = 1.23

剃刀页面

@model MyModel
<p>@Model.Money.ToString("C")</p>

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

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

根据谷歌:

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

知道这两个操作系统之间有什么区别吗?我是否需要在 Linux 上明确设置文化或其他内容?

【问题讨论】:

默认使用不变文化 这有帮助吗? docs.microsoft.com/en-us/aspnet/core/fundamentals/… 【参考方案1】:

这是因为linux没有配置locale造成的。

您可以在程序中设置线程文化,如下所示:

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>();

【讨论】:

【参考方案2】:

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

我建议您使用此函数,其中 provider 是您的 CultureInfo 对象。

public string ToString (string format, IFormatProvider provider);

【讨论】:

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

以上是关于decimal.ToString("C") 在 Linux 上生成 ¤ 货币符号的主要内容,如果未能解决你的问题,请参考以下文章

如何在 decimal.ToString() 中传递两种不同的数字格式 [重复]

c#十进制toString()用逗号(,)转换

如何“填充”模板字符串

C语言中比较字符串大小的判断标准是啥?

c语言时间处理函数

找不到信封的 pem:"alg":"RS256","kid":"5a66482db3800c83c63","t