使用“X”进行十六进制格式化时的FormatException

时间:2013-06-05 17:10:48

标签: c# unity3d monodevelop string-formatting

我从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(字符串) - 到目前为止听起来不错。

搜索 monodevelop字符串格式hex 或类似的搜索字符串没有显示有关MonoDevelop中的限制的任何有趣内容。

那么有什么准备,初始化,......在我能得到一个简单的十六进制值转换之前?

[更新] Color是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 个答案:

答案 0 :(得分:14)

来自MSDN

  

十六进制(“X”)格式说明符将数字转换为十六进制数字字符串。格式说明符的大小写表示是否对大于9的十六进制数字使用大写或小写字符。例如,使用“X”生成“ABCDEF”,使用“x”生成“abcdef”。 仅对整数类型支持此格式。

Single是浮点类型,不是整数类型。

使用Int32

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