Saturday, December 19, 2009

Formatting a value in hex

Q: Given an integer value, say 42, how do we print its hex value in the following formats in C, C++, C#, Ruby:

1.    "i=2a;"
2.    "i=  2a;"
3.    "i=2a  ;"
4.    "i=002a;"
5.    "i=0x2a;"
6.    "i=0x002a;"
7.    "i=2A;"
8.    "i=  2A;"
9.    "i=2A  ;"
10.   "i=002A;"
11.   "i=0X2A;"
12.   "i=0X002A;"

(The semi-colon is to allow us to easily see the extent of the number field.)


C:

Using the C standard Streams library's printf():

1.  printf("i=%x;\n", i);
2.  printf("i=%4x;\n", i);
3.  printf("i=%-4x;\n", i);
4.  printf("i=%04x;\n", i);
5.  printf("i=0x%x;\n", i);
6.  printf("i=0x%04x;\n", i);
7.  printf("i=%X;\n", i);
8.  printf("i=%4X;\n", i);
9.  printf("i=%-4X;\n", i);
10. printf("i=%04X;\n", i);
11. printf("i=0X%X;\n", i);
12. printf("i=0X%04X;\n", i);


C++:

Using the C++ standard IOStreams library:

1.  std::cout << "i=" << std::setbase(16) << i << ";" << std::endl;
2.  std::cout << "i=" << std::setbase(16) << std::setw(4) << std::setfill(' ') << i << ";" << std::endl;
3.  don't know
4.  std::cout << "i=" << std::setbase(16) << std::setw(4) << std::setfill('0') << i << ";" << std::endl;
5.  std::cout << "i=0x" << std::setbase(16) << i << ";" << std::endl;
6.  std::cout << "i=0x" << std::setbase(16) << std::setw(4) << std::setfill('0') << i << ";" << std::endl;
7.  std::cout << "i=" << std::setbase(16) << std::uppercase << i << ";" << std::endl;
8.  std::cout << "i=" << std::setbase(16) << std::uppercase << std::setw(4) << std::setfill(' ') << i << ";" << std::endl;
9.  don't know
10. std::cout << "i=" << std::setbase(16) << std::uppercase << std::setw(4) << std::setfill('0') << i << ";" << std::endl;
11. std::cout << "i=0X" << std::setbase(16) << std::uppercase << i << ";" << std::endl;
12. std::cout << "i=0X" << std::setbase(16) << std::uppercase << std::setw(4) << std::setfill('0') << i << ";" << std::endl;


Using FastFormat's Format:

1.  ff::fmtln(std::cout, "i={0};", ff::to_x(i));
2.  ff::fmtln(std::cout, "i={0};", ff::to_x(i, 4));
3.  ff::fmtln(std::cout, "i={0};", ff::to_x(i, -4));
4.  ff::fmtln(std::cout, "i={0};", ff::to_x(i, 4, 4));
5.  ff::fmtln(std::cout, "i=0x{0};", ff::to_x(i));
6.  ff::fmtln(std::cout, "i=0x{0};", ff::to_x(i, 4, 4));
7.  ff::fmtln(std::cout, "i={0};", ff::to_X(i));
8.  ff::fmtln(std::cout, "i={0};", ff::to_X(i, 4));
9.  ff::fmtln(std::cout, "i={0};", ff::to_X(i, -4));
10. ff::fmtln(std::cout, "i={0};", ff::to_X(i, 4, 4));
11. ff::fmtln(std::cout, "i=0X{0};", ff::to_X(i));
12. ff::fmtln(std::cout, "i=0X{0};", ff::to_X(i, 4, 4));


Using FastFormat's Write:

1.  ff::writeln(std::cout, "i=", ff::to_x(i), ";");
2.  ff::writeln(std::cout, "i=", ff::to_x(i, 4), ";");
3.  ff::writeln(std::cout, "i=", ff::to_x(i, -4), ";");
4.  ff::writeln(std::cout, "i=", ff::to_x(i, 4, 4), ";");
5.  ff::writeln(std::cout, "i=0x", ff::to_x(i), ";");
6.  ff::writeln(std::cout, "i=0x", ff::to_x(i, 4, 4), ";");
7.  ff::writeln(std::cout, "i=", ff::to_X(i), ";");
8.  ff::writeln(std::cout, "i=", ff::to_X(i, 4), ";");
9.  ff::writeln(std::cout, "i=", ff::to_X(i, -4), ";");
10. ff::writeln(std::cout, "i=", ff::to_X(i, 4, 4), ";");
11. ff::writeln(std::cout, "i=0X", ff::to_X(i), ";");
12. ff::writeln(std::cout, "i=0X", ff::to_X(i, 4, 4), ";");

Using Boost.Format:

1.  std::cout << boost::format("i=%x;") % i << std::endl;
2.  std::cout << boost::format("i=%4x;") % i << std::endl;
3.  std::cout << boost::format("i=%-4x;") % i << std::endl;
4.  std::cout << boost::format("i=%04x;") % i << std::endl;
5.  std::cout << boost::format("i=0x%x;") % i << std::endl;
6.  std::cout << boost::format("i=0x%04x;") % i << std::endl;
7.  std::cout << boost::format("i=%X;") % i << std::endl;
8.  std::cout << boost::format("i=%4X;") % i << std::endl;
9.  std::cout << boost::format("i=%-4X;") % i << std::endl;
10. std::cout << boost::format("i=%04X;") % i << std::endl;
11. std::cout << boost::format("i=0X%X;") % i << std::endl;
12. std::cout << boost::format("i=0X%04X;") % i << std::endl;


C#:

1.  Console.Out.WriteLine("i={0:x};", i);
2.  Console.Out.WriteLine("i={0,4:x};", i);
3.  Console.Out.WriteLine("i={0,-4:x};", i);
4.  Console.Out.WriteLine("i={0:x4};", i);
5.  Console.Out.WriteLine("i=0x{0:x};", i);
6.  Console.Out.WriteLine("i=0x{0:x4};", i);
7.  Console.Out.WriteLine("i={0:X};", i);
8.  Console.Out.WriteLine("i={0,4:X};", i);
9.  Console.Out.WriteLine("i={0,-4:X};", i);
10. Console.Out.WriteLine("i={0:X4};", i);
11. Console.Out.WriteLine("i=0X{0:X};", i);
12. Console.Out.WriteLine("i=0X{0:X4};", i);

Ruby:

Using puts & %:

1.  puts "i=%x;" % i
2.  puts "i=%4x;" % i
3.  puts "i=%-4x;" % i
4.  puts "i=%04x;" % i
5.  puts "i=0x%x;" % i
6.  puts "i=0x%04x;" % i
7.  puts "i=%X;" % i
8.  puts "i=%4X;" % i
9.  puts "i=%-4X;" % i
10. puts "i=%04X;" % i
11. puts "i=0X%X;" % i
12. puts "i=0X%04X;" % i

Using interpolation & to_s:

1.  puts "i=#{i.to_s(16)};"
2.  puts "i=#{i.to_s(16).rjust(4)};"
3.  puts "i=#{i.to_s(16).ljust(4)};"
4.  puts "i=#{i.to_s(16).rjust(4, '0')};"
5.  puts "i=0x#{i.to_s(16)};"
6.  puts "i=0x#{i.to_s(16).rjust(4, '0')};"
7.  puts "i=#{i.to_s(16).upcase};"
8.  puts "i=#{i.to_s(16).rjust(4).upcase};"
9.  puts "i=#{i.to_s(16).ljust(4).upcase};"
10. puts "i=#{i.to_s(16).rjust(4, '0').upcase};"
11. puts "i=0X#{i.to_s(16).upcase};"
12. puts "i=0X#{i.to_s(16).rjust(4, '0').upcase};"

Welcome to "The Renaissance Programmer"

A renaissance programmer is one who can express him/herself well in a number of languages; aka, a polymath. I have an interest in multiple languages and technologies, and have been programming in C, C#, C++, COM, Java, Objective-C, Python, and Ruby for a long time and, more recently, am enjoying learning Go, Node.js, and Swift.

This blog will contain various multi-language solutions, large and small.