import java.io.ObjectOutputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
+import java.text.AttributedCharacterIterator;
import java.text.FieldPosition;
import java.text.ParsePosition;
import java.util.Collection;
*/
@Override
public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
- if (number < 0.0d) {
- throw new UnsupportedOperationException("CompactDecimalFormat doesn't handle negative numbers yet.");
- }
- // We do this here so that the prefix or suffix we choose is always consistent
- // with the rounding we do. This way, 999999 -> 1M instead of 1000K.
- number = adjustNumberAsInFormatting(number);
- int base = number <= 1.0d ? 0 : (int) Math.log10(number);
- if (base >= CompactDecimalDataCache.MAX_DIGITS) {
- base = CompactDecimalDataCache.MAX_DIGITS - 1;
- }
- number = number / divisor[base];
- String pluralVariant = getPluralForm(number);
- setPositivePrefix(CompactDecimalDataCache.getPrefixOrSuffix(prefix, pluralVariant, base));
- setPositiveSuffix(CompactDecimalDataCache.getPrefixOrSuffix(suffix, pluralVariant, base));
- setCurrency(null);
-
+ number = configure(number);
return super.format(number, toAppendTo, pos);
}
+ /**
+ * {@inheritDoc}
+ * @draft ICU 50
+ * @provisional This API might change or be removed in a future release.
+ */
+ @Override
+ public AttributedCharacterIterator formatToCharacterIterator(Object obj) {
+ if (!(obj instanceof Number)) {
+ throw new IllegalArgumentException();
+ }
+ Number number = (Number) obj;
+ double newNumber = configure(number.doubleValue());
+ return super.formatToCharacterIterator(newNumber);
+ }
+
/**
* {@inheritDoc}
* @draft ICU 49
/* INTERNALS */
-
+ private double configure(double number) {
+ if (number < 0.0d) {
+ throw new UnsupportedOperationException("CompactDecimalFormat doesn't handle negative numbers yet.");
+ }
+ // We do this here so that the prefix or suffix we choose is always consistent
+ // with the rounding we do. This way, 999999 -> 1M instead of 1000K.
+ number = adjustNumberAsInFormatting(number);
+ int base = number <= 1.0d ? 0 : (int) Math.log10(number);
+ if (base >= CompactDecimalDataCache.MAX_DIGITS) {
+ base = CompactDecimalDataCache.MAX_DIGITS - 1;
+ }
+ number /= divisor[base];
+ String pluralVariant = getPluralForm(number);
+ setPositivePrefix(CompactDecimalDataCache.getPrefixOrSuffix(prefix, pluralVariant, base));
+ setPositiveSuffix(CompactDecimalDataCache.getPrefixOrSuffix(suffix, pluralVariant, base));
+ setCurrency(null);
+ return number;
+ }
private void recordError(Collection<String> creationErrors, String errorMessage) {
if (creationErrors == null) {
*/
package com.ibm.icu.dev.test.format;
+import java.text.AttributedCharacterIterator;
+import java.text.CharacterIterator;
+
import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.text.CompactDecimalFormat;
import com.ibm.icu.text.NumberFormat;
{12345678901234567890f, "T12000000"},
};
+ public void TestCharacterIterator() {
+ CompactDecimalFormat cdf =
+ NumberFormat.getCompactDecimalInstance(ULocale.ENGLISH, CompactStyle.SHORT);
+ AttributedCharacterIterator iter = cdf.formatToCharacterIterator(12346);
+ assertEquals("CharacterIterator", "12K", iterToString(iter));
+ iter = cdf.formatToCharacterIterator(12346);
+ assertEquals("Attributes", iter.getAttribute(NumberFormat.Field.INTEGER), NumberFormat.Field.INTEGER);
+ assertEquals("Attributes", 0, iter.getRunStart());
+ assertEquals("Attributes", 2, iter.getRunLimit());
+ }
+
public void TestEnglishShort() {
checkLocale(ULocale.ENGLISH, CompactStyle.SHORT, EnglishTestData);
}
-
+
public void TestNoLongStyleInCLDR() {
NumberFormat cdf =
NumberFormat.getCompactDecimalInstance(
assertEquals(locale + " (" + locale.getDisplayName(locale) + ")", row[1], cdf.format(row[0]));
}
}
+
+ private static String iterToString(CharacterIterator iter) {
+ StringBuilder builder = new StringBuilder();
+ for (char c = iter.current(); c != CharacterIterator.DONE; c = iter.next()) {
+ builder.append(c);
+ }
+ return builder.toString();
+ }
}