static jcharArray formatResult(JNIEnv* env, const UnicodeString& s, FieldPositionIterator* fpi, jobject javaFieldPositionIterator) { static jmethodID gFPI_setData = env->GetMethodID(JniConstants::fieldPositionIteratorClass, "setData", "([I)V"); if (fpi != NULL) { std::vector<int32_t> data; FieldPosition fp; while (fpi->next(fp)) { data.push_back(fp.getField()); data.push_back(fp.getBeginIndex()); data.push_back(fp.getEndIndex()); } jintArray javaData = NULL; if (!data.empty()) { javaData = env->NewIntArray(data.size()); if (javaData == NULL) { return NULL; } ScopedIntArrayRW ints(env, javaData); if (ints.get() == NULL) { return NULL; } memcpy(ints.get(), &data[0], data.size() * sizeof(int32_t)); } env->CallVoidMethod(javaFieldPositionIterator, gFPI_setData, javaData); } jcharArray result = env->NewCharArray(s.length()); if (result != NULL) { env->SetCharArrayRegion(result, 0, s.length(), s.getBuffer()); } return result; }
bool NumberStringBuilder::nextFieldPosition(FieldPosition& fp, UErrorCode& status) const { int32_t rawField = fp.getField(); if (rawField == FieldPosition::DONT_CARE) { return FALSE; } if (rawField < 0 || rawField >= UNUM_FIELD_COUNT) { status = U_ILLEGAL_ARGUMENT_ERROR; return FALSE; } auto field = static_cast<Field>(rawField); bool seenStart = false; int32_t fractionStart = -1; int32_t startIndex = fp.getEndIndex(); for (int i = fZero + startIndex; i <= fZero + fLength; i++) { Field _field = UNUM_FIELD_COUNT; if (i < fZero + fLength) { _field = getFieldPtr()[i]; } if (seenStart && field != _field) { // Special case: GROUPING_SEPARATOR counts as an INTEGER. if (field == UNUM_INTEGER_FIELD && _field == UNUM_GROUPING_SEPARATOR_FIELD) { continue; } fp.setEndIndex(i - fZero); break; } else if (!seenStart && field == _field) { fp.setBeginIndex(i - fZero); seenStart = true; } if (_field == UNUM_INTEGER_FIELD || _field == UNUM_DECIMAL_SEPARATOR_FIELD) { fractionStart = i - fZero + 1; } } // Backwards compatibility: FRACTION needs to start after INTEGER if empty. // Do not return that a field was found, though, since there is not actually a fraction part. if (field == UNUM_FRACTION_FIELD && !seenStart && fractionStart != -1) { fp.setBeginIndex(fractionStart); fp.setEndIndex(fractionStart); } return seenStart; }
void test_FieldPosition( void ) { FieldPosition fp( 7 ); if (fp.getField() == 7) { it_logln("FP constructor(int32_t) and getField tested."); }else{ it_errln("*** FP constructor(int32_t) or getField"); } FieldPosition* fph = new FieldPosition( 3 ); if ( fph->getField() != 3) it_errln("*** FP getField or heap constr."); delete fph; UBool err1 = FALSE; UBool err2 = FALSE; UBool err3 = FALSE; for (int32_t i = -50; i < 50; i++ ) { fp.setField( i+8 ); fp.setBeginIndex( i+6 ); fp.setEndIndex( i+7 ); if (fp.getField() != i+8) err1 = TRUE; if (fp.getBeginIndex() != i+6) err2 = TRUE; if (fp.getEndIndex() != i+7) err3 = TRUE; } if (!err1) { it_logln("FP setField and getField tested."); }else{ it_errln("*** FP setField or getField"); } if (!err2) { it_logln("FP setBeginIndex and getBeginIndex tested."); }else{ it_errln("*** FP setBeginIndex or getBeginIndex"); } if (!err3) { it_logln("FP setEndIndex and getEndIndex tested."); }else{ it_errln("*** FP setEndIndex or getEndIndex"); } it_logln(""); }
void NumberStringBuilder::populateFieldPosition(FieldPosition &fp, int32_t offset, UErrorCode &status) const { int32_t rawField = fp.getField(); if (rawField == FieldPosition::DONT_CARE) { return; } if (rawField < 0 || rawField >= UNUM_FIELD_COUNT) { status = U_ILLEGAL_ARGUMENT_ERROR; return; } auto field = static_cast<Field>(rawField); bool seenStart = false; int32_t fractionStart = -1; for (int i = fZero; i <= fZero + fLength; i++) { Field _field = UNUM_FIELD_COUNT; if (i < fZero + fLength) { _field = getFieldPtr()[i]; } if (seenStart && field != _field) { // Special case: GROUPING_SEPARATOR counts as an INTEGER. if (field == UNUM_INTEGER_FIELD && _field == UNUM_GROUPING_SEPARATOR_FIELD) { continue; } fp.setEndIndex(i - fZero + offset); break; } else if (!seenStart && field == _field) { fp.setBeginIndex(i - fZero + offset); seenStart = true; } if (_field == UNUM_INTEGER_FIELD || _field == UNUM_DECIMAL_SEPARATOR_FIELD) { fractionStart = i - fZero + 1; } } // Backwards compatibility: FRACTION needs to start after INTEGER if empty if (field == UNUM_FRACTION_FIELD && !seenStart) { fp.setBeginIndex(fractionStart + offset); fp.setEndIndex(fractionStart + offset); } }