2013-06-05 7 views
10

Wziąłem następujący kod z HexConverter - Unify Community WikiFormatException podczas korzystania z „X” dla szesnastkowym formatowania

string hex = color.r.ToString("X2") + color.g.ToString("X2") + color.b.ToString("X2"); 

To daje mi wyjątek:

FormatException: The specified format 'X2' is invalid 

próbowałem następnie użyć "D" ale nawet ten rzucił błąd. Jedyne, co działa, to "F do formatowania liczby zmiennoprzecinkowej.

Przejdź do deklaracji ujawnia mscorlib.dll/System/Single.ToString (ciąg) w przeglądarce zespołu - brzmi jak dotąd dobrze.

Googling dla monodevelop string format hex lub podobnych ciągów wyszukiwania nie wykazały nic ciekawego w odniesieniu do ograniczeń w MonoDevelop.

Czy jest coś, co można przygotować, zainicjować, zanim będzie można uzyskać prostą konwersję wartości heksadecymalnej?

[Aktualizacja] Kolor jest struct w Jedności:

public struct Color 
{ 
    public float r; 
    public float g; 
    public float b; 
    // ... 

Biorąc odpowiedź DTB w końcu dostał pracę przy użyciu:

int r = (int)(color.r * 256); 
    int g = (int)(color.g * 256); 
    int b = (int)(color.b * 256); 
    string hex = string.Format ("{0:X2}{1:X2}{2:X2}", r, g, b); 

więc brakowało mi fakt, że Color określa jego komponenty takie jak float zamiast int i wspomniano o dtb typu całkowego.

[Update-2] bardziej eleganckie rozwiązanie:

Color32 color32 = color; 
string hex = color32.r.ToString ("X2") + color32.g.ToString ("X2") + color32.b.ToString ("X2"); 
+1

możemy zobaczyć swój deklaracja koloru? lub jest to bezpośrednio z wiki? – emd

+0

Jako prosty test użyłem 'System.Drawing.Color.White.R.ToString (" X2 ")' i otrzymałem jako String return 'FF'. Więc tak, czym jest "kolor" w twoim przykładzie? – DonBoitnott

+0

@emd To jest struktura "Color" Unity. Na wiki używają 'Color32', który jest inny. Tak właśnie było w połączeniu z oświadczeniem dtb o typie 'Single'. Dzięki :-) – Kay

Odpowiedz

11

Od MSDN:

szesnastkowy ("X") w formacie specifier przekształca liczbę na łańcuch cyfr szesnastkowych . Przypadek specyfikatora formatu wskazuje, czy używać wielkich lub małych znaków dla cyfr szesnastkowych większych niż 9. Na przykład użyj "X", aby wytworzyć "ABCDEF", a "x", by wytworzyć "abcdef". Ten format jest obsługiwany tylko w przypadku typów integralnych.

Single jest typem zmiennoprzecinkowym, nie jest typem integralnym.

Użyć Int32:

int value = 10; 
string result = value.ToString("X2"); 
// result == "0A" 
+0

Wielkie dzięki. Używanie int działa tak, jak powinno - zobacz moje zaktualizowane pytanie. – Kay

Powiązane problemy