gpt4 book ai didi

c# - ILogger 显示不正确的货币符号

转载 作者:太空宇宙 更新时间:2023-11-03 14:51:14 27 4
gpt4 key购买 nike

当我尝试使用 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 $100.00

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

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

最佳答案

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

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

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

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

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

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

关于c# - ILogger 显示不正确的货币符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51709972/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com