protected static int[] getDecimalPrecisionAndScale(byte[] bytes, int offset, int length, SortOrder sortOrder) { if (length == 1 && sortOrder.normalize(bytes[offset]) == ZERO_BYTE) { return new int[] { 0, 0 }; } int signum = ((sortOrder.normalize(bytes[offset]) & 0x80) == 0) ? -1 : 1; int scale; int index; int digitOffset; if (signum == 1) { scale = (byte)(((sortOrder.normalize(bytes[offset]) & 0x7F) - 65) * -2); index = offset + length; digitOffset = POS_DIGIT_OFFSET; } else { scale = (byte)((~sortOrder.normalize(bytes[offset]) - 65 - 128) * -2); index = offset + length - (sortOrder.normalize(bytes[offset + length - 1]) == NEG_TERMINAL_BYTE ? 1 : 0); digitOffset = -NEG_DIGIT_OFFSET; int d = signum * sortOrder.normalize(bytes[--index]) - digitOffset; if (d % 10 == 0) { // trailing zero precision -= 1; d = signum * sortOrder.normalize(bytes[offset + 1]) - digitOffset; if (d < 10) { // Leading single digit
protected static int[] getDecimalPrecisionAndScale(byte[] bytes, int offset, int length, SortOrder sortOrder) { if (length == 1 && sortOrder.normalize(bytes[offset]) == ZERO_BYTE) { return new int[] { 0, 0 }; } int signum = ((sortOrder.normalize(bytes[offset]) & 0x80) == 0) ? -1 : 1; int scale; int index; int digitOffset; if (signum == 1) { scale = (byte)(((sortOrder.normalize(bytes[offset]) & 0x7F) - 65) * -2); index = offset + length; digitOffset = POS_DIGIT_OFFSET; } else { scale = (byte)((~sortOrder.normalize(bytes[offset]) - 65 - 128) * -2); index = offset + length - (sortOrder.normalize(bytes[offset + length - 1]) == NEG_TERMINAL_BYTE ? 1 : 0); digitOffset = -NEG_DIGIT_OFFSET; int d = signum * sortOrder.normalize(bytes[--index]) - digitOffset; if (d % 10 == 0) { // trailing zero precision -= 1; d = signum * sortOrder.normalize(bytes[offset + 1]) - digitOffset; if (d < 10) { // Leading single digit
protected static int[] getDecimalPrecisionAndScale(byte[] bytes, int offset, int length, SortOrder sortOrder) { if (length == 1 && sortOrder.normalize(bytes[offset]) == ZERO_BYTE) { return new int[] { 0, 0 }; } int signum = ((sortOrder.normalize(bytes[offset]) & 0x80) == 0) ? -1 : 1; int scale; int index; int digitOffset; if (signum == 1) { scale = (byte)(((sortOrder.normalize(bytes[offset]) & 0x7F) - 65) * -2); index = offset + length; digitOffset = POS_DIGIT_OFFSET; } else { scale = (byte)((~sortOrder.normalize(bytes[offset]) - 65 - 128) * -2); index = offset + length - (sortOrder.normalize(bytes[offset + length - 1]) == NEG_TERMINAL_BYTE ? 1 : 0); digitOffset = -NEG_DIGIT_OFFSET; int d = signum * sortOrder.normalize(bytes[--index]) - digitOffset; if (d % 10 == 0) { // trailing zero precision -= 1; d = signum * sortOrder.normalize(bytes[offset + 1]) - digitOffset; if (d < 10) { // Leading single digit