void ICULocale::setDecimalTextAttribute(String& destination, UNumberFormatTextAttribute tag) { UErrorCode status = U_ZERO_ERROR; int32_t bufferLength = unum_getTextAttribute(m_numberFormat, tag, 0, 0, &status); ASSERT(U_SUCCESS(status) || status == U_BUFFER_OVERFLOW_ERROR); if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR) return; Vector<UChar> buffer(bufferLength); status = U_ZERO_ERROR; unum_getTextAttribute(m_numberFormat, tag, buffer.data(), bufferLength, &status); ASSERT(U_SUCCESS(status)); if (U_FAILURE(status)) return; destination = String::adopt(buffer); }
String LocaleICU::decimalTextAttribute(UNumberFormatTextAttribute tag) { UErrorCode status = U_ZERO_ERROR; int32_t bufferLength = unum_getTextAttribute(m_numberFormat, tag, 0, 0, &status); ASSERT(U_SUCCESS(status) || status == U_BUFFER_OVERFLOW_ERROR); if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR) return String(); StringBuffer<UChar> buffer(bufferLength); status = U_ZERO_ERROR; unum_getTextAttribute(m_numberFormat, tag, buffer.characters(), bufferLength, &status); ASSERT(U_SUCCESS(status)); if (U_FAILURE(status)) return String(); return String::adopt(buffer); }
static jstring NativeDecimalFormat_getTextAttribute(JNIEnv* env, jclass, jlong addr, jint javaAttr) { UErrorCode status = U_ZERO_ERROR; UNumberFormat* fmt = toUNumberFormat(addr); UNumberFormatTextAttribute attr = static_cast<UNumberFormatTextAttribute>(javaAttr); // Find out how long the result will be... UniquePtr<UChar[]> chars; uint32_t charCount = 0; uint32_t desiredCount = unum_getTextAttribute(fmt, attr, chars.get(), charCount, &status); if (status == U_BUFFER_OVERFLOW_ERROR) { // ...then get it. status = U_ZERO_ERROR; charCount = desiredCount + 1; chars.reset(new UChar[charCount]); charCount = unum_getTextAttribute(fmt, attr, chars.get(), charCount, &status); } return maybeThrowIcuException(env, "unum_getTextAttribute", status) ? NULL : env->NewString(chars.get(), charCount); }
static String HHVM_METHOD(NumberFormatter, getTextAttribute, int64_t attr) { NUMFMT_GET(obj, this_, String()); UErrorCode error = U_ZERO_ERROR; int32_t len = unum_getTextAttribute(obj->formatter(), (UNumberFormatTextAttribute)attr, nullptr, 0, &error); if (error != U_BUFFER_OVERFLOW_ERROR) { obj->setError(error); return String(); } icu::UnicodeString out; error = U_ZERO_ERROR; len = unum_getTextAttribute(obj->formatter(), (UNumberFormatTextAttribute)attr, out.getBuffer(len + 1), len + 1, &error); NUMFMT_CHECK(obj, error, String()); out.releaseBuffer(len); String ret(u8(out, error)); NUMFMT_CHECK(obj, error, String()); return ret; }
//static jstring NativeDecimalFormat_getTextAttribute(JNIEnv* env, jclass, jint addr, jint javaAttr) { JNIEXPORT jstring JNICALL Java_com_ibm_icu4jni_text_NativeDecimalFormat_getTextAttribute(JNIEnv* env, jclass, jint addr, jint javaAttr) { UErrorCode status = U_ZERO_ERROR; UNumberFormat* fmt = toUNumberFormat(addr); UNumberFormatTextAttribute attr = static_cast<UNumberFormatTextAttribute> (javaAttr); // Find out how long the result will be... UniquePtr<UChar[]> chars; uint32_t charCount = 0; uint32_t desiredCount = unum_getTextAttribute(fmt, attr, chars.get(), charCount, &status); if (status == U_BUFFER_OVERFLOW_ERROR) { // ...then get it. status = U_ZERO_ERROR; charCount = desiredCount + 1; chars.reset(new UChar[charCount]); charCount = unum_getTextAttribute(fmt, attr, chars.get(), charCount, &status); } return icu4jni_error(env, status) ? NULL : env->NewString( (const jchar*) chars.get(), charCount); }
/* TODO: Is setting the prefix symbol to a positive sign a good idea in all locales? */ static void u_printf_set_sign(UNumberFormat *format, const u_printf_spec_info *info, UChar *prefixBuffer, int32_t *prefixBufLen, UErrorCode *status) { if(info->fShowSign) { *prefixBufLen = unum_getTextAttribute(format, UNUM_POSITIVE_PREFIX, prefixBuffer, *prefixBufLen, status); if (info->fSpace) { /* Setting UNUM_PLUS_SIGN_SYMBOL affects the exponent too. */ /* unum_setSymbol(format, UNUM_PLUS_SIGN_SYMBOL, gSpaceStr, 1, &status); */ unum_setTextAttribute(format, UNUM_POSITIVE_PREFIX, gSpaceStr, 1, status); } else { UChar plusSymbol[UPRINTF_SYMBOL_BUFFER_SIZE]; int32_t symbolLen; symbolLen = unum_getSymbol(format, UNUM_PLUS_SIGN_SYMBOL, plusSymbol, sizeof(plusSymbol)/sizeof(*plusSymbol), status); unum_setTextAttribute(format, UNUM_POSITIVE_PREFIX, plusSymbol, symbolLen, status); } } else { *prefixBufLen = 0; } }
/** * Test currency "object" (we use this name to match the other C++ * test name and the Jave name). Actually, test ISO currency code * support in the C API. */ static void TestCurrencyObject(void) { UNumberFormat *currencyFmt; UChar *str=NULL, *res=NULL; int32_t lneed, i; UFieldPosition pos; UErrorCode status = U_ZERO_ERROR; const char* locale[]={ "fr_FR", "fr_FR", }; const char* currency[]={ "", "JPY", }; const char* result[]={ "1\\u202F234,56\\u00A0\\u20AC", "1\\u202F235\\u00A0JPY", }; log_verbose("\nTesting the number format with different currency codes\n"); for(i=0; i < 2; i++) { char cStr[20]={0}; UChar isoCode[16]={0}; currencyFmt = unum_open(UNUM_CURRENCY, NULL,0,locale[i],NULL, &status); if(U_FAILURE(status)){ log_data_err("Error in the construction of number format with style currency: %s (Are you missing data?)\n", myErrorName(status)); } else { if (*currency[i]) { u_uastrcpy(isoCode, currency[i]); unum_setTextAttribute(currencyFmt, UNUM_CURRENCY_CODE, isoCode, u_strlen(isoCode), &status); if(U_FAILURE(status)) { log_err("FAIL: can't set currency code %s\n", myErrorName(status) ); } } unum_getTextAttribute(currencyFmt, UNUM_CURRENCY_CODE, isoCode, sizeof(isoCode), &status); if(U_FAILURE(status)) { log_err("FAIL: can't get currency code %s\n", myErrorName(status) ); } u_UCharsToChars(isoCode,cStr,u_strlen(isoCode)); log_verbose("ISO code %s\n", cStr); if (*currency[i] && uprv_strcmp(cStr, currency[i])) { log_err("FAIL: currency should be %s, but is %s\n", currency[i], cStr); } lneed=0; lneed= unum_formatDouble(currencyFmt, 1234.56, NULL, lneed, NULL, &status); if(status==U_BUFFER_OVERFLOW_ERROR){ status=U_ZERO_ERROR; str=(UChar*)malloc(sizeof(UChar) * (lneed+1) ); pos.field = 0; unum_formatDouble(currencyFmt, 1234.56, str, lneed+1, &pos, &status); } if(U_FAILURE(status)) { log_err("Error in formatting using unum_formatDouble(.....): %s\n", myErrorName(status) ); } else { res=(UChar*)malloc(sizeof(UChar) * (strlen(result[i])+1) ); u_unescape(result[i],res, (int32_t)(strlen(result[i])+1)); if (u_strcmp(str, res) != 0){ log_err("FAIL: Expected %s Got: %s for locale: %s\n", result[i],aescstrdup(str, -1),locale[i]); } } } unum_close(currencyFmt); free(str); free(res); } }