Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[c#] Konwersja string na double

KolegaZ 24 Jul 2008 09:15 16624 5
  • #1
    KolegaZ
    Level 11  
    Witam.
    Piszę prosty program dla częstotliwościomierza Agilent. Miernik zwraca mi wartość w zapisie naukowym, string (+4.6000045E+010), niestety nie mogę go wprost przekonwertować na double :cry:.
    Próbowałem użyć polecenia

    Code:
    zmienna_double = Double.Parse(zmienna_string);


    Proszę o pomoc. Pozdrawiam
  • #3
    ~sojer
    Level 27  
    Link

    Code:

    public static void Main()
    {
       // Set current thread culture to en-US.
       Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");

       string value;
       NumberStyles styles;

       // Parse a string in exponential notation with only the AllowExponent flag.
       value = "-1.063E-02";
       styles = NumberStyles.AllowExponent;
       ShowNumericValue(value, styles);

    }

    private static void ShowNumericValue(string value, NumberStyles styles)
    {
       double number;
       try
       {
          number = Double.Parse(value, styles);
          Console.WriteLine("Converted '{0}' using {1} to {2}.",
                            value, styles.ToString(), number);
       }
       catch (FormatException)
       {
          Console.WriteLine("Unable to parse '{0}' with styles {1}.",
                            value, styles.ToString());
       }
       Console.WriteLine();                           

  • #4
    KolegaZ
    Level 11  
    Dżyszla wrote:
    a
    Code:
    System.Convert.ToDouble()
    ?

    Niestety nie działa, ale stworzyłem procedure rozkładającą stringa na kawałki, który działa dobrze:


    Code:
    private double Recognise(string s)
    
            {
                double Base = 0, Power = 0;
                const char E10 = 'E';
                const char e10 = 'e';
                char[] delimiters = new char[] { E10, e10 };
                string[] resultArray = s.Split(delimiters);
                string[] output = new string[] {"",""};
                int i_Recognise = 0;
                foreach (String subString in resultArray)
                {
                    output[i_Recognise] += subString;
                    i_Recognise++;
                }
                i_Recognise = 0;
                output[0] = ReplaceDot(output[0]);
                Base = Convert.ToDouble(output[0]);
                Power = Convert.ToDouble(output[1]);
                return Base * Math.Pow(10, Power);
            }


    Wykorzystanie funkcji:
    Code:
    tmp_zmienna_pomierzona =  Recognise(tmp_response);


    Pozdrawiam
  • #5
    ~sojer
    Level 27  
    Proponowałbym zamienić:
    Code:
    tmp_zmienna_pomierzona =  Recognise(tmp_response);

    na:
    Code:
    try {
    
    tmp_zmienna_pomierzona = Double.Parse(tmp_response, NumberStyles.AllowExponent);}
    catch {
    tmp_zmienna_pomierzona = -9999;}


    Użycie twojej funkcji jest wysoce niewskazane. Nie można sobie założyć, że separatorem jest kropka, albo przecinek. Ten znak może być różny dla różnych ustawień regionalnych komputera.
  • #6
    KolegaZ
    Level 11  
    Owszewm kropka i przecinek zależą od ustawień regionalnych, jednak w funkcji nie ma żadnej wzmianki o konwersji "." -> "," :wink: . Do zamiany służy funkcja
    Code:

            private string ReplaceDot(string s)
            {
                return s.Replace(".", ","); ;
            }

    Separatorem jest "e" lub "E".
    Code:

    const char E10 = 'E';
                const char e10 = 'e';
                char[] delimiters = new char[] { E10, e10 };
                string[] resultArray = s.Split(delimiters);

    Pozdrawiam