GetListItemText_Default.cs 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. // Copyright (c) Microsoft. All rights reserved.
  2. // Licensed under the MIT license. See LICENSE file in the project root for full license information.
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. namespace OpenXmlPowerTools
  8. {
  9. class ListItemTextGetter_Default
  10. {
  11. private static string[] RomanOnes =
  12. {
  13. "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"
  14. };
  15. private static string[] RomanTens =
  16. {
  17. "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"
  18. };
  19. private static string[] RomanHundreds =
  20. {
  21. "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM", "M"
  22. };
  23. private static string[] RomanThousands =
  24. {
  25. "", "M", "MM", "MMM", "MMMM", "MMMMM", "MMMMMM", "MMMMMMM", "MMMMMMMM",
  26. "MMMMMMMMM", "MMMMMMMMMM"
  27. };
  28. private static string[] OneThroughNineteen = {
  29. "one", "two", "three", "four", "five", "six", "seven", "eight",
  30. "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
  31. "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
  32. };
  33. private static string[] Tens = {
  34. "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy",
  35. "eighty", "ninety"
  36. };
  37. private static string[] OrdinalOneThroughNineteen = {
  38. "first", "second", "third", "fourth", "fifth", "sixth",
  39. "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth",
  40. "thirteenth", "fourteenth", "fifteenth", "sixteenth",
  41. "seventeenth", "eighteenth", "nineteenth"
  42. };
  43. private static string[] OrdinalTenths = {
  44. "tenth", "twentieth", "thirtieth", "fortieth", "fiftieth",
  45. "sixtieth", "seventieth", "eightieth", "ninetieth"
  46. };
  47. public static string GetListItemText(string languageCultureName, int levelNumber, string numFmt)
  48. {
  49. if (numFmt == "none")
  50. {
  51. return "";
  52. }
  53. if (numFmt == "decimal")
  54. {
  55. return levelNumber.ToString();
  56. }
  57. if (numFmt == "decimalZero")
  58. {
  59. if (levelNumber <= 9)
  60. return "0" + levelNumber.ToString();
  61. else
  62. return levelNumber.ToString();
  63. }
  64. if (numFmt == "upperRoman")
  65. {
  66. int ones = levelNumber % 10;
  67. int tens = (levelNumber % 100) / 10;
  68. int hundreds = (levelNumber % 1000) / 100;
  69. int thousands = levelNumber / 1000;
  70. return RomanThousands[thousands] + RomanHundreds[hundreds] +
  71. RomanTens[tens] + RomanOnes[ones];
  72. }
  73. if (numFmt == "lowerRoman")
  74. {
  75. int ones = levelNumber % 10;
  76. int tens = (levelNumber % 100) / 10;
  77. int hundreds = (levelNumber % 1000) / 100;
  78. int thousands = levelNumber / 1000;
  79. return (RomanThousands[thousands] + RomanHundreds[hundreds] +
  80. RomanTens[tens] + RomanOnes[ones]).ToLower();
  81. }
  82. if (numFmt == "upperLetter")
  83. {
  84. int levelNumber2 = levelNumber % 780;
  85. if (levelNumber2 == 0)
  86. levelNumber2 = 780;
  87. string a = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  88. int c = (levelNumber2 - 1) / 26;
  89. int n = (levelNumber2 - 1) % 26;
  90. char x = a[n];
  91. return "".PadRight(c + 1, x);
  92. }
  93. if (numFmt == "lowerLetter")
  94. {
  95. int levelNumber3 = levelNumber % 780;
  96. if (levelNumber3 == 0)
  97. levelNumber3 = 780;
  98. string a = "abcdefghijklmnopqrstuvwxyz";
  99. int c = (levelNumber3 - 1) / 26;
  100. int n = (levelNumber3 - 1) % 26;
  101. char x = a[n];
  102. return "".PadRight(c + 1, x);
  103. }
  104. if (numFmt == "ordinal")
  105. {
  106. string suffix;
  107. if (levelNumber % 100 == 11 || levelNumber % 100 == 12 ||
  108. levelNumber % 100 == 13)
  109. suffix = "th";
  110. else if (levelNumber % 10 == 1)
  111. suffix = "st";
  112. else if (levelNumber % 10 == 2)
  113. suffix = "nd";
  114. else if (levelNumber % 10 == 3)
  115. suffix = "rd";
  116. else
  117. suffix = "th";
  118. return levelNumber.ToString() + suffix;
  119. }
  120. if (numFmt == "cardinalText")
  121. {
  122. string result = "";
  123. int t1 = levelNumber / 1000;
  124. int t2 = levelNumber % 1000;
  125. if (t1 >= 1)
  126. result += OneThroughNineteen[t1 - 1] + " thousand";
  127. if (t1 >= 1 && t2 == 0)
  128. return result.Substring(0, 1).ToUpper() +
  129. result.Substring(1);
  130. if (t1 >= 1)
  131. result += " ";
  132. int h1 = (levelNumber % 1000) / 100;
  133. int h2 = levelNumber % 100;
  134. if (h1 >= 1)
  135. result += OneThroughNineteen[h1 - 1] + " hundred";
  136. if (h1 >= 1 && h2 == 0)
  137. return result.Substring(0, 1).ToUpper() +
  138. result.Substring(1);
  139. if (h1 >= 1)
  140. result += " ";
  141. int z = levelNumber % 100;
  142. if (z <= 19)
  143. result += OneThroughNineteen[z - 1];
  144. else
  145. {
  146. int x = z / 10;
  147. int r = z % 10;
  148. result += Tens[x - 1];
  149. if (r >= 1)
  150. result += "-" + OneThroughNineteen[r - 1];
  151. }
  152. return result.Substring(0, 1).ToUpper() +
  153. result.Substring(1);
  154. }
  155. if (numFmt == "ordinalText")
  156. {
  157. string result = "";
  158. int t1 = levelNumber / 1000;
  159. int t2 = levelNumber % 1000;
  160. if (t1 >= 1 && t2 != 0)
  161. result += OneThroughNineteen[t1 - 1] + " thousand";
  162. if (t1 >= 1 && t2 == 0)
  163. {
  164. result += OneThroughNineteen[t1 - 1] + " thousandth";
  165. return result.Substring(0, 1).ToUpper() +
  166. result.Substring(1);
  167. }
  168. if (t1 >= 1)
  169. result += " ";
  170. int h1 = (levelNumber % 1000) / 100;
  171. int h2 = levelNumber % 100;
  172. if (h1 >= 1 && h2 != 0)
  173. result += OneThroughNineteen[h1 - 1] + " hundred";
  174. if (h1 >= 1 && h2 == 0)
  175. {
  176. result += OneThroughNineteen[h1 - 1] + " hundredth";
  177. return result.Substring(0, 1).ToUpper() +
  178. result.Substring(1);
  179. }
  180. if (h1 >= 1)
  181. result += " ";
  182. int z = levelNumber % 100;
  183. if (z <= 19)
  184. result += OrdinalOneThroughNineteen[z - 1];
  185. else
  186. {
  187. int x = z / 10;
  188. int r = z % 10;
  189. if (r == 0)
  190. result += OrdinalTenths[x - 1];
  191. else
  192. result += Tens[x - 1];
  193. if (r >= 1)
  194. result += "-" + OrdinalOneThroughNineteen[r - 1];
  195. }
  196. return result.Substring(0, 1).ToUpper() +
  197. result.Substring(1);
  198. }
  199. if (numFmt == "01, 02, 03, ...")
  200. {
  201. return string.Format("{0:00}", levelNumber);
  202. }
  203. if (numFmt == "001, 002, 003, ...")
  204. {
  205. return string.Format("{0:000}", levelNumber);
  206. }
  207. if (numFmt == "0001, 0002, 0003, ...")
  208. {
  209. return string.Format("{0:0000}", levelNumber);
  210. }
  211. if (numFmt == "00001, 00002, 00003, ...")
  212. {
  213. return string.Format("{0:00000}", levelNumber);
  214. }
  215. if (numFmt == "bullet")
  216. return "";
  217. if (numFmt == "decimalEnclosedCircle")
  218. {
  219. if (levelNumber >= 1 && levelNumber <= 20)
  220. {
  221. // 9311 + levelNumber
  222. var s = new string(new[] { (char)(9311 + levelNumber) });
  223. return s;
  224. }
  225. return levelNumber.ToString();
  226. }
  227. return levelNumber.ToString();
  228. }
  229. }
  230. }