C# .net核心应用程序在linux docker容器中解析小数

C# .net核心应用程序在linux docker容器中解析小数,c#,parsing,.net-core,cross-platform,globalization,C#,Parsing,.net Core,Cross Platform,Globalization,在.net core 2.0.0应用程序中,当应用程序在windows开发计算机上运行时,以下代码可以正常工作。 当应用程序部署在linux docker容器中时,它会失败,并显示异常消息:System.FormatException:“输入字符串的格式不正确。” 为什么??解决办法是什么 class Program { static void Main(string[] args) { var value = "$291.00"; var valueAs

在.net core 2.0.0应用程序中,当应用程序在windows开发计算机上运行时,以下代码可以正常工作。 当应用程序部署在linux docker容器中时,它会失败,并显示异常消息:System.FormatException:“输入字符串的格式不正确。”

为什么??解决办法是什么

class Program {
    static void Main(string[] args) {
        var value = "$291.00";
        var valueAsDecimal = decimal.Parse(value, System.Globalization.NumberStyles.Any);
        Console.WriteLine(valueAsDecimal);
        Console.ReadLine();
    }
}

货币符号是特定于区域设置的。你检查过文化设置是什么吗

如果总是要使用“$”和“.”,请使用格式提供程序

 var valueAsDecimal = decimal.Parse(
     value, 
     NumberStyles.Any, 
     new CultureInfo("en-AU");

这是有效的代码。我必须手动设置正确的文化。 感谢Richard Schneider和Evk为您提供的指导意见

class Program {
    static readonly CultureInfo USEnglish = new CultureInfo("en-US");
    static void Main(string[] args) {
        var value = "$291.00";
        var valueAsDecimal = decimal.Parse(value, System.Globalization.NumberStyles.Any, USEnglish);
        Console.WriteLine(valueAsDecimal);
        Console.ReadLine();
    }
}
microsoft/dotnet:2.0-runtime AS base中docker容器
上运行的默认区域性似乎是不变区域性:


由于解析时不指定区域性,因此它使用当前区域性进行解析。解析时始终提供区域性。如果您正在运行基于alpine的dotnet运行时映像,则还需要安装ICU cultures包并在dockerfile中禁用全球化不变模式:
RUN apk add--no cache ICU libs ENV dotnet_SYSTEM_Globalization_Invariant=false
Reference: