使用 "X" 进行十六进制格式化时出现 FormatException 错误

14

我从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(string),听起来很不错。

谷歌搜索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
你能给我们看一下你的颜色声明吗?还是直接从维基百科上获取的? - emd
作为一个简单的测试,我使用了 System.Drawing.Color.White.R.ToString("X2") 并得到了字符串返回值 FF。那么,在你的例子中,“color”是什么? - DonBoitnott
@emd 这是Unity的Color结构体。在维基百科中,他们使用的是不同的Color32。这就是与dtb有关类型Single的声明的结合点。谢谢 :-) - Kay
1个回答

16

来自MSDN:

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

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

请使用 Int32

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

非常感谢。使用int类型,它的工作原理和预期相同 - 请参见我的更新问题。 - Kay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接