summaryrefslogtreecommitdiff
path: root/editeng
diff options
context:
space:
mode:
authorHossein <hossein@libreoffice.org>2022-03-15 09:07:59 +0100
committerMike Kaganski <mike.kaganski@collabora.com>2022-03-15 13:50:38 +0100
commit3cc41346f5529026d7d38f2863ae3d84948e6ab7 (patch)
tree1808a6d5cf5cf19552572ad37f584876cc485a53 /editeng
parent8e6462571bb4cb872f607b4ac9dfde7f43b79ac3 (diff)
Better CreateRomanString() to create Roman numbers
The previous implementation of CreateRomanString() was complex and was using various tricks and pointers to create Roman representation of the integers. The new implementation is simpler, and easier to understand. Change-Id: Ibda4f8cfab02fd360e718736c957b3e04110c57a Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131573 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'editeng')
-rw-r--r--editeng/source/items/numitem.cxx48
1 files changed, 11 insertions, 37 deletions
diff --git a/editeng/source/items/numitem.cxx b/editeng/source/items/numitem.cxx
index 7d6fa5fe23ae..c4220c78a4b5 100644
--- a/editeng/source/items/numitem.cxx
+++ b/editeng/source/items/numitem.cxx
@@ -539,48 +539,22 @@ Size SvxNumberFormat::GetGraphicSizeMM100(const Graphic* pGraphic)
OUString SvxNumberFormat::CreateRomanString( sal_Int32 nNo, bool bUpper )
{
- nNo %= 4000; // more can not be displayed
-// i, ii, iii, iv, v, vi, vii, vii, viii, ix
-// (Dummy),1000,500,100,50,10,5,1
- const char *cRomanArr = bUpper
- ? "MDCLXVI--" // +2 Dummy entries!
- : "mdclxvi--"; // +2 Dummy entries!
-
OUStringBuffer sRet;
- sal_uInt16 nMask = 1000;
- while( nMask )
- {
- sal_uInt8 nNumber = sal_uInt8(nNo / nMask);
- sal_uInt8 nDiff = 1;
- nNo %= nMask;
- if( 5 < nNumber )
- {
- if( nNumber < 9 )
- sRet.append(*(cRomanArr-1));
- ++nDiff;
- nNumber -= 5;
- }
- switch( nNumber )
+ constexpr char romans[][13] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
+ constexpr sal_Int32 values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
+
+ for (size_t i = 0; i < std::size(romans); ++i)
+ {
+ while(nNo - values[i] >= 0)
{
- case 3: { sRet.append(*cRomanArr); [[fallthrough]]; }
- case 2: { sRet.append(*cRomanArr); [[fallthrough]]; }
- case 1: { sRet.append(*cRomanArr); }
- break;
-
- case 4: {
- sRet.append(*cRomanArr);
- sRet.append(*(cRomanArr-nDiff));
- }
- break;
- case 5: { sRet.append(*(cRomanArr-nDiff)); }
- break;
+ sRet.appendAscii(romans[i]);
+ nNo -= values[i];
}
-
- nMask /= 10; // for the next decade
- cRomanArr += 2;
}
- return sRet.makeStringAndClear();
+
+ return bUpper ? sRet.makeStringAndClear()
+ : sRet.makeStringAndClear().toAsciiLowerCase();
}
void SvxNumberFormat::SetListFormat(const OUString& rPrefix, const OUString& rSuffix, int nLevel)