web-dev-qa-db-ja.com

16進数のString.Format

以下のコードでは、colorstingは常に#DDDDを提供します。これを修正するにはどうすればいいですか?

string colorstring;
int Blue = 13;
int Green = 0;
int Red = 0;
int Space = 14;
colorstring = String.Format("#{0:X}{0:X}{0:X}{0:X}", Blue, Green, Red, Space);
35
codematrix

人数、個数、総数 0 in {0:X}は、リストまたは引数内の位置を指します。この場合 0は、最初の値であるBlueを使用することを意味します。つかいます {1:X} 2番目の引数(Green)など。

colorstring = String.Format("#{0:X}{1:X}{2:X}{3:X}", Blue, Green, Red, Space);

Formatパラメーターの構文は documentation で説明されています:

書式の構文

各フォーマット項目は次の形式を取り、次のコンポーネントで構成されます。

{ index[,alignment][:formatString]}

一致する中括弧( "{"および "}")が必要です。

インデックスコンポーネント

パラメータ指定子とも呼ばれる必須のインデックスコンポーネントは、0から始まる番号で、オブジェクトのリスト内の対応するアイテムを識別します。つまり、パラメーター指定子が0のフォーマットアイテムはリストの最初のオブジェクトをフォーマットし、パラメーター指定子が1のフォーマットアイテムはリストの2番目のオブジェクトをフォーマットします。

同じパラメーター指定子を指定することにより、複数のフォーマット項目がオブジェクトのリスト内の同じ要素を参照できます。たとえば、「{0:X} {0:E} {0:N}」のような複合フォーマット文字列を指定することにより、同じ数値を16進数、科学、および数値形式でフォーマットできます。

各フォーマット項目は、リスト内の任意のオブジェクトを参照できます。たとえば、3つのオブジェクトがある場合、「{1} {0} {2}」のような複合フォーマット文字列を指定することにより、2番目、1番目、および3番目のオブジェクトをフォーマットできます。書式項目によって参照されていないオブジェクトは無視されます。パラメーター指定子がオブジェクトのリストの境界外のアイテムを指定すると、ランタイム例外が発生します。

アライメント成分

オプションの配置コンポーネントは、優先フォーマットされたフィールド幅を示す符号付き整数です。 alignmentの値がフォーマットされた文字列の長さより小さい場合、アライメントは無視され、フォーマットされた文字列の長さがフィールド幅として使用されます。フィールド内の書式設定されたデータは、位置合わせが正の場合は右揃え、位置合わせが負の場合は左揃えです。パディングが必要な場合、空白が使用されます。配置が指定されている場合は、コンマが必要です。

フォーマット文字列コンポーネント

オプションのformatStringコンポーネントは、フォーマットされるオブジェクトのタイプに適したフォーマット文字列です。対応するオブジェクトが数値の場合は標準またはカスタムの数値書式文字列を、対応するオブジェクトがDateTimeオブジェクトの場合は標準またはカスタムの日時書式文字列を、対応するオブジェクトが列挙値の場合は列挙書式文字列を指定します。 formatStringが指定されていない場合、数値、日付と時刻、または列挙型の一般的な( "G")形式指定子が使用されます。 formatStringが指定されている場合、コロンが必要です。

あなたの場合、インデックスとフォーマット文字列しか持っていないことに注意してください。位置合わせコンポーネントを指定していません(必要ありません)。

60
Mark Byers

次のように、Xの後に数字を含めることによって、左の文字を埋め込むこともできます。string.format("0x{0:X8}", string_to_modify)、これは"0x00000C20"

37
JGeerWM

合成されたUInt32カラーValueを.NETのCSSに変換

質問は3つの入力値(redgreenblue)に適用されることを知っています。ただし、すでに32ビットのValueが構成されている場合があります。データをHTML CSSレンダラーに送信したいようです(#HEX形式のため)。実際には、CSSでは、6個または少なくとも3個のゼロで埋められた16進数をここに印刷することを求めています。そう #{0:X06} または #{0:X03}が必要です。奇妙な動作のため、これは常に6桁ではなく8桁を出力します。

これを解決する:

String.Format("#{0:X02}{1:X02}{2:X02}", (Value & 0x00FF0000) >> 16, (Value & 0x0000FF00) >> 8, (Value & 0x000000FF) >> 0)
3
mschmoock

より一般的に。

byte[] buf = new byte[] { 123, 2, 233 };

string s = String.Concat(buf.Select(b => b.ToString("X2")));
2
Luke Puplett

整数値をCOLORに変換する関数が組み込まれている場合は、心配する必要はありません。

string hexValue = string.Format("{0:X}", intColor);

Color brushes = System.Drawing.ColorTranslator.FromHtml("#"+hexValue);
2
Pranjal Jain