ICU-20471 setFormatWidth to 0 should cause padding to be ignored
This commit is contained in:
parent
bb4df2223d
commit
8943f89a84
@ -182,7 +182,7 @@ MacroProps NumberPropertyMapper::oldToNew(const DecimalFormatProperties& propert
|
||||
// PADDING //
|
||||
/////////////
|
||||
|
||||
if (properties.formatWidth != -1) {
|
||||
if (properties.formatWidth > 0) {
|
||||
macros.padder = Padder::forProperties(properties);
|
||||
}
|
||||
|
||||
|
@ -781,7 +781,7 @@ UnicodeString PatternStringUtils::propertiesToPatternString(const DecimalFormatP
|
||||
sb.append(affixes.getString(AffixPatternProvider::AFFIX_POS_SUFFIX));
|
||||
|
||||
// Resolve Padding
|
||||
if (paddingWidth != -1 && !paddingLocation.isNull()) {
|
||||
if (paddingWidth > 0 && !paddingLocation.isNull()) {
|
||||
while (paddingWidth - sb.length() > 0) {
|
||||
sb.insert(afterPrefixPos, u'#');
|
||||
beforeSuffixPos++;
|
||||
|
@ -72,6 +72,7 @@ static void TestRBNFRounding(void);
|
||||
static void Test12052_NullPointer(void);
|
||||
static void TestParseCases(void);
|
||||
static void TestSetMaxFracAndRoundIncr(void);
|
||||
static void TestIgnorePadding(void);
|
||||
|
||||
#define TESTCASE(x) addTest(root, &x, "tsformat/cnumtst/" #x)
|
||||
|
||||
@ -110,6 +111,7 @@ void addNumForTest(TestNode** root)
|
||||
TESTCASE(Test12052_NullPointer);
|
||||
TESTCASE(TestParseCases);
|
||||
TESTCASE(TestSetMaxFracAndRoundIncr);
|
||||
TESTCASE(TestIgnorePadding);
|
||||
}
|
||||
|
||||
/* test Parse int 64 */
|
||||
@ -3386,4 +3388,52 @@ static void TestSetMaxFracAndRoundIncr(void) {
|
||||
}
|
||||
}
|
||||
|
||||
static void TestIgnorePadding(void) {
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
UNumberFormat* unum = unum_open(UNUM_PATTERN_DECIMAL, NULL, 0, "en_US", NULL, &status);
|
||||
if (U_FAILURE(status)) {
|
||||
log_data_err("unum_open UNUM_PATTERN_DECIMAL for en_US and NULL pattern fails:%s\n", u_errorName(status));
|
||||
} else {
|
||||
unum_setAttribute(unum, UNUM_GROUPING_USED, 0);
|
||||
unum_setAttribute(unum, UNUM_FORMAT_WIDTH, 0);
|
||||
unum_setTextAttribute(unum, UNUM_PADDING_CHARACTER, u"*", 1, &status);
|
||||
if (U_FAILURE(status)) {
|
||||
log_err("unum_setTextAttribute UNUM_PADDING_CHARACTER to '*' fails: %s\n", u_errorName(status));
|
||||
} else {
|
||||
unum_setAttribute(unum, UNUM_PADDING_POSITION, 0);
|
||||
unum_setAttribute(unum, UNUM_MIN_INTEGER_DIGITS, 0);
|
||||
unum_setAttribute(unum, UNUM_MAX_INTEGER_DIGITS, 8);
|
||||
unum_setAttribute(unum, UNUM_MIN_FRACTION_DIGITS, 0);
|
||||
unum_setAttribute(unum, UNUM_MAX_FRACTION_DIGITS, 0);
|
||||
|
||||
UChar ubuf[kUBufMax];
|
||||
int32_t ulen = unum_toPattern(unum, FALSE, ubuf, kUBufMax, &status);
|
||||
if (U_FAILURE(status)) {
|
||||
log_err("unum_toPattern fails: %s\n", u_errorName(status));
|
||||
} else {
|
||||
char bbuf[kBBufMax];
|
||||
if (ulen > 0 && ubuf[0]==u'*') {
|
||||
ubuf[kUBufMax-1] = 0; // ensure zero termination
|
||||
u_austrncpy(bbuf, ubuf, kBBufMax);
|
||||
log_err("unum_toPattern result should ignore padding but get %s\n", bbuf);
|
||||
}
|
||||
unum_applyPattern(unum, FALSE, ubuf, ulen, NULL, &status);
|
||||
if (U_FAILURE(status)) {
|
||||
log_err("unum_applyPattern fails: %s\n", u_errorName(status));
|
||||
} else {
|
||||
ulen = unum_formatDecimal(unum, "24", -1, ubuf, kUBufMax, NULL, &status);
|
||||
if (U_FAILURE(status)) {
|
||||
log_err("unum_formatDecimal fails: %s\n", u_errorName(status));
|
||||
} else if (u_strcmp(ubuf, u"24") != 0) {
|
||||
ubuf[kUBufMax-1] = 0; // ensure zero termination
|
||||
u_austrncpy(bbuf, ubuf, kBBufMax);
|
||||
log_err("unum_formatDecimal result expect 24 but get %s\n", bbuf);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
unum_close(unum);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* #if !UCONFIG_NO_FORMATTING */
|
||||
|
@ -171,7 +171,7 @@ public class PatternStringUtils {
|
||||
sb.append(affixes.getString(AffixPatternProvider.FLAG_POS_SUFFIX));
|
||||
|
||||
// Resolve Padding
|
||||
if (paddingWidth != -1) {
|
||||
if (paddingWidth > 0) {
|
||||
while (paddingWidth - sb.length() > 0) {
|
||||
sb.insert(afterPrefixPos, '#');
|
||||
beforeSuffixPos++;
|
||||
|
@ -219,7 +219,7 @@ final class NumberPropertyMapper {
|
||||
// PADDING //
|
||||
/////////////
|
||||
|
||||
if (properties.getFormatWidth() != -1) {
|
||||
if (properties.getFormatWidth() > 0) {
|
||||
macros.padder = Padder.forProperties(properties);
|
||||
}
|
||||
|
||||
|
@ -1418,6 +1418,29 @@ public class NumberFormatTest extends TestFmwk {
|
||||
expect2(new DecimalFormat("*'😃'####.00", US), 1.1, "😃😃😃1.10");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void TestIgnorePadding() {
|
||||
DecimalFormatSymbols dfs = new DecimalFormatSymbols(Locale.US);
|
||||
DecimalFormat fmt = new DecimalFormat("", dfs);
|
||||
fmt.setGroupingUsed(false);
|
||||
fmt.setFormatWidth(0);
|
||||
fmt.setPadCharacter('*');
|
||||
fmt.setPadPosition(0);
|
||||
fmt.setMinimumIntegerDigits(0);
|
||||
fmt.setMaximumIntegerDigits(8);
|
||||
fmt.setMinimumFractionDigits(0);
|
||||
fmt.setMaximumFractionDigits(0);
|
||||
String pattern = fmt.toPattern();
|
||||
if (pattern.startsWith("*")) {
|
||||
errln("ERROR toPattern result should ignore padding but get \"" + pattern + "\"");
|
||||
}
|
||||
fmt.applyPattern(pattern);
|
||||
String format = fmt.format(24);
|
||||
if (!format.equals("24")) {
|
||||
errln("ERROR format result expect 24 but get \"" + format + "\"");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Upgrade to alphaWorks
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user