snippetjavaMinor
Implement String's valueOf function, code review request
Viewed 0 times
valueofreviewimplementrequestfunctioncodestring
Problem
Ok, code reviewers, I want you to pick my code apart and give me some feedback on how I could make it better or more simple.
```
public final class StringValueOf {
private StringValueOf () {}
// note that int max value is 10 digits
final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
99999999, 999999999, Integer.MAX_VALUE };
private final static char[] DigitOne = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
};
private final static char[] DigitTens = {
'0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
'1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
'2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
'3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
'4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
'5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
'6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
'7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
'8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
'9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
};
private static int stringSize(int x) {
for (int i = 0; ; i++) {
if (x = 10) {
int r = i % 100;
i = i / 100;
buf[charPos--] = DigitOne[r];
buf[charPos--] = DigitTens[r];
}
if (i > 0) {
buf[charPos--] = DigitOne[i];
}
if (charPos == 0) {
```
public final class StringValueOf {
private StringValueOf () {}
// note that int max value is 10 digits
final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
99999999, 999999999, Integer.MAX_VALUE };
private final static char[] DigitOne = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
};
private final static char[] DigitTens = {
'0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
'1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
'2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
'3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
'4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
'5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
'6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
'7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
'8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
'9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
};
private static int stringSize(int x) {
for (int i = 0; ; i++) {
if (x = 10) {
int r = i % 100;
i = i / 100;
buf[charPos--] = DigitOne[r];
buf[charPos--] = DigitTens[r];
}
if (i > 0) {
buf[charPos--] = DigitOne[i];
}
if (charPos == 0) {
Solution
Since it's easy to convert integer digits to their character values ('0' = 0x30..'9' = 0x39), why not:
It's easy to test this for correctness over the int range; but to do so, I'd extract the
public static String stringValueOf(int value) {
if (value == 0) return "0";
if (value == Integer.MIN_VALUE) return "-2147483648";
final boolean negative = value < 0;
if (negative) value = -value;
final StringBuilder buf = new StringBuilder();
while (value != 0) {
int digit = value % 10;
buf.append( (char)(0x30 + digit) );
value = value / 10;
}
if (negative) buf.append('-');
return buf.reverse().toString();
}It's easy to test this for correctness over the int range; but to do so, I'd extract the
StringBuilder construction from the method into a static class variable and just call buf.setLength(0) each time.Code Snippets
public static String stringValueOf(int value) {
if (value == 0) return "0";
if (value == Integer.MIN_VALUE) return "-2147483648";
final boolean negative = value < 0;
if (negative) value = -value;
final StringBuilder buf = new StringBuilder();
while (value != 0) {
int digit = value % 10;
buf.append( (char)(0x30 + digit) );
value = value / 10;
}
if (negative) buf.append('-');
return buf.reverse().toString();
}Context
StackExchange Code Review Q#32109, answer score: 5
Revisions (0)
No revisions yet.