mirror of
https://github.com/unicode-org/icu.git
synced 2025-04-15 17:56:54 +00:00
ICU-13513 Finishing merge; fixing merge conflicts in DecimalQuantity_AbstractBCD.java.
X-SVN-Rev: 40752
This commit is contained in:
parent
bdb19075f8
commit
052408f943
2 changed files with 89 additions and 172 deletions
|
@ -425,42 +425,43 @@ public class AffixUtils {
|
|||
return new String(chars);
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends a new affix pattern with all symbols and code points in the given "ignorables" UnicodeSet trimmed from the
|
||||
* beginning and end. Similar to calling unescape with a symbol provider that always returns the empty string.
|
||||
*
|
||||
* <p>
|
||||
* Accepts and returns a StringBuilder, allocating it only if necessary.
|
||||
*/
|
||||
public static StringBuilder trimSymbolsAndIgnorables(
|
||||
CharSequence affixPattern,
|
||||
UnicodeSet ignorables,
|
||||
StringBuilder sb) {
|
||||
assert affixPattern != null;
|
||||
long tag = 0L;
|
||||
int trailingIgnorables = 0;
|
||||
while (hasNext(tag, affixPattern)) {
|
||||
tag = nextToken(tag, affixPattern);
|
||||
int typeOrCp = getTypeOrCp(tag);
|
||||
if (typeOrCp >= 0) {
|
||||
if (!ignorables.contains(typeOrCp)) {
|
||||
if (sb == null) {
|
||||
// Lazy-initialize the StringBuilder
|
||||
sb = new StringBuilder();
|
||||
}
|
||||
sb.appendCodePoint(typeOrCp);
|
||||
trailingIgnorables = 0;
|
||||
} else if (sb != null && sb.length() > 0) {
|
||||
sb.appendCodePoint(typeOrCp);
|
||||
trailingIgnorables += Character.charCount(typeOrCp);
|
||||
/**
|
||||
* Appends a new affix pattern with all symbols and code points in the given "ignorables" UnicodeSet
|
||||
* trimmed from the beginning and end. Similar to calling unescape with a symbol provider that always
|
||||
* returns the empty string.
|
||||
*
|
||||
* <p>
|
||||
* Accepts and returns a StringBuilder, allocating it only if necessary.
|
||||
*/
|
||||
public static StringBuilder trimSymbolsAndIgnorables(
|
||||
CharSequence affixPattern,
|
||||
UnicodeSet ignorables,
|
||||
StringBuilder sb) {
|
||||
assert affixPattern != null;
|
||||
long tag = 0L;
|
||||
int trailingIgnorables = 0;
|
||||
while (hasNext(tag, affixPattern)) {
|
||||
tag = nextToken(tag, affixPattern);
|
||||
int typeOrCp = getTypeOrCp(tag);
|
||||
if (typeOrCp >= 0) {
|
||||
if (!ignorables.contains(typeOrCp)) {
|
||||
if (sb == null) {
|
||||
// Lazy-initialize the StringBuilder
|
||||
sb = new StringBuilder();
|
||||
}
|
||||
sb.appendCodePoint(typeOrCp);
|
||||
trailingIgnorables = 0;
|
||||
} else if (sb != null && sb.length() > 0) {
|
||||
sb.appendCodePoint(typeOrCp);
|
||||
trailingIgnorables += Character.charCount(typeOrCp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (trailingIgnorables > 0) {
|
||||
sb.setLength(sb.length() - trailingIgnorables);
|
||||
}
|
||||
return sb;
|
||||
}
|
||||
if (trailingIgnorables > 0) {
|
||||
sb.setLength(sb.length() - trailingIgnorables);
|
||||
}
|
||||
return sb;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the next token from the affix pattern.
|
||||
|
|
|
@ -201,21 +201,13 @@ public abstract class DecimalQuantity_AbstractBCD implements DecimalQuantity {
|
|||
}
|
||||
}
|
||||
|
||||
<<<<<<< .working
|
||||
@Override
|
||||
public void adjustMagnitude(int delta) {
|
||||
if (precision != 0) {
|
||||
// TODO: Math.addExact is not in 1.6 or 1.7
|
||||
scale = Math.addExact(scale, delta);
|
||||
origDelta = Math.addExact(origDelta, delta);
|
||||
=======
|
||||
@Override
|
||||
public void adjustMagnitude(int delta) {
|
||||
if (precision != 0) {
|
||||
scale += delta;
|
||||
origDelta += delta;
|
||||
// TODO: Math.addExact is not in 1.6 or 1.7
|
||||
scale = Math.addExact(scale, delta);
|
||||
origDelta = Math.addExact(origDelta, delta);
|
||||
}
|
||||
>>>>>>> .merge-right.r40750
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -551,117 +543,34 @@ public abstract class DecimalQuantity_AbstractBCD implements DecimalQuantity {
|
|||
}
|
||||
}
|
||||
|
||||
<<<<<<< .working
|
||||
private void _setToBigDecimal(BigDecimal n) {
|
||||
int fracLength = n.scale();
|
||||
n = n.scaleByPowerOfTen(fracLength);
|
||||
BigInteger bi = n.toBigInteger();
|
||||
_setToBigInteger(bi);
|
||||
scale -= fracLength;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a long approximating the internal BCD. A long can only represent the integral part of
|
||||
* the number.
|
||||
*
|
||||
* @return A double representation of the internal BCD.
|
||||
*/
|
||||
public long toLong() {
|
||||
long result = 0L;
|
||||
for (int magnitude = scale + precision - 1; magnitude >= 0; magnitude--) {
|
||||
result = result * 10 + getDigitPos(magnitude - scale);
|
||||
=======
|
||||
private void _setToBigDecimal(BigDecimal n) {
|
||||
int fracLength = n.scale();
|
||||
n = n.scaleByPowerOfTen(fracLength);
|
||||
BigInteger bi = n.toBigInteger();
|
||||
_setToBigInteger(bi);
|
||||
scale -= fracLength;
|
||||
>>>>>>> .merge-right.r40750
|
||||
}
|
||||
|
||||
<<<<<<< .working
|
||||
/**
|
||||
* This returns a long representing the fraction digits of the number, as required by PluralRules.
|
||||
* For example, if we represent the number "1.20" (including optional and required digits), then
|
||||
* this function returns "20" if includeTrailingZeros is true or "2" if false.
|
||||
*/
|
||||
public long toFractionLong(boolean includeTrailingZeros) {
|
||||
long result = 0L;
|
||||
int magnitude = -1;
|
||||
for (;
|
||||
(magnitude >= scale || (includeTrailingZeros && magnitude >= rReqPos))
|
||||
&& magnitude >= rOptPos;
|
||||
magnitude--) {
|
||||
result = result * 10 + getDigitPos(magnitude - scale);
|
||||
=======
|
||||
/**
|
||||
* Returns a long approximating the internal BCD. A long can only represent the integral part of the
|
||||
* number.
|
||||
*
|
||||
* @return A double representation of the internal BCD.
|
||||
*/
|
||||
protected long toLong() {
|
||||
public long toLong() {
|
||||
long result = 0L;
|
||||
for (int magnitude = scale + precision - 1; magnitude >= 0; magnitude--) {
|
||||
result = result * 10 + getDigitPos(magnitude - scale);
|
||||
}
|
||||
return result;
|
||||
>>>>>>> .merge-right.r40750
|
||||
}
|
||||
|
||||
<<<<<<< .working
|
||||
static final byte[] INT64_BCD = {9,2,2,3,3,7,2,0,3,6,8,5,4,7,7,5,8,0,7};
|
||||
|
||||
/**
|
||||
* Returns whether or not a Long can fully represent the value stored in this DecimalQuantity.
|
||||
* Assumes that the DecimalQuantity is positive.
|
||||
*/
|
||||
public boolean fitsInLong() {
|
||||
if (isZero()) {
|
||||
return true;
|
||||
}
|
||||
if (scale < 0) {
|
||||
return false;
|
||||
}
|
||||
int magnitude = getMagnitude();
|
||||
if (magnitude < 18) {
|
||||
return true;
|
||||
}
|
||||
if (magnitude > 18) {
|
||||
return false;
|
||||
}
|
||||
// Hard case: the magnitude is 10^18.
|
||||
// The largest int64 is: 9,223,372,036,854,775,807
|
||||
for (int p=0; p<precision; p++) {
|
||||
byte digit = getDigitPos(18-p);
|
||||
if (digit < INT64_BCD[p]) {
|
||||
return true;
|
||||
} else if (digit > INT64_BCD[p]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Exactly equal to max long.
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a double approximating the internal BCD. The double may not retain all of the
|
||||
* information encoded in the BCD if the BCD represents a number out of range of a double.
|
||||
*
|
||||
* @return A double representation of the internal BCD.
|
||||
*/
|
||||
@Override
|
||||
public double toDouble() {
|
||||
if (isApproximate) {
|
||||
return toDoubleFromOriginal();
|
||||
=======
|
||||
/**
|
||||
* This returns a long representing the fraction digits of the number, as required by PluralRules.
|
||||
* For example, if we represent the number "1.20" (including optional and required digits), then this
|
||||
* function returns "20" if includeTrailingZeros is true or "2" if false.
|
||||
*/
|
||||
protected long toFractionLong(boolean includeTrailingZeros) {
|
||||
public long toFractionLong(boolean includeTrailingZeros) {
|
||||
long result = 0L;
|
||||
int magnitude = -1;
|
||||
for (; (magnitude >= scale || (includeTrailingZeros && magnitude >= rReqPos))
|
||||
|
@ -669,7 +578,40 @@ public abstract class DecimalQuantity_AbstractBCD implements DecimalQuantity {
|
|||
result = result * 10 + getDigitPos(magnitude - scale);
|
||||
}
|
||||
return result;
|
||||
>>>>>>> .merge-right.r40750
|
||||
}
|
||||
|
||||
static final byte[] INT64_BCD = { 9, 2, 2, 3, 3, 7, 2, 0, 3, 6, 8, 5, 4, 7, 7, 5, 8, 0, 7 };
|
||||
|
||||
/**
|
||||
* Returns whether or not a Long can fully represent the value stored in this DecimalQuantity.
|
||||
* Assumes that the DecimalQuantity is positive.
|
||||
*/
|
||||
public boolean fitsInLong() {
|
||||
if (isZero()) {
|
||||
return true;
|
||||
}
|
||||
if (scale < 0) {
|
||||
return false;
|
||||
}
|
||||
int magnitude = getMagnitude();
|
||||
if (magnitude < 18) {
|
||||
return true;
|
||||
}
|
||||
if (magnitude > 18) {
|
||||
return false;
|
||||
}
|
||||
// Hard case: the magnitude is 10^18.
|
||||
// The largest int64 is: 9,223,372,036,854,775,807
|
||||
for (int p = 0; p < precision; p++) {
|
||||
byte digit = getDigitPos(18 - p);
|
||||
if (digit < INT64_BCD[p]) {
|
||||
return true;
|
||||
} else if (digit > INT64_BCD[p]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
// Exactly equal to max long.
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -911,37 +853,15 @@ public abstract class DecimalQuantity_AbstractBCD implements DecimalQuantity {
|
|||
}
|
||||
}
|
||||
|
||||
<<<<<<< .working
|
||||
@Override
|
||||
public void truncate() {
|
||||
if (scale < 0) {
|
||||
shiftRight(-scale);
|
||||
scale = 0;
|
||||
compact();
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void truncate() {
|
||||
if (scale < 0) {
|
||||
shiftRight(-scale);
|
||||
scale = 0;
|
||||
compact();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends a digit, optionally with one or more leading zeros, to the end of the value represented
|
||||
* by this DecimalQuantity.
|
||||
*
|
||||
* <p>The primary use of this method is to construct numbers during a parsing loop. It allows
|
||||
* parsing to take advantage of the digit list infrastructure primarily designed for formatting.
|
||||
*
|
||||
* @param value The digit to append.
|
||||
* @param leadingZeros The number of zeros to append before the digit. For example, if the value
|
||||
* in this instance starts as 12.3, and you append a 4 with 1 leading zero, the value becomes
|
||||
* 12.304.
|
||||
* @param appendAsInteger If true, increase the magnitude of existing digits to make room for the
|
||||
* new digit. If false, append to the end like a fraction digit. If true, there must not be
|
||||
* any fraction digits already in the number.
|
||||
* @internal
|
||||
* @deprecated This API is ICU internal only.
|
||||
*/
|
||||
@Deprecated
|
||||
public void appendDigit(byte value, int leadingZeros, boolean appendAsInteger) {
|
||||
assert leadingZeros >= 0;
|
||||
=======
|
||||
/**
|
||||
* Appends a digit, optionally with one or more leading zeros, to the end of the value represented by
|
||||
* this DecimalQuantity.
|
||||
|
@ -966,7 +886,6 @@ public abstract class DecimalQuantity_AbstractBCD implements DecimalQuantity {
|
|||
@Deprecated
|
||||
public void appendDigit(byte value, int leadingZeros, boolean appendAsInteger) {
|
||||
assert leadingZeros >= 0;
|
||||
>>>>>>> .merge-right.r40750
|
||||
|
||||
// Zero requires special handling to maintain the invariant that the least-significant digit
|
||||
// in the BCD is nonzero.
|
||||
|
@ -1042,17 +961,14 @@ public abstract class DecimalQuantity_AbstractBCD implements DecimalQuantity {
|
|||
*/
|
||||
protected abstract void shiftLeft(int numDigits);
|
||||
|
||||
<<<<<<< .working
|
||||
/**
|
||||
* Removes digits from the end of the BCD list. This may result in an invalid BCD representation; it is
|
||||
* the caller's responsibility to follow-up with a call to {@link #compact}.
|
||||
*
|
||||
* @param numDigits The number of zeros to add.
|
||||
*/
|
||||
protected abstract void shiftRight(int numDigits);
|
||||
=======
|
||||
/**
|
||||
* Removes digits from the end of the BCD list. This may result in an invalid BCD representation; it
|
||||
* is the caller's responsibility to follow-up with a call to {@link #compact}.
|
||||
*
|
||||
* @param numDigits
|
||||
* The number of zeros to add.
|
||||
*/
|
||||
protected abstract void shiftRight(int numDigits);
|
||||
>>>>>>> .merge-right.r40750
|
||||
|
||||
/**
|
||||
* Sets the internal representation to zero. Clears any values stored in scale, precision, hasDouble,
|
||||
|
|
Loading…
Add table
Reference in a new issue