How to convert #ffffff
to #fff
or #fff
to #ffffff
for Assertion?
I am using getCssValue(\"background\") from Sele
You can use replaceAll
with a regular expression that looks for the case where all three parts use the same digit:
static String getHex(int r, int g, int b) {
return String.format("#%02x%02x%02x", r, g, b).replaceAll("^#([a-fA-F])\\1([a-fA-F])\\2([a-fA-F])\\3$", "#$1$2$3");
}
That looks for a string starting with #
followed by three pairs of matching hex digits, and replaces them with just the short form. (I suppose I could have just used [a-f]
instead of [a-fA-F]
in your specific example, since you know you'll be getting lower case only, but...)
Complete example (on Ideone):
public class Example {
public static void main(String[] args) {
System.out.println(getHex(255, 255, 255)); // #fff
System.out.println(getHex(255, 240, 255)); // #fff0ff
}
static String getHex(int r, int g, int b) {
return String.format("#%02x%02x%02x", r, g, b).replaceAll("^#([a-fA-F])\\1([a-fA-F])\\2([a-fA-F])\\3$", "#$1$2$3");
}
}
You could write a simple method that "normalizes" your HTML color codes to short or long format if they have all the same hex digits:
public static void main(String[] args) {
System.out.println(normalizeHtmlColors("#ffffff", true));
System.out.println(normalizeHtmlColors("#fff", true));
System.out.println(normalizeHtmlColors("#ffffff", false));
System.out.println(normalizeHtmlColors("#fff", false));
}
public static String normalizeHtmlColors(String colorCode, boolean toShort) {
if (toShort && colorCode.matches("^#?([0-9a-fA-F])\\1{5}$"))
colorCode = colorCode.replaceFirst("#?([0-9a-fA-F])\\1{5}", "#$1$1$1");
else if (!toShort && colorCode.matches("^#?([0-9a-fA-F])\\1{2}$"))
colorCode = colorCode.replaceFirst("#?([0-9a-fA-F])\\1{2}", "#$1$1$1$1$1$1");
return colorCode;
}
This would print:
#fff
#fff
#ffffff
#ffffff
...so you can decide in which direction to transform. If the input doesn't match the two cases, it will just be returned.