我有一个 C++ 程序,它接受一个整数并将其转换为小写和大写字母,类似于 excel 将列索引转换为列号的做法,但也包括小写字母。
#include <string>
#include <iostream>
#include <climits>
using namespace std;
string ConvertNum(unsigned long v)
{
char const digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
size_t const base = sizeof(digits) - 1;
char result[sizeof(unsigned long)*CHAR_BIT + 1];
char* current = result + sizeof(result);
*--current = '\0';
while (v != 0) {
v--;
*--current = digits[v % base];
v /= base;
}
return current;
}
// for testing
int main()
{
cout<< ConvertNum(705);
return 0;
}
我需要 vba 函数将其反转回原始数字。我对 C++ 没有太多经验,所以我无法找出在 vba 中反转这个的逻辑。任何人都可以帮忙吗?
更新1:我不需要已经编写的代码,只需要一些逻辑上的帮助来反转它。我会尝试自己将逻辑转换为代码。
更新2:根据答案中提供的精彩解释和帮助,很明显代码没有将数字转换为通常的base52,这是误导性的。因此,我更改了函数名称,以消除 future 读者的困惑。
最佳答案
编辑:由下面描述的代码转换为十进制的字符串格式不是标准的 base-52 架构。该架构不包含 0 或任何其他数字。因此,不应按原样使用此代码将标准的 base-52 值转换为十进制。
好的。这是基于根据长字符串中的位置转换单个字符。该字符串是:
chSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
InStr() 函数告诉我们 A 位于位置 1,Z 位于位置26 并且a 位于27 位置。所有字符都以相同的方式转换。
我使用这个而不是 Asc() 因为 Asc() 大小写字母之间有一个间隙。
最低有效字符的值乘以 52^0
下一个字符的值乘以 52^1
第三个字符的值乘以 52^3,依此类推。代码:
Public Function deccimal(s As String) As Long
Dim chSET As String, arr(1 To 52) As String
Dim L As Long, i As Long, K As Long, CH As String
chSET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
deccimal = 0
L = Len(s)
K = 0
For i = L To 1 Step -1
CH = Mid(s, i, 1)
deccimal = deccimal + InStr(1, chSET, CH) * (52 ^ K)
K = K + 1
Next i
End Function
一些例子:
注意:
这不是碱基通常的编码方式。通常碱基以 0 开头,并允许在任何编码值的位置上出现 0。在我之前的所有与此类似的 UDF() 中,chSET
中的第一个字符是 0,我必须使用 (InStr(1, chSET, CH) - 1) * (52 ^ K)
关于c++ - VBA将Excel样式列名称(具有52个字符集)转换为原始数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37013618/