【问题标题】:Converting a number with dot and comma to double will fail [duplicate]将带有点和逗号的数字转换为双精度将失败 [重复]
【发布时间】:2019-03-14 15:05:39
【问题描述】:

有一个看起来像“1.900,00”的字符串。如何将此字符串格式化为 1900 的小数?

使用:

decimal.TryParse("1.900,00", out var vkp)

会给我一个错误的结果。我该如何处理?

这是在线 C# 编译器的 URL:https://dotnetfiddle.net/B5EyyC

【问题讨论】:

  • NumberStyles.AllowThousands
  • @CodeCaster 我试过了:decimal.TryParse("1.900,00", NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out value1);没用。
  • 不变区域性使用, 作为千位分隔符,. 作为整数和小数部分之间的分隔符。

标签: c# parsing decimal


【解决方案1】:

您可以尝试使用CultureInfo,它使用'.' 作为千位分隔符,',' 作为小数分隔符(例如"de-DE")。还有合适的NumberStyles

string input = "1.900,00";
decimal.TryParse(input, 
    NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint, 
    CultureInfo.GetCultureInfo("de-DE"), out var output);

您甚至可以创建自己的 NumberFormatInfo 实例,您可以在其中以任何您喜欢的方式指定 NumberDecimalSeparatorNumberGroupSeparator

【讨论】:

    【解决方案2】:

    试试这个:

            string s = "1.900,00";
            s = s.Substring(0, s.LastIndexOf(",")).Replace(".", "") + "." + s.Substring(s.LastIndexOf(",") + 1);
            decimal vkp = 0;
            decimal.TryParse(s, out vkp);
    

    【讨论】:

      【解决方案3】:

      我猜你可以尝试以下方法:

      string number = "1.900,00";
      decimal.TryParse(number.Split(",")[0].Replace(".",""), out var vkp);
      

      如果您需要更简单的检查,您可以尝试创建一个函数来检查字符串是否包含“,”字符。

      public static bool ToDouble(string s, out double d)
      {
         if (s.Contains(","))
            return double.TryParse(s.Split(",")[0].Replace(".", ""), out d);
      
         return double.TryParse(s, out d);
      }
      

      您还可以通过以下方式获取本地化设置的小数点分隔符:

      string dsep = CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator
      

      【讨论】:

        【解决方案4】:

        Decimal.TryParse doc

        //using System.Globalization;   
        NumberStyles style = NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands;
        CultureInfo culture = CultureInfo.CreateSpecificCulture("es-ES");               
        Decimal vkp;        
        Decimal.TryParse("1.900,00", style, culture, out vkp);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-26
          • 1970-01-01
          • 2020-10-03
          • 1970-01-01
          相关资源
          最近更新 更多