【问题标题】:Converting string to double in C#在 C# 中将字符串转换为双精度
【发布时间】:2012-07-09 02:39:07
【问题描述】:

我有一个长字符串,其中包含由# -value1#value2#value3# 等分隔的双类型值

我将它拆分为字符串表。然后,我想将此表中的每个元素转换为双精度类型,但出现错误。这里的类型转换有什么问题?

string a = "52.8725945#18.69872650000002#50.9028073#14.971600200000012#51.260062#15.5859949000000662452.23862099999999#19.372202799999250800000045#51.7808372#19.474096499999973#";
string[] someArray = a.Split(new char[] { '#' });
for (int i = 0; i < someArray.Length; i++)
{
    Console.WriteLine(someArray[i]); // correct value
    Convert.ToDouble(someArray[i]); // error
}

【问题讨论】:

  • 什么错误?它对我来说很好......
  • @DaveBish 尝试遍历所有这些,您会发现索引 5 是一个错误的字符串,无法转换为双精度。
  • @StefanH:当然,但是索引 0 似乎很好。
  • 您的一个输入值有两位小数。
  • 查看字符串tablicaLatLng[0] 的字节数,应该会告诉你哪里出了问题。

标签: c# string double type-conversion


【解决方案1】:

你可以试试这个例子。一个简单的C#程序将字符串转换为双精度

class Calculations{

protected double length;
protected double height;
protected double width;

public void get_data(){

this.length = Convert.ToDouble(Console.ReadLine());
this.width  = Convert.ToDouble(Console.ReadLine());
this.height = Convert.ToDouble(Console.ReadLine());

   }
}

【讨论】:

    【解决方案2】:

    有 3 个问题。

    1) 小数点分隔符不正确

    不同的文化使用不同的小数分隔符(即,.)。

    如果您将. 替换为,,它应该会按预期工作:

    Console.WriteLine(Convert.ToDouble("52,8725945"));
    

    您可以使用将文化作为第二个参数的重载方法解析您的双打。在这种情况下,您可以使用 InvariantCulture (What is the invariant culture) 例如使用double.Parse:

    double.Parse("52.8725945", System.Globalization.CultureInfo.InvariantCulture);
    

    您还应该看看double.TryParse,您可以将它与许多选项一起使用,检查您的字符串是否是有效的double 特别有用。

    2) 你的替身不正确

    您的某个值不正确,因为它包含两个点:

    15.5859949000000662452.23862099999999

    3) 你的数组末尾有一个空值,这是一个不正确的双精度数

    您可以使用重载的Split 来删除空值:

    string[] someArray = a.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries);

    【讨论】:

    • 感谢您的反对和解释。我已经尝试使用. 转换版本,它给了我StringFormatException,当我将其更改为, 时它起作用了(文化:pl_PL)。这也是他的问题的答案(关于第一个 double)。
    • 是的,用, 替换. 工作正常,但我必须用. 获得一个值,而不是,(对于google api - lat 和lng 需要'.') .
    • +1 好收获。你能告诉@whoah 如何“改变文化”进行解析吗?还是在不同的文化中解析?
    • @Robl 肯定的,它曾经发生在我身上,所以这是我的第一件事:P
    • 太棒了!这很完美:)你能告诉我,这部分是什么意思吗? System.Globalization.CultureInfo.InvariantCulture?非常感谢您的帮助,问候!
    【解决方案3】:

    将类添加为 Public 并像 convertToInt32() 一样轻松使用它

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Web;
    
      /// <summary>
      /// Summary description for Common
      /// </summary>
      public static class Common
      {
         public static double ConvertToDouble(string Value) {
            if (Value == null) {
               return 0;
            }
            else {
               double OutVal;
               double.TryParse(Value, out OutVal);
    
               if (double.IsNaN(OutVal) || double.IsInfinity(OutVal)) {
                  return 0;
               }
               return OutVal;
            }
         }
      }
    

    然后调用函数

    double DirectExpense =  Common.ConvertToDouble(dr["DrAmount"].ToString());
    

    【讨论】:

      【解决方案4】:
      private double ConvertToDouble(string s)
          {
              char systemSeparator = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator[0];
              double result = 0;
              try
              {
                  if (s != null)
                      if (!s.Contains(","))
                          result = double.Parse(s, CultureInfo.InvariantCulture);
                      else
                          result = Convert.ToDouble(s.Replace(".", systemSeparator.ToString()).Replace(",", systemSeparator.ToString()));
              }
              catch (Exception e)
              {
                  try
                  {
                      result = Convert.ToDouble(s);
                  }
                  catch
                  {
                      try
                      {
                          result = Convert.ToDouble(s.Replace(",", ";").Replace(".", ",").Replace(";", "."));
                      }
                      catch {
                          throw new Exception("Wrong string-to-double format");
                      }
                  }
              }
              return result;
          }
      

      成功通过的测试是:

              Debug.Assert(ConvertToDouble("1.000.007") == 1000007.00);
              Debug.Assert(ConvertToDouble("1.000.007,00") == 1000007.00);
              Debug.Assert(ConvertToDouble("1.000,07") == 1000.07);
              Debug.Assert(ConvertToDouble("1,000,007") == 1000007.00);
              Debug.Assert(ConvertToDouble("1,000,000.07") == 1000000.07);
              Debug.Assert(ConvertToDouble("1,007") == 1.007);
              Debug.Assert(ConvertToDouble("1.07") == 1.07);
              Debug.Assert(ConvertToDouble("1.007") == 1007.00);
              Debug.Assert(ConvertToDouble("1.000.007E-08") == 0.07);
              Debug.Assert(ConvertToDouble("1,000,007E-08") == 0.07);
      

      【讨论】:

        【解决方案5】:

        大多数人已经尝试回答您的问题。
        如果你还在调试,有没有想过使用:

        Double.TryParse(String, Double);
        

        这将帮助您在进行实际解析之前首先确定每个字符串中的错误。
        如果您有文化相关的问题,您可以考虑使用:

        Double.TryParse(String, NumberStyles, IFormatProvider, Double);
        

        http://msdn.microsoft.com/en-us/library/system.double.tryparse.aspx 有一个很好的例子来说明如何使用它们。

        如果您需要 long,也可以使用 Int64.TryParse:http://msdn.microsoft.com/en-us/library/system.int64.tryparse.aspx

        希望对您有所帮助。

        【讨论】:

        • 但是没有一个名为 TryParse 的方法。
        【解决方案6】:

        在您的字符串中,我看到:15.5859949000000662452.23862099999999 这不是双精度数(它有两个小数点)。也许这只是一个合法的输入错误?

        您可能还想弄清楚您的最后一个 String 是否为空,并考虑这种情况。

        【讨论】:

          猜你喜欢
          • 2013-10-10
          • 2015-04-10
          • 1970-01-01
          • 2022-01-20
          • 1970-01-01
          • 2014-01-01
          • 1970-01-01
          相关资源
          最近更新 更多