return move;
}
+template <typename Derived>
+Derived NumberFormatterSettings<Derived>::displayOptions(const DisplayOptions &displayOptions) const & {
+ Derived copy(*this);
+ // `displayCase` does not recognise the `undefined`
+ if (displayOptions.getGrammaticalCase() == UDISPOPT_GRAMMATICAL_CASE_UNDEFINED) {
+ copy.fMacros.unitDisplayCase.set(nullptr);
+ return copy;
+ }
+
+ copy.fMacros.unitDisplayCase.set(
+ udispopt_getGrammaticalCaseIdentifier(displayOptions.getGrammaticalCase()));
+ return copy;
+}
+
+template <typename Derived>
+Derived NumberFormatterSettings<Derived>::displayOptions(const DisplayOptions &displayOptions) && {
+ Derived move(std::move(*this));
+ // `displayCase` does not recognise the `undefined`
+ if (displayOptions.getGrammaticalCase() == UDISPOPT_GRAMMATICAL_CASE_UNDEFINED) {
+ move.fMacros.unitDisplayCase.set(nullptr);
+ return move;
+ }
+
+ move.fMacros.unitDisplayCase.set(
+ udispopt_getGrammaticalCaseIdentifier(displayOptions.getGrammaticalCase()));
+ return move;
+}
+
template<typename Derived>
Derived NumberFormatterSettings<Derived>::unitDisplayCase(const StringPiece unitDisplayCase) const& {
Derived copy(*this);
#include "unicode/bytestream.h"
#include "unicode/currunit.h"
#include "unicode/dcfmtsym.h"
+#include "unicode/displayoptions.h"
#include "unicode/fieldpos.h"
#include "unicode/formattedvalue.h"
#include "unicode/fpositer.h"
Derived usage(StringPiece usage) &&;
#ifndef U_HIDE_DRAFT_API
-#ifndef U_HIDE_INTERNAL_API
/**
+ * Specifies the DisplayOptions. For example, UDisplayOptionsGrammaticalCase specifies
+ * the desired case for a unit formatter's output (e.g. accusative, dative, genitive).
+ *
+ * @param displayOptions
+ * @return The fluent chain.
+ * @draft ICU 72
+ */
+ Derived displayOptions(const DisplayOptions &displayOptions) const &;
+
+ /**
+ * Overload of displayOptions() for use on an rvalue reference.
+ *
+ * @param displayOptions
+ * @return The fluent chain.
+ * @draft ICU 72
+ */
+ Derived displayOptions(const DisplayOptions &displayOptions) &&;
+#endif // U_HIDE_DRAFT_API
+
+#ifndef U_HIDE_DEPRECATED_API
+ /**
+ * NOTE: This function is deprecated, use `displayOptions` instead.
+ *
* Specifies the desired case for a unit formatter's output (e.g.
* accusative, dative, genitive).
*
- * @internal ICU 69 technology preview
+ * @deprecated ICU 72
*/
Derived unitDisplayCase(StringPiece unitDisplayCase) const &;
/**
* Overload of unitDisplayCase() for use on an rvalue reference.
*
- * @internal ICU 69 technology preview
+ * @deprecated ICU 72
*/
Derived unitDisplayCase(StringPiece unitDisplayCase) &&;
-#endif // U_HIDE_INTERNAL_API
-#endif // U_HIDE_DRAFT_API
+#endif // U_HIDE_DEPRECATED_API
#ifndef U_HIDE_INTERNAL_API
#if !UCONFIG_NO_FORMATTING
-#include "charstr.h"
-#include <cstdarg>
#include <cmath>
+#include <cstdarg>
#include <memory>
-#include "unicode/unum.h"
+
+#include "unicode/displayoptions.h"
#include "unicode/numberformatter.h"
#include "unicode/testlog.h"
+#include "unicode/unum.h"
#include "unicode/utypes.h"
+
+#include "charstr.h"
#include "number_asformat.h"
+#include "number_microprops.h"
#include "number_types.h"
#include "number_utils.h"
#include "number_utypes.h"
-#include "number_microprops.h"
#include "numbertest.h"
using number::impl::UFormattedNumberData;
skel, skel, unf, Locale(t.locale), t.value, t.expected);
status.assertSuccess();
}
+
+ for (int32_t i = 0; i < numCases; i++) {
+ UnitInflectionTestCase t = cases[i];
+ status.assertSuccess();
+ MeasureUnit mu = MeasureUnit::forIdentifier(t.unitIdentifier, status);
+ if (status.errIfFailureAndReset("MeasureUnit::forIdentifier(\"%s\", ...) failed",
+ t.unitIdentifier)) {
+ continue;
+ };
+
+ UnicodeString skelString = UnicodeString("unit/") + t.unitIdentifier + u" " + skeleton;
+ const UChar *skel;
+ auto displayOptionsBuilder = DisplayOptions::builder();
+ if (t.unitDisplayCase == nullptr || t.unitDisplayCase[0] == 0) {
+ auto displayoptions = displayOptionsBuilder.build();
+ unf = unf.unit(mu).displayOptions(displayoptions);
+ skel = skelString.getTerminatedBuffer();
+ } else {
+ auto displayoptions =
+ displayOptionsBuilder
+ .setGrammaticalCase(udispopt_fromGrammaticalCaseIdentifier(t.unitDisplayCase))
+ .build();
+ unf = unf.unit(mu).displayOptions(displayoptions);
+ // No skeleton support for unitDisplayCase yet.
+ skel = nullptr;
+ }
+ assertFormatSingle((UnicodeString("Unit: \"") + t.unitIdentifier + ("\", \"") + skeleton +
+ u"\", locale=\"" + t.locale + u"\", case=\"" +
+ (t.unitDisplayCase ? t.unitDisplayCase : "") + u"\", value=" + t.value)
+ .getTerminatedBuffer(),
+ skel, skel, unf, Locale(t.locale), t.value, t.expected);
+ status.assertSuccess();
+ }
}
void NumberFormatterApiTest::unitInflections() {
// License & terms of use: http://www.unicode.org/copyright.html
package com.ibm.icu.number;
+import com.ibm.icu.text.DisplayOptions;
+import com.ibm.icu.text.DisplayOptions.GrammaticalCase;
import java.math.RoundingMode;
import com.ibm.icu.impl.number.MacroProps;
return create(KEY_USAGE, usage);
}
+ /**
+ * Specifies the {@code DisplayOptions}. For example, {@code GrammaticalCase} specifies
+ * the desired case for a unit formatter's output (e.g. accusative, dative, genitive).
+ *
+ * @return The fluent chain.
+ * @draft ICU 72
+ */
+ public T displayOptions(DisplayOptions displayOptions) {
+ // `displayCase` does not recognise the `undefined`
+ if (displayOptions.getGrammaticalCase() == GrammaticalCase.UNDEFINED) {
+ return create(KEY_UNIT_DISPLAY_CASE, null);
+ }
+
+ return create(KEY_UNIT_DISPLAY_CASE, displayOptions.getGrammaticalCase().getIdentifier());
+ }
+
/**
* Specifies the desired case for a unit formatter's output (e.g.
* accusative, dative, genitive).
// License & terms of use: http://www.unicode.org/copyright.html
package com.ibm.icu.dev.test.number;
+
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import org.junit.Ignore;
import org.junit.Test;
+import com.ibm.icu.text.DisplayOptions;
+import com.ibm.icu.text.DisplayOptions.GrammaticalCase;
import com.ibm.icu.dev.test.TestFmwk;
import com.ibm.icu.dev.test.format.FormattedValueTest;
import com.ibm.icu.dev.test.serializable.SerializableTestUtility;
"\", value=" + this.value,
skel, skel, unf, new ULocale(this.locale), this.value, this.expected);
}
+
+ public void runTestWithDisplayOptions(UnlocalizedNumberFormatter unf, String skeleton) {
+ MeasureUnit mu = MeasureUnit.forIdentifier(unitIdentifier);
+ String skel;
+
+ DisplayOptions.Builder displayOptionsBuilder = DisplayOptions.builder();
+ if (this.unitDisplayCase == null || this.unitDisplayCase.isEmpty()) {
+ DisplayOptions displayOptions = displayOptionsBuilder.build();
+ unf = unf.unit(mu).displayOptions(displayOptions);
+ skel = "unit/" + unitIdentifier + " " + skeleton;
+ } else {
+ DisplayOptions displayOptions = displayOptionsBuilder.setGrammaticalCase(
+ GrammaticalCase.fromIdentifier(this.unitDisplayCase)).build();
+ unf = unf.unit(mu).displayOptions(displayOptions);
+ // No skeleton support for unitDisplayCase yet.
+ skel = null;
+ }
+ assertFormatSingle("\"" + skeleton + "\", locale=\"" + this.locale + "\", case=\"" +
+ (this.unitDisplayCase != null ? this.unitDisplayCase : "") +
+ "\", value=" + this.value,
+ skel, skel, unf, new ULocale(this.locale), this.value, this.expected);
+ }
}
@Test
};
for (UnitInflectionTestCase t : percentCases) {
t.runTest(unf, skeleton);
+ t.runTestWithDisplayOptions(unf, skeleton);
}
}
{
};
for (UnitInflectionTestCase t : testCases) {
t.runTest(unf, skeleton);
+ t.runTestWithDisplayOptions(unf, skeleton);
}
}
{
};
for (UnitInflectionTestCase t : meterPerDayCases) {
t.runTest(unf, skeleton);
+ t.runTestWithDisplayOptions(unf, skeleton);
}
}
// TODO: add a usage case that selects between preferences with different