ILogger显示不正确的货币符号

时间:2018-08-06 14:30:13

标签: c# .net-core cultureinfo

当我尝试使用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:信息:金额¤100.00

     

金额$ 100.00

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

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

1 个答案:

答案 0 :(得分:0)

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

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

FormattedLogValues 对象具有一个静态高速缓存,该高速缓存由具有 LogValuesFormatter 值的格式字符串键入。这些格式化程序负责将消息和args转换为字符串,并在调用Log时将区域性明确设置为 CultureInfo.InvariantCulture 。这就是为什么使用货币格式说明符时会显示“ scarab”符号(¤)的原因。

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

string.Format

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