代码之家  ›  专栏  ›  技术社区  ›  Daniel Gimenez

ilogger显示错误的货币符号

  •  2
  • Daniel Gimenez  · 技术社区  · 7 年前

    当我尝试使用货币格式说明符输出数值时, ILogger.LogInformation() 我得到一个意想不到的符号不同于我使用 Console.Log(string.Format()) . 后者显示预期的美元符号作为符号,前者显示无法打印的内容。

    样本代码

    var services = new ServiceCollection();
    services.AddLogging(x =>
    {
        x.AddDebug();
        x.AddConsole();
    });
    var svcProvider = services.BuildServiceProvider();
    var logger = svcProvider.GetRequiredService<ILoggerFactory().CreateLogger<Program>();
    logger.LogInformation("Amount {0:C}", 100.0);
    System.Diagnostics.Debug.WriteLine(string.Format("Amount {0:C}", 100.0));
    

    调试输出

    XYZ.计划:信息:金额100.00元

    金额$100.00

    我知道如何为iLoger配置CultureInfo,我不想每次编写时都指定它。另外,我不认为这是相关的,但是代码是在 async 方法。

    所以这是一个错误,我的期望是不现实的,还是我做错了什么?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Daniel Gimenez    7 年前

    显然,这种行为的原因是日志不应该特定于任何区域设置。我在microsoft.extensions.logging.abstractions repo中搜索了一个关于或设置的工作,但似乎没有办法规避这种行为。

    (几乎)所有的日志记录方法 伊洛格 来自静态扩展类, 日志扩展 ( 伊洛格 定义一个 Log 直接使用会很痛苦的方法)。该类中的所有方法最终都会调用相同的 原木 将消息格式及其参数转换为 格式化日志值 对象。

    这个 格式化日志值 对象的静态缓存由格式字符串键控,其值为 参数的日志值 . 这些格式化程序负责将消息和参数转换为字符串,并将区域性显式设置为 CultureInfo.InvariantCulture 打电话时 string.Format . 这就是使用货币格式说明符时显示“scarab”符号(·的原因。

    因为我知道我所有的金额都将以美元为单位,所以最简单和最正确的解决方案是避免使用客户数字格式字符串的货币说明符。

    logger.LogInformation("Amount {0:$#,##0.00}", 100.0);
    

    感谢@amy和@panagiotiskanavos的帮助。