240

I have an integer that was generated from an android.graphics.Color.
It has a value of -16776961. How do I convert it into a hex string with the format #RRGGBB?

Simply put: I would like to output #0000FF from -16776961.

Note: I don't want the output to contain alpha and I have also tried this example with no success.

Mahozad
  • 18,032
  • 13
  • 118
  • 133
Bosah Chude
  • 3,670
  • 2
  • 22
  • 22
  • What are you trying to set the hex color on? I think there's a different answer here – Blundell Jun 30 '11 at 19:15
  • @Blundell Am exporting the color to an external application. The colour needs to be in this format #RRGGBB – Bosah Chude Jun 30 '11 at 19:26
  • So what's wrong with http://developer.android.com/reference/android/content/res/Resources.html#getColor(int) ? You'll have to paste the url or scroll to getColor(int) – Blundell Jun 30 '11 at 19:28
  • Am getting the raw integers. The values are not from a resource ow widget – Bosah Chude Jun 30 '11 at 19:50

13 Answers13

561

The mask makes sure you only get RRGGBB, and the %06X gives you zero-padded hex (always 6 chars long):

String hexColor = String.format("#%06X", (0xFFFFFF & intColor));
Josh
  • 10,618
  • 2
  • 32
  • 36
61

Try Integer.toHexString()

Source: In Java, how do I convert a byte array to a string of hex digits while keeping leading zeros?

Community
  • 1
  • 1
ming_codes
  • 2,870
  • 25
  • 24
  • 7
    This answer retains the alpha of the color – Bosah Chude Jun 30 '11 at 19:28
  • 3
    Well, if you want to get rid of the alpha, just create a bit mask for it: Integer.toHexString(value & 0x00FFFFFF) – ming_codes Jun 30 '11 at 19:41
  • 3
    Java int type is 4 bytes long. According to android.graphics.Color's documentation, the leftest byte is the alpha channel. By using a bit wise AND operation with the value 0x00FFFFFF, you essentially clears the leftest byte (alpha channel) to 0. When used with Integer.toHexString, it'll just leave the rest of the 3 bytes in String. All non-significant digits will be dropped from the call, so if you want the leading zeroes, you may have to prepend that in yourself. – ming_codes Jun 30 '11 at 20:04
  • 1
    Doesn't work for `0x000000FF`, or `0xFF0000FF` if you remove the alpha. – TWiStErRob Sep 23 '16 at 17:50
30

I believe i have found the answer, This code converts the integer to a hex string an removes the alpha.

Integer intColor = -16895234;
String hexColor = "#" + Integer.toHexString(intColor).substring(2);

Note only use this code if you are sure that removing the alpha would not affect anything.

Bosah Chude
  • 3,670
  • 2
  • 22
  • 22
15

You can use this for color without alpha:

String hexColor = String.format("#%06X", (0xFFFFFF & intColor));

or this with alpha:

String hexColor = String.format("#%08X", (0xFFFFFFFF & intColor));
blueware
  • 5,205
  • 1
  • 40
  • 60
14

Integer value of ARGB color to hexadecimal string:

String hex = Integer.toHexString(color); // example for green color FF00FF00

Hexadecimal string to integer value of ARGB color:

int color = (Integer.parseInt( hex.substring( 0,2 ), 16) << 24) + Integer.parseInt( hex.substring( 2 ), 16);
Style-7
  • 985
  • 12
  • 27
10

Here is what i did

 int color=//your color
 Integer.toHexString(color).toUpperCase();//upercase with alpha
 Integer.toHexString(color).toUpperCase().substring(2);// uppercase without alpha

Thanks guys you answers did the thing

Diljeet
  • 1,896
  • 20
  • 24
4

With this method Integer.toHexString, you can have an Unknown color exception for some colors when using Color.parseColor.

And with this method String.format("#%06X", (0xFFFFFF & intColor)), you'll lose alpha value.

So I recommend this method:

public static String ColorToHex(int color) {
        int alpha = android.graphics.Color.alpha(color);
        int blue = android.graphics.Color.blue(color);
        int green = android.graphics.Color.green(color);
        int red = android.graphics.Color.red(color);

        String alphaHex = To00Hex(alpha);
        String blueHex = To00Hex(blue);
        String greenHex = To00Hex(green);
        String redHex = To00Hex(red);

        // hexBinary value: aabbggrr
        StringBuilder str = new StringBuilder("#");
        str.append(alphaHex);
        str.append(blueHex);
        str.append(greenHex);
        str.append(redHex );

        return str.toString();
    }

    private static String To00Hex(int value) {
        String hex = "00".concat(Integer.toHexString(value));
        return hex.substring(hex.length()-2, hex.length());
    }
Simon
  • 1,890
  • 19
  • 26
3

If you use Integer.toHexString you will end-up with missed zeros when you convert colors like 0xFF000123. Here is my kotlin based solution which doesn't require neither android specific classes nor java. So you could use it in multiplatform project as well:

    fun Int.toRgbString(): String =
        "#${red.toStringComponent()}${green.toStringComponent()}${blue.toStringComponent()}".toUpperCase()

    fun Int.toArgbString(): String =
        "#${alpha.toStringComponent()}${red.toStringComponent()}${green.toStringComponent()}${blue.toStringComponent()}".toUpperCase()

    private fun Int.toStringComponent(): String =
        this.toString(16).let { if (it.length == 1) "0${it}" else it }

    inline val Int.alpha: Int
        get() = (this shr 24) and 0xFF

    inline val Int.red: Int
        get() = (this shr 16) and 0xFF

    inline val Int.green: Int
        get() = (this shr 8) and 0xFF

    inline val Int.blue: Int
        get() = this and 0xFF
Oleksandr Albul
  • 1,611
  • 1
  • 23
  • 31
1

Simon's solution works well, alpha supported and color cases with a leading "zero" values in R, G, B, A, hex are not being ignored. A slightly modified version for java Color to hex String conversion is:

    public static String ColorToHex (Color color) {
    int red = color.getRed();
    int green = color.getGreen();
    int blue = color.getBlue();
    int alpha = color.getAlpha(); 

    String redHex = To00Hex(red);
    String greenHex = To00Hex(green);
    String blueHex = To00Hex(blue);
    String alphaHex = To00Hex(alpha);

    // hexBinary value: RRGGBBAA
    StringBuilder str = new StringBuilder("#");
    str.append(redHex);
    str.append(greenHex);
    str.append(blueHex);
    str.append(alphaHex);

    return str.toString();
}

private static String To00Hex(int value) {
    String hex = "00".concat(Integer.toHexString(value));
    hex=hex.toUpperCase();
    return hex.substring(hex.length()-2, hex.length());
} 

another solution could be:

public static String rgbToHex (Color color) {

   String hex = String.format("#%02x%02x%02x%02x", color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha() );
   hex=hex.toUpperCase();
       return hex;
}
jazznbass
  • 24
  • 6
0
String int2string = Integer.toHexString(INTEGERColor); //to ARGB
String HtmlColor = "#"+ int2string.substring(int2string.length() - 6, int2string.length()); // a stupid way to append your color
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
chundk
  • 1
  • 1
0

use this way in Koltin

var hexColor = "#${Integer.toHexString(ContextCompat.getColor(context, R.color.colorTest))}"
Rasoul Miri
  • 11,234
  • 1
  • 68
  • 78
0

Fixing alpha issue in Color picker libraries.

if you get an integer value in return when you pick color first convert it into the hex color.

    String hexVal = String.format("#%06X", (0xFFFFFFFF & 
    color)).toUpperCase();

    int length=hexVal.length();
    String withoutHash=hexVal.substring(1,length);


    while (withoutHash.length()<=7)
    {

        withoutHash="0"+withoutHash;

    }
    hexVal ="#"+withoutHash;
Adnan Malik
  • 67
  • 1
  • 3
0

Here is the new Kotlin 1.9.0 standard library HexFormat:
(don't forget to add @OptIn(ExperimentalStdlibApi::class) where needed)

val myHexFormat = HexFormat {
    upperCase = false
    number.prefix = "#"
    number.removeLeadingZeros = true
}
val myInt = 0xb40e89
myInt.toHexString(myHexFormat)         // #b40e89

You could also use the Kotlin predefined HexFormats:

val myInt = 0xb40e89
myInt.toHexString(HexFormat.Default)   // 00b40e89
myInt.toHexString(HexFormat.UpperCase) // 00B40E89

To exclude the alpha from an ARGB integer, do this workaround:

(myInt and 0xFFFFFF).toHexString(myHexFormat)

And vote for this issue: Cannot ignore alpha when formatting with HexFormat

Mahozad
  • 18,032
  • 13
  • 118
  • 133