22#include <rtl/ustrbuf.hxx>
35#include <unordered_map>
36#include <com/sun/star/i18n/CharacterClassification.hpp>
37#include <com/sun/star/i18n/NativeNumberMode.hpp>
38#include <com/sun/star/linguistic2/NumberText.hpp>
50 sal_Int16 exponentCount;
51 const sal_Int16 *multiplierExponent;
56#define NUMBER_OMIT_ZERO (1 << 0)
57#define NUMBER_OMIT_ONLY_ZERO (1 << 1)
58#define NUMBER_OMIT_ONE_1 (1 << 2)
59#define NUMBER_OMIT_ONE_2 (1 << 3)
60#define NUMBER_OMIT_ONE_3 (1 << 4)
61#define NUMBER_OMIT_ONE_4 (1 << 5)
62#define NUMBER_OMIT_ONE_5 (1 << 6)
63#define NUMBER_OMIT_ONE_6 (1 << 7)
64#define NUMBER_OMIT_ONE_7 (1 << 8)
65#define NUMBER_OMIT_ONE (NUMBER_OMIT_ONE_1|NUMBER_OMIT_ONE_2|NUMBER_OMIT_ONE_3|NUMBER_OMIT_ONE_4|NUMBER_OMIT_ONE_5|NUMBER_OMIT_ONE_6|NUMBER_OMIT_ONE_7)
66#define NUMBER_OMIT_ONE_CHECK(bit) (1 << (2 + bit))
67#define NUMBER_OMIT_ALL ( NUMBER_OMIT_ZERO|NUMBER_OMIT_ONE|NUMBER_OMIT_ONLY_ZERO )
68#define NUMBER_OMIT_ZERO_ONE ( NUMBER_OMIT_ZERO|NUMBER_OMIT_ONE )
69#define NUMBER_OMIT_ONE_67 (NUMBER_OMIT_ONE_6|NUMBER_OMIT_ONE_7)
70#define NUMBER_OMIT_ZERO_ONE_67 ( NUMBER_OMIT_ZERO|NUMBER_OMIT_ONE_67 )
76std::mutex theNatNumMutex;
86 Sequence< sal_Int32 >* pOffset, sal_Int16 number )
89 rtl_uString *newStr = rtl_uString_alloc(
nCount);
92 auto ppOffset = pOffset ? pOffset->getArray() :
nullptr;
107 newStr->buffer[
i] =
ch;
111 return OUString(newStr, SAL_NO_ACQUIRE);
115 sal_Unicode *dst, sal_Int32& count, sal_Int16 multiChar_index, Sequence< sal_Int32 >* pOffset, sal_Int32 startPos,
116 const Number *number,
const sal_Unicode* numberChar)
118 sal_Unicode multiChar = (multiChar_index == -1 ? 0 : number->multiplierChar[multiChar_index]);
119 auto ppOffset = pOffset ? pOffset->getArray() :
nullptr;
120 if ( len <= number->multiplierExponent[number->exponentCount-1] ) {
121 if (number->multiplierExponent[number->exponentCount-1] > 1) {
122 bool bNotZero =
false;
132 if (bNotZero && multiChar > 0) {
133 dst[
count] = multiChar;
147 dst[
count] = multiChar;
153 dst[
count] = numberChar[0];
160 bool bPrintPower =
false;
162 for (sal_Int16
i = 1;
i <= number->exponentCount;
i++) {
163 sal_Int32 tmp = len - (
i == number->exponentCount ? 0 : number->multiplierExponent[
i]);
166 (
i == number->exponentCount ? -1 :
i), pOffset, startPos, number, numberChar);
172 if (
count > 0 && number->multiplierExponent[number->exponentCount-1] == 1 &&
173 dst[
count-1] == numberChar[0])
176 dst[
count] = multiChar;
188 Sequence< sal_Int32 >* pOffset,
const Number* number )
192 sal_Int32 strLen = inStr.getLength();
203 sal_Int32
i, len = 0,
count = 0;
206 pOffset->realloc(
nCount * 2 );
207 auto ppOffset = pOffset ? pOffset->getArray() :
nullptr;
208 bool bDoDecimal =
false;
220 srcStr[len++] = str[
i];
225 bool bNotZero =
false;
226 for (sal_Int32
begin = 0,
end = len % number->multiplierExponent[0];
227 end <= len; begin = end, end += number->multiplierExponent[0]) {
228 if (
end == 0)
continue;
229 sal_Int32 _count =
count;
231 end == len ? -1 : 0, pOffset,
i - len, number, numberChar);
232 if (
count > 0 && number->multiplierExponent[number->exponentCount-1] == 1 &&
233 newStr[
count-1] == numberChar[0])
235 if (bNotZero && _count ==
count &&
end != len) {
236 newStr[
count] = number->multiplierChar[0];
238 ppOffset[
count] =
i - len;
243 newStr[
count] = numberChar[0];
245 ppOffset[
count] =
i - len;
268 pOffset->realloc(
count);
269 aRet = OUString(newStr.get(),
count);
276void NativeToAscii_numberMaker(sal_Int16 max, sal_Int16 prev,
const sal_Unicode *str,
277 sal_Int32& i, sal_Int32 nCount,
sal_Unicode *dst, sal_Int32& count, Sequence< sal_Int32 >* pOffset,
278 OUString& numberChar, OUString& multiplierChar)
280 auto ppOffset = pOffset ? pOffset->getArray() :
nullptr;
281 sal_Int16 curr = 0, num = 0,
end = 0,
shift = 0;
282 while (++i < nCount) {
283 if ((curr = sal::static_int_cast<sal_Int16>( numberChar.indexOf(str[i]) )) >= 0) {
287 }
else if ((curr = sal::static_int_cast<sal_Int16>( multiplierChar.indexOf(str[i]) )) >= 0) {
289 if (prev > curr && num == 0) num = 1;
293 else if (curr > prev)
297 while (end++ < prev) {
305 for (
const sal_Int32 countEnd = count+shift;
count < countEnd;
count++) {
312 NativeToAscii_numberMaker(max, curr, str, i, nCount, dst,
313 count, pOffset, numberChar, multiplierChar);
318 while (end++ < prev) {
327OUString NativeToAscii(
const OUString& inStr,
328 sal_Int32 nCount, Sequence< sal_Int32 >* pOffset )
332 sal_Int32 strLen = inStr.getLength();
342 auto ppOffset = pOffset ? pOffset->getArray() :
nullptr;
346 OUString numberChar, multiplierChar, decimalChar, separatorChar;
351 separatorChar = OUString(
355 if ((index = multiplierChar.indexOf(str[i])) >= 0) {
356 if (count == 0 || !
isNumber(newStr[count-1])) {
363 NativeToAscii_numberMaker(
364 sal::static_int_cast<sal_Int16>( index ), sal::static_int_cast<sal_Int16>( index ),
365 str, i, nCount, newStr.get(), count, pOffset,
366 numberChar, multiplierChar);
368 if ((index = numberChar.indexOf(str[i])) >= 0)
369 newStr[
count] = sal::static_int_cast<sal_Unicode>( (index % 10) +
NUMBER_ZERO );
370 else if (separatorChar.indexOf(str[i]) >= 0 &&
371 (i < nCount-1 && (numberChar.indexOf(str[i+1]) >= 0 ||
372 multiplierChar.indexOf(str[i+1]) >= 0)))
374 else if (decimalChar.indexOf(str[i]) >= 0 &&
375 (i < nCount-1 && (numberChar.indexOf(str[i+1]) >= 0 ||
376 multiplierChar.indexOf(str[i+1]) >= 0)))
380 else if (minusChar.find(str[i]) != std::u16string_view::npos &&
381 (i < nCount-1 && (numberChar.indexOf(str[i+1]) >= 0 ||
382 multiplierChar.indexOf(str[i+1]) >= 0)))
395 pOffset->realloc(count);
397 aRet = OUString(newStr.get(), count);
402const Number natnum4[4] = {
413const Number natnum5[4] = {
424const Number natnum6[4] = {
435const Number natnum7[4] = {
446const Number natnum8[4] = {
464const char *natnum1Locales[] = {
496const sal_Int16 natnum1[] = {
528const sal_Int16 natnum2[] = {
537sal_Int16 getLanguageNumber(
const Locale& rLocale)
542 for (sal_Int16 i = 2;
i < nbOfLocale;
i++)
543 if (rLocale.Language.equalsAsciiL(natnum1Locales[i], 2))
553 Separators(
const Locale& rLocale)
561Separators getLocaleSeparators(
const Locale& rLocale,
const OUString& rLocStr)
564 std::scoped_lock aGuard(theNatNumMutex);
566 static std::unordered_map<OUString, Separators> aLocaleSeparatorsBuf;
567 auto it = aLocaleSeparatorsBuf.find(rLocStr);
568 if (it == aLocaleSeparatorsBuf.end())
570 it = aLocaleSeparatorsBuf.emplace(rLocStr, Separators(rLocale)).first;
575OUString getNumberText(
const Locale& rLocale,
const OUString& rNumberString,
576 std::u16string_view sNumberTextParams)
579 const sal_Int32 len = rNumberString.getLength();
583 Separators aSeparators = getLocaleSeparators(rLocale, aLoc);
585 OUStringBuffer sBuf(len);
586 for (i = 0;
i < len;
i++)
589 if (
isNumber(ch) || ch == aSeparators.DecimalSeparator)
594 else if (ch == aSeparators.ThousandSeparator && count > 0)
596 else if (
isMinus(ch) && count == 0)
603 const OUString& rNumberStr = (
count == 0) ? rNumberString : sBuf.makeStringAndClear();
605 static auto xNumberText
609 std::scoped_lock aGuard( theNatNumMutex );
611 OUString numbertext_prefix;
613 if (!sNumberTextParams.empty() && sNumberTextParams != u
"cardinal")
614 numbertext_prefix = OUString::Concat(sNumberTextParams) +
" ";
618 static std::unordered_map<OUString, std::map<OUString, OUString>> aBuff;
619 auto& rItems = aBuff[rNumberStr];
620 auto& rItem = rItems[numbertext_prefix + aLoc];
623 rItem = xNumberText->getNumberText(numbertext_prefix + rNumberStr, rLocale);
628 OUString sResult = rItem;
629 if (i != 0 && i < len)
630 sResult += rNumberString.subView(i);
636 sal_Int16 nNativeNumberMode,
637 Sequence<sal_Int32>* pOffset,
638 std::u16string_view rNativeNumberParams)
641 return aNumberString;
643 if (nNativeNumberMode == NativeNumberMode::NATNUM12)
657 std::u16string_view aLiteral;
661 static const CasingEntry Casings[] =
663 { std::u16string_view(u
"capitalize"),
CAPITALIZE },
664 { std::u16string_view(u
"upper"), UPPER },
665 { std::u16string_view(u
"lower"), LOWER },
666 { std::u16string_view(u
"title"),
TITLE }
669 std::size_t nStripCase = 0;
675 nStripCase = Casings[nCasing].aLiteral.size();
680 if (nStripCase > 0 && (rNativeNumberParams.size() == nStripCase ||
681 rNativeNumberParams[nStripCase++] ==
' '))
683 OUString
aStr = getNumberText(rLocale, aNumberString, rNativeNumberParams.substr(nStripCase));
688 switch (Casings[nCasing].eCasing)
692 (
aStr.getLength() > 1 ?
aStr.subView(1) :
u"");
699 if ( rLocale.Language ==
"en" )
710 return aStr.replaceAll(
"- ",
"-").replaceAll(
" And ",
" and ");
719 return getNumberText(rLocale, aNumberString, rNativeNumberParams);
723 sal_Int16 langnum = getLanguageNumber(rLocale);
725 return aNumberString;
727 const Number *number =
nullptr;
730 switch (nNativeNumberMode)
732 case NativeNumberMode::NATNUM0:
733 return NativeToAscii(aNumberString, aNumberString.getLength(), pOffset);
734 case NativeNumberMode::NATNUM1:
735 num = natnum1[langnum];
737 case NativeNumberMode::NATNUM2:
738 num = natnum2[langnum];
740 case NativeNumberMode::NATNUM3:
743 case NativeNumberMode::NATNUM4:
744 number = &natnum4[langnum];
746 case NativeNumberMode::NATNUM5:
747 number = &natnum5[langnum];
749 case NativeNumberMode::NATNUM6:
750 number = &natnum6[langnum];
752 case NativeNumberMode::NATNUM7:
753 number = &natnum7[langnum];
755 case NativeNumberMode::NATNUM8:
756 number = &natnum8[langnum];
758 case NativeNumberMode::NATNUM9:
761 case NativeNumberMode::NATNUM10:
764 case NativeNumberMode::NATNUM11:
771 if (number || num >= 0) {
772 if (
aLocale.Language != rLocale.Language ||
773 aLocale.Country != rLocale.Country ||
774 aLocale.Variant != rLocale.Variant) {
789 return AsciiToNative( aNumberString, aNumberString.getLength(), pOffset, number );
792 nNativeNumberMode == NativeNumberMode::NATNUM2);
796 return AsciiToNativeChar(aNumberString, aNumberString.getLength(), pOffset, num);
799 return aNumberString;
803 sal_Int16 nNativeNumberMode)
809 const OUString& rNumberString,
const css::lang::Locale& rLocale, sal_Int16 nNativeNumberMode,
810 const OUString& rNativeNumberParams)
812 return getNativeNumberString(rNumberString, rLocale, nNativeNumberMode,
nullptr, rNativeNumberParams);
817 if (nNativeNumberMode == NativeNumberMode::NATNUM0) {
819 for (sal_Int16 j = 0; j < 10; j++)
831 sal_Int16 langnum = getLanguageNumber(rLocale);
835 switch (nNativeNumberMode)
837 case NativeNumberMode::NATNUM1:
838 case NativeNumberMode::NATNUM4:
839 case NativeNumberMode::NATNUM7:
841 case NativeNumberMode::NATNUM2:
842 case NativeNumberMode::NATNUM5:
843 case NativeNumberMode::NATNUM8:
845 case NativeNumberMode::NATNUM3:
846 case NativeNumberMode::NATNUM6:
848 case NativeNumberMode::NATNUM9:
849 case NativeNumberMode::NATNUM10:
850 case NativeNumberMode::NATNUM11:
861 sal_Int16 langnum = getLanguageNumber(rLocale);
863 switch (nNativeNumberMode) {
864 case NativeNumberMode::NATNUM0:
865 case NativeNumberMode::NATNUM3:
866 case NativeNumberMode::NATNUM12:
868 case NativeNumberMode::NATNUM1:
869 return (langnum >= 0);
870 case NativeNumberMode::NATNUM2:
874 case NativeNumberMode::NATNUM4:
875 case NativeNumberMode::NATNUM5:
876 case NativeNumberMode::NATNUM6:
877 case NativeNumberMode::NATNUM7:
878 case NativeNumberMode::NATNUM8:
879 return (langnum >= 0 && langnum < 4);
880 case NativeNumberMode::NATNUM9:
881 case NativeNumberMode::NATNUM10:
882 case NativeNumberMode::NATNUM11:
883 return (langnum == 3);
890 static const sal_Int16 attShort = 0;
891 static const sal_Int16 attMedium = 1;
892 static const sal_Int16 attLong = 2;
893 static const char *attType[] = {
"short",
"medium",
"long" };
897 sal_Int16 langnum = -1;
899 langnum = getLanguageNumber(rLocale);
902 switch (nNativeNumberMode) {
903 case NativeNumberMode::NATNUM0:
907 case NativeNumberMode::NATNUM1:
908 number = natnum1[langnum];
911 case NativeNumberMode::NATNUM2:
912 number = natnum2[langnum];
915 case NativeNumberMode::NATNUM3:
919 case NativeNumberMode::NATNUM4:
920 number = natnum1[langnum];
923 case NativeNumberMode::NATNUM5:
924 number = natnum2[langnum];
927 case NativeNumberMode::NATNUM6:
931 case NativeNumberMode::NATNUM7:
932 number = natnum1[langnum];
935 case NativeNumberMode::NATNUM8:
936 number = natnum2[langnum];
939 case NativeNumberMode::NATNUM9:
943 case NativeNumberMode::NATNUM10:
947 case NativeNumberMode::NATNUM11:
955 return NativeNumberXmlAttributes(rLocale, OUString(&
NumberChar[number][1], 1),
956 OUString::createFromAscii(attType[
type]));
959static bool natNumIn(sal_Int16 num,
const sal_Int16 natnum[], sal_Int16 len)
961 for (sal_Int16
i = 0;
i < len;
i++)
962 if (natnum[
i] == num)
974 sal_Int16 num = sal::static_int_cast<sal_Int16>( number.indexOf(aAttr.Format) );
976 if ( aAttr.Style ==
"short" ) {
978 return NativeNumberMode::NATNUM3;
980 return NativeNumberMode::NATNUM9;
981 else if (
natNumIn(num, natnum1, sizeof_natnum1))
982 return NativeNumberMode::NATNUM1;
983 else if (
natNumIn(num, natnum2, sizeof_natnum2))
984 return NativeNumberMode::NATNUM2;
985 }
else if ( aAttr.Style ==
"medium" ) {
987 return NativeNumberMode::NATNUM11;
989 return NativeNumberMode::NATNUM2;
990 else if (
natNumIn(num, natnum1, sizeof_natnum1))
991 return NativeNumberMode::NATNUM7;
992 else if (
natNumIn(num, natnum2, sizeof_natnum2))
993 return NativeNumberMode::NATNUM8;
994 }
else if ( aAttr.Style ==
"long" ) {
996 return NativeNumberMode::NATNUM6;
998 return NativeNumberMode::NATNUM10;
999 else if (
natNumIn(num, natnum1, sizeof_natnum1))
1000 return NativeNumberMode::NATNUM4;
1001 else if (
natNumIn(num, natnum2, sizeof_natnum2))
1002 return NativeNumberMode::NATNUM5;
1006 return NativeNumberMode::NATNUM0;
1016struct HebrewNumberChar {
1055static void makeHebrewNumber(sal_Int64 value, OUStringBuffer& output,
bool isLast,
bool useGeresh)
1057 sal_Int16 num = sal::static_int_cast<sal_Int16>(
value % 1000);
1066 sal_Int16 nbOfChar = 0;
1072 if (num == 15 || num == 16)
1081 output.insert(output.getLength() - 1,
gershayim);
1082 else if (nbOfChar == 1)
1090 sal_Int64
value = 0;
1091 sal_Int32
i,
count = 0, len = aNumberString.getLength();
1094 for (
i = 0;
i < len;
i++) {
1098 return aNumberString;
1107 OUStringBuffer output(
count*2 + 2 + len -
i);
1112 output.append(aNumberString.subView(
i));
1114 return output.makeStringAndClear();
1117 return aNumberString;
1130struct CyrillicNumberChar {
1169 sal_Int16 num = sal::static_int_cast<sal_Int16>(
value % 1000);
1170 if (
value >= 1000) {
1173 if (
value >= 10000 && (
value - 10000) % 1000 != 0) {
1176 if (
value % 1000 == 0)
1181 if (num < 20 && num > 10) {
1197 if (output.getLength() == 1) {
1199 }
else if (output.getLength() == 2) {
1205 }
else if (output.getLength() > 2) {
1206 if (output.indexOf(
" ") == output.getLength() - 2) {
1216 sal_Int64
value = 0;
1217 sal_Int32
i,
count = 0, len = aNumberString.getLength();
1220 for (
i = 0;
i < len;
i++) {
1224 return aNumberString;
1233 OUStringBuffer output(
count*2 + 2 + len -
i);
1238 output.append(aNumberString.subView(
i));
1240 return output.makeStringAndClear();
1243 return aNumberString;
1259Sequence< OUString > SAL_CALL
1267extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface *
1269 css::uno::XComponentContext *,
1270 css::uno::Sequence<css::uno::Any>
const &)
static OUString convertToBcp47(LanguageType nLangID)
static bool isTraditionalChinese(LanguageType nLang)
static rtl::Reference< LocaleDataImpl > get()
css::uno::Reference< css::i18n::XCharacterClassification > xCharClass
css::lang::Locale aLocale
virtual OUString SAL_CALL getNativeNumberStringParams(const OUString &rNumberString, const css::lang::Locale &rLocale, sal_Int16 nNativeNumberMode, const OUString &rNativeNumberParams) override
static bool isValidNatNumImpl(const css::lang::Locale &aLocale, sal_Int16 nNativeNumberMode)
virtual sal_Bool SAL_CALL isValidNatNum(const css::lang::Locale &rLocale, sal_Int16 nNativeNumberMode) override
virtual sal_Int16 SAL_CALL convertFromXmlAttributes(const css::i18n::NativeNumberXmlAttributes &aAttr) override
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
virtual OUString SAL_CALL getNativeNumberString(const OUString &aNumberString, const css::lang::Locale &aLocale, sal_Int16 nNativeNumberMode) override
virtual OUString SAL_CALL getImplementationName() override
static sal_Unicode getNativeNumberChar(const sal_Unicode inChar, const css::lang::Locale &aLocale, sal_Int16 nNativeNumberMode)
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual css::i18n::NativeNumberXmlAttributes SAL_CALL convertToXmlAttributes(const css::lang::Locale &aLocale, sal_Int16 nNativeNumberMode) override
constexpr OUStringLiteral TITLE
#define SAL_N_ELEMENTS(arr)
Reference< XComponentContext > getProcessComponentContext()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
Constant values shared between i18npool and, for example, the number formatter.
const sal_Int16 Multiplier_Hangul_ko
static sal_uInt16 SeparatorChar[]
static bool natNumIn(sal_Int16 num, const sal_Int16 natnum[], sal_Int16 len)
const sal_Int16 Multiplier_Lower_zh_TW
static void makeHebrewNumber(sal_Int64 value, OUStringBuffer &output, bool isLast, bool useGeresh)
const sal_Int16 NumberChar_Upper_zh_TW
constexpr OUStringLiteral implementationName
const sal_Int16 ExponentCount_7_CJK
const sal_Int16 ExponentCount_6_CJK
const sal_Int16 NumberChar_lo
static OUString AsciiToNative(const OUString &inStr, sal_Int32 nCount, Sequence< sal_Int32 > *pOffset, const Number *number)
const sal_Unicode MultiplierChar_7_CJK[][ExponentCount_7_CJK]
const sal_Int16 NumberChar_bn
const sal_Int16 NumberChar_or
const sal_Int16 NumberChar_kn
static bool AsciiToNative_numberMaker(const sal_Unicode *str, sal_Int32 begin, sal_Int32 len, sal_Unicode *dst, sal_Int32 &count, sal_Int16 multiChar_index, Sequence< sal_Int32 > *pOffset, sal_Int32 startPos, const Number *number, const sal_Unicode *numberChar)
const sal_Int16 Multiplier_Traditional_ja
static void makeCyrillicNumber(sal_Int64 value, OUStringBuffer &output, bool addTitlo)
const sal_Unicode MinusChar[]
const sal_Int16 NumberChar_ne
static OUString getCyrillicNativeNumberString(const OUString &aNumberString)
static OUString getHebrewNativeNumberString(const OUString &aNumberString, bool useGeresh)
const sal_Int16 NumberChar_mr
const sal_Int16 NumberChar_Traditional_ja
const sal_Int16 NumberChar_bo
const sal_Int16 NumberChar_cu
const sal_Int16 NumberChar_dz
const sal_Unicode MultiplierChar_2_CJK[][ExponentCount_2_CJK]
const sal_Int16 NumberChar_Upper_zh
const sal_Int16 Multiplier_Count
const sal_Int16 NumberChar_gu
static sal_Unicode DecimalChar[]
const sal_Int16 NumberChar_ml
static OUString AsciiToNativeChar(const OUString &inStr, sal_Int32 nCount, Sequence< sal_Int32 > *pOffset, sal_Int16 number)
const sal_Int16 MultiplierExponent_6_CJK[ExponentCount_6_CJK]
const sal_Unicode thousands_last[]
const sal_Int16 ExponentCount_2_CJK
const sal_Unicode cyrillicTitlo
const sal_Int16 NumberChar_my
const sal_Int16 NumberChar_ta
const sal_Int16 MultiplierExponent_7_CJK[ExponentCount_7_CJK]
const sal_Int16 NumberChar_HalfWidth
const sal_Unicode gershayim
const sal_Int16 Multiplier_Upper_zh_TW
const sal_Int16 NumberChar_Indic_ar
const sal_Int16 NumberChar_FullWidth
const sal_Int16 NumberChar_Lower_zh
const sal_Int16 NumberChar_Modern_ja
const sal_Unicode cyrillicThousandsMark
const sal_Unicode thousand[]
const sal_Unicode cyrillicTen
const sal_Int16 Multiplier_Upper_zh
const sal_Unicode MultiplierChar_6_CJK[][ExponentCount_6_CJK]
const sal_Int16 Multiplier_Lower_zh
const sal_Int16 MultiplierExponent_2_CJK[ExponentCount_2_CJK]
const sal_Int16 Multiplier_Lower_ko
const sal_Unicode thousands[]
const sal_Int16 NumberChar_te
const sal_Int16 NumberChar_Count
const sal_Int16 NumberChar_Upper_ko
const sal_Int16 NumberChar_hi
const sal_Unicode NumberChar[][10]
HebrewNumberChar const HebrewNumberCharArray[]
CyrillicNumberChar const CyrillicNumberCharArray[]
const sal_Int16 NumberChar_Hangul_ko
const sal_Int16 NumberChar_Lower_ko
const sal_Int16 NumberChar_mn
const sal_Int16 Multiplier_Modern_ja
const sal_Int16 NumberChar_th
const sal_Int16 NumberChar_he
const sal_Int16 NumberChar_pa
const sal_Int16 NumberChar_EastIndic_ar
const sal_Int16 NumberChar_km
const sal_Int16 Multiplier_Upper_ko
constexpr bool starts_with(std::basic_string_view< charT, traits > sv, std::basic_string_view< charT, traits > x) noexcept
enumrange< T >::Iterator begin(enumrange< T >)
#define NUMBER_OMIT_ONE_CHECK(bit)
sal_Unicode ThousandSeparator
#define NUMBER_OMIT_ZERO_ONE
#define NUMBER_OMIT_ONLY_ZERO
#define NUMBER_OMIT_ZERO_ONE_67
sal_Unicode DecimalSeparator
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_i18n_NativeNumberSupplier_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)