你可以作爲一個選項,創建一個包含兩個字符(像std::pair<char,char>
一個新的數據類型,並定義算術這一點。
不過,我認爲這將是更簡單的使用int
(或unsigned int
保持)爲計數和算術,和定義一個函數to_col_heading
其轉化的整數成Excel中的一個/兩個字符的列標題:
#include <string>
#include <iostream>
#include <stdexcept>
#include <iterator>
/* This is the function that performs
the transformation. */
std::string to_col_heading(unsigned i)
{
if (i > 26+26*26)
throw std::overflow_error
("Value too large for transformation into Excel column heading.");
char char1 = 'A' + (i/26) - 1;
char char2 = 'A' + (i % 26);
if (char1 < 'A')
return std::string(&char2,&char2 + 1);
else
return std::string(&char1,&char1 + 1) + char2;
}
int main()
{
std::ostream_iterator<std::string> out(std::cout,", ");
for (unsigned i = 0 ; i < 26+26*26 ; i += 5)
*out = to_col_heading(i);
std::cout << std::endl;
return 0;
}
輸出:
A, F, K, P, U, Z, AE, AJ, AO, AT, AY, BD, BI, BN, BS, BX, CC, CH, CM, CR, CW, DB, DG, DL, DQ, DV, EA, EF, EK, EP, EU, EZ, FE, FJ, FO, FT, FY, GD, GI, GN, GS, GX, HC, HH, HM, HR, HW, IB, IG, IL, IQ, IV, JA, JF, JK, JP, JU, JZ, KE, KJ, KO, KT, KY, LD, LI, LN, LS, LX, MC, MH, MM, MR, MW, NB, NG, NL, NQ, NV, OA, OF, OK, OP, OU, OZ, PE, PJ, PO, PT, PY, QD, QI, QN, QS, QX, RC, RH, RM, RR, RW, SB, SG, SL, SQ, SV, TA, TF, TK, TP, TU, TZ, UE, UJ, UO, UT, UY, VD, VI, VN, VS, VX, WC, WH, WM, WR, WW, XB, XG, XL, XQ, XV, YA, YF, YK, YP, YU, YZ, ZE, ZJ, ZO, ZT, ZY,
要支持最多3個(按字母順序)列標題的數字,下面的函數可以工作。它完全分開處理前26個值,以簡化其餘的計算。我還介紹了一些靜態常量,以更加一致的方式處理26的冪數。對於三位數字,您需要26 ,,和26 ,但是系統可以擴展到覆蓋任何數字的數字。
我確定有一種方法可以優化速度;這不是這裏的重點。
std::string to_col_heading(unsigned i)
{
const static unsigned pow1 = 26;
const static unsigned pow2 = 26*26;
const static unsigned max = pow1 + pow2 + 26 * pow2;
if (i < pow1)
{
char c = 'A' + i % pow1;
return std::string(&c,&c+1);
}
if (i > max)
throw std::overflow_error
("Value too large for transformation into Excel column heading.");
i -= pow1;
char char1 = 'A' + (i/pow2) - 1;
char char2 = 'A' + (i%pow2)/pow1;
char char3 = 'A' + i % pow1;
if (char1 < 'A')
return std::string(&char2,&char2 + 1) + char3;
else
return std::string(&char1,&char1 + 1) + char2 + char3;
}
爲什麼這種尷尬的格式?爲什麼要阻止普通文本的報價?我很樂意編輯這個,但我想知道這個格式背後是否有任何意圖。 – jogojapan
這是你想要的格式嗎?如果沒有,只需將其回滾。 – jogojapan
@jogojapan謝謝。現在看起來很正常 – qwr