ILogger 显示不正确的货币符号

ILogger displays incorrect currency Symbol

当我尝试使用 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.Program:Information: Amount ¤100.00

Amount 0.00

我知道为 ILogger 配置 CultureInfo 的方法,但我不想在每次编写时都指定它。另外,我认为这无关紧要,但代码是在 async 方法中执行的。

这是一个错误,我的期望不切实际,还是我做错了什么?

显然,这种行为的原因是日志不应特定于任何区域设置。我在 Microsoft.Extensions.Logging.Abstractions 存储库中搜索了解决方法或设置,但似乎没有办法避免这种行为。

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

FormattedLogValues 对象有一个静态缓存,由具有 LogValuesFormatter 值的格式字符串键入。这些格式化程序负责将消息和参数转换为字符串,并在调用 string.Format 时将文化显式设置为 CultureInfo.InvariantCulture。这就是使用货币格式说明符时显示 "scarab" 符号 (¤) 的原因。

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

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

感谢@Amy 和@PanagiotisKanavos 的所有帮助。