itoaを5分で書いてみる

結果は5分では書けなかったorz
バグがあるかもですが15分もかけて書いたJavaソースを晒しときます。
※実用コードではないです。

public class Itoa {
  public static String itoa(final int val) { // FIXME:int->long
    if (val < 0) {
      return "-" + itoa(-val);
    }
    char buff[] = new char[11]; // FIXME:char buff[]->char[] buff
    int len = 0;
    int v = val; // FIXME:int->long
    while (0 < v) {
      int tmp = v % 10; // FIXME:int->long
      buff[len++] = (char) (tmp + 0x30);
      v /= 10;
    }
    if (len == 0) {
      buff[0] = '0';
      len = 1;
    }
    r(buff, len);
    return new String(buff, 0, len);
  }
  private static void r(char[] buff, int len) {
    for (int i = 0; i < len / 2; i++) {
      char c = buff[i];
      buff[i] = buff[len - i - 1];
      buff[len - i - 1] = c;
    }
  }
}

追記

やはりバグがあります。
引数val、ローカル変数v,tmpはintではダメですよね。longにしなきゃ。

追記2

 // FIXME:int->long

などの様にコメントを追記しました。

追記3

翌朝、フルスクラッチで10分で書いた。

public class Itoa {
  public static String itoa(final int val) {
    if (0 == val) {
      return "0";
    }
    if (-2147483648 == val) {
      return "-2147483648";
    }
    final boolean isNegative = val < 0;
    int v = isNegative ? val : -val;
    final char[] buff = new char[16];
    int len = 0;
    while (0 < v) {
      final int temp = v % 10;
      buff[len++] = (char)(temp + 0x30);
      //
      v = v / 10;
    }
    if (isNegative) {
      buff[len++] = '-';
    }
    reverse(buff, len);
    return new String(buff, 0, len);
  }
  private static void reverse(final char[] buff, final int len) {
    for (int i = 0; i < len / 2; i++) {
      final char c = buff[i];
      buff[i] = buff[len - i - 1];
      buff[len - i - 1] = c;
    }
  }
}