ICU-7635 Modify toString method to handle >>>

X-SVN-Rev: 30868
This commit is contained in:
John Emmons 2011-10-26 02:16:23 +00:00
parent fc9b8646db
commit 0ce13a1711
3 changed files with 83 additions and 1 deletions

View File

@ -172,6 +172,8 @@ public:
virtual UChar tokenChar() const { return (UChar)0x003e; } // '>'
virtual void toString(UnicodeString& result) const;
public:
static UClassID getStaticClassID(void);
virtual UClassID getDynamicClassID(void) const;
@ -976,8 +978,29 @@ ModulusSubstitution::doParse(const UnicodeString& text,
return TRUE;
}
}
/**
* Returns a textual description of the substitution
* @return A textual description of the substitution. This might
* not be identical to the description it was created from, but
* it'll produce the same result.
*/
void
ModulusSubstitution::toString(UnicodeString& text) const
{
// use tokenChar() to get the character at the beginning and
// end of the substitutin token. In between them will go
// either the name of the rule set it uses, or the pattern of
// the DecimalFormat it uses
if ( ruleToUse != NULL ) { // Must have been a >>> substitution.
text.remove();
text.append(tokenChar());
text.append(tokenChar());
text.append(tokenChar());
} else { // Otherwise just use the super-class function.
NFSubstitution::toString(text);
}
}
//===================================================================
// IntegralPartSubstitution
//===================================================================

View File

@ -59,6 +59,7 @@ void addNumForTest(TestNode** root)
TESTCASE(TestInt64Parse);
TESTCASE(TestParseZero);
TESTCASE(TestParseCurrency);
TESTCASE(TestCloneWithRBNF);
}
/** copy src to dst with unicode-escapes for values < 0x20 and > 0x7e, null terminate if possible */
@ -1965,5 +1966,58 @@ static void TestNBSPInPattern(void) {
}
static void TestCloneWithRBNF(void) {
const wchar_t* pattern = L"\
%main:0.x: >%%millis-only>;\n\
x.0: <%%duration<;\n\
x.x: <%%durationwithmillis<>%%millis-added>;\n\
-x: ->>;%%millis-only:\n\
1000: 00:00.<%%millis<;\n\
%%millis-added:\n\
1000: .<%%millis<;\n\
%%millis:\n\
0: =000=;\n\
%%duration:\n\
0: =%%seconds-only=;\n\
60: =%%min-sec=;\n\
3600: =%%hr-min-sec=;\n\
86400/86400: <%%ddaayyss<[, >>];\n\
%%durationwithmillis:\n\
0: =%%seconds-only=;\n\
60: =%%min-sec=;\n\
3600: =%%hr-min-sec=;\n\
86400/86400: <%%ddaayyss<, >>;\n\
%%seconds-only:\n\
0: 0:00:=00=;\n\
%%min-sec:\n\
0: :=00=;\n\
60/60: 0:<00<>>;\n\
%%hr-min-sec:\n\
0: :=00=;\n\
60/60: <00<>>;\n\
3600/60: <0<:>>>;\n\
%%ddaayyss:\n\
0 days;\n\
1 day;\n\
=0= days;";
UErrorCode status = U_ZERO_ERROR;
UChar buffer[256];
UChar buffer_cloned[256];
char temp1[256];
char temp2[256];
UNumberFormat *pform_cloned;
UNumberFormat *pform = unum_open(UNUM_PATTERN_RULEBASED, pattern, -1, "en_US", NULL, &status);
unum_formatDouble(pform, 3600, buffer, 256, NULL, &status);
pform_cloned = unum_clone(pform,&status);
unum_formatDouble(pform_cloned, 3600, buffer_cloned, 256, NULL, &status);
if (u_strcmp(buffer,buffer_cloned)) {
log_err("Result from cloned formatter not identical to the original. Original: %s Cloned: %s",u_austrcpy(temp1, buffer),u_austrcpy(temp2,buffer_cloned));
}
}
#endif /* #if !UCONFIG_NO_FORMATTING */

View File

@ -70,6 +70,11 @@ static void TestCurrencyRegression(void);
**/
static void TestParseZero(void);
/**
* Test cloning formatter with RBNF
**/
static void TestCloneWithRBNF(void);
#endif /* #if !UCONFIG_NO_FORMATTING */
#endif