Adds Integer.toString emulation

This commit is contained in:
konsoletyper 2014-02-10 17:27:53 +04:00
parent e094fe4192
commit 9929082d49
4 changed files with 34 additions and 7 deletions

View File

@ -66,13 +66,17 @@ class TAbstractStringBuilder extends TObject implements TSerializable, TCharSequ
return this;
}
protected TAbstractStringBuilder append(int value) {
TAbstractStringBuilder append(int value) {
return append(value, 10);
}
TAbstractStringBuilder append(int value, int radix) {
boolean positive = true;
if (value < 0) {
positive = false;
value = -value;
}
if (value < 10) {
if (value < radix) {
if (!positive) {
ensureCapacity(length + 2);
buffer[length++] = '-';
@ -81,10 +85,12 @@ class TAbstractStringBuilder extends TObject implements TSerializable, TCharSequ
}
buffer[length++] = (char)('0' + value);
} else {
int pos = 10;
int pos = 1;
int sz = 1;
while (pos < 1000000000 && pos * 10 <= value) {
pos *= 10;
int valueCopy = value;
while (valueCopy > radix) {
pos *= radix;
valueCopy /= radix;
++sz;
}
if (!positive) {
@ -95,9 +101,9 @@ class TAbstractStringBuilder extends TObject implements TSerializable, TCharSequ
buffer[length++] = '-';
}
while (pos > 0) {
buffer[length++] = (char)('0' + value / pos);
buffer[length++] = TCharacter.forDigit(value / pos, radix);
value %= pos;
pos /= 10;
pos /= radix;
}
}
return this;

View File

@ -64,6 +64,13 @@ public class TCharacter {
return -1;
}
public static char forDigit(int digit, int radix) {
if (radix < MIN_RADIX || radix > MAX_RADIX || digit >= radix) {
return '\0';
}
return digit < 10 ? (char)('0' + digit) : (char)('a' + digit - 10);
}
private static int[] getDigitMapping() {
if (digitMapping == null) {
digitMapping = UnicodeHelper.decodeIntByte(obtainDigitMapping());

View File

@ -34,6 +34,13 @@ public class TInteger extends TNumber implements TComparable<TInteger> {
this(parseInt(s));
}
public static TString toString(int i, int radix) {
if (radix < MIN_VALUE || radix > MAX_VALUE) {
radix = 10;
}
return TString.wrap(new TAbstractStringBuilder(20).append(i, radix).toString());
}
@Override
public int compareTo(TInteger other) {
return compare(value, other.value);

View File

@ -45,4 +45,11 @@ public class IntegerTest {
public void rejectsIntegerWithDigitsOutOfRadix() {
Integer.parseInt("99", 8);
}
@Test
public void writesInteger() {
assertEquals("473", Integer.toString(473, 10));
assertEquals("-ff", Integer.toString(-255, 16));
assertEquals("kona", Integer.toString(411787, 27));
}
}