FormatException при использовании "X" для шестнадцатеричного форматирования
Я взял следующий код из HexConverter - Unify Community Wiki
string hex = color.r.ToString("X2") + color.g.ToString("X2") + color.b.ToString("X2");
Это дает мне исключение:
FormatException: The specified format 'X2' is invalid
Я попытался использовать "D"
, но даже это заставило ошибку. Единственное, что работает, - это "F
для форматирования чисел с плавающей запятой.
Перейти к объявлению показывает mscorlib.dll/System/Single.ToString(строка) в браузере сборок - пока звучит неплохо.
Googling для monodevelop string format hex или похожих строк поиска не показал ничего интересного в отношении ограничений в MonoDevelop.
Итак, есть что подготовить, инициализировать... прежде чем я получу простое шестнадцатеричное преобразование?
[Обновление]
Цвет - это структура в Unity:
public struct Color
{
public float r;
public float g;
public float b;
// ...
Взяв ответ dtb, я, наконец, получил его, используя:
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);
Таким образом, я упустил тот факт, что Color
определяет его компоненты как float
вместо int
, и упомянула вещь типа dtb интегральных типов.
[Обновление-2]
Более элегантное решение:
Color32 color32 = color;
string hex = color32.r.ToString ("X2") + color32.g.ToString ("X2") + color32.b.ToString ("X2");
Ответы
Ответ 1
От MSDN:
Спецификатор формата шестнадцатеричного ( "X" ) преобразует число в строку шестнадцатеричных цифр. Случай спецификатора формата указывает, следует ли использовать символы верхнего и нижнего регистра для шестнадцатеричных цифр, которые больше 9. Например, используйте "X" для создания "ABCDEF" и "x" для создания "abcdef". Этот формат поддерживается только для интегральных типов.
Single
- тип с плавающей точкой, а не интегральный тип.
Используйте Int32
:
int value = 10;
string result = value.ToString("X2");
// result == "0A"